私は車両に関連付けられたパスを描くためにリーフレットを使用しています。各ビークルパスは、レイヤーグループで構成され、パス内に異なる色を持つことができます(色は温度に依存します)。リーフレットはレイヤーグループの特定の色の点を表示しません
Object {color: "#cc0099", legende: "<someHtmlCode.TheSameForEveryPieceOfData>", data: {lat: 48.77905, lon: -3.44891}, c2a_id: "vehicle_1"}
私の問題は、色の特定の値(青の異なる色合い)のパスが描かれていないということである:(クロムのデバッグコンソールで表示されるように)データは、次の形式でウェブソケットから受信されますマップ上には表示されますが、他のマップでは適切に機能します。ズームレベルを変更すると、すべてが表示されます(使用しているすべての色)。
2つ目の画像に青色が表示されていることがわかります(前のパスよりも)。ズームレベルを変更する必要はなく、溺れているはずです。
データをレイヤーに追加するためのコードです。
var idAllLayers;
if (_data != null && _data['data'] != null) {
current_lon = _data['data']['lon'];
current_lat = _data['data']['lat'];
// checking if there is already a layer associated to the vehicle _id_
if (!(this.layer_group_real_time.hasLayer(id))) {
var multi_polyline = L.layerGroup([]); //create a layer for this vehicle
multi_polyline._leaflet_id = id;
//add a sublayer to this one (for a sub path to have different colors)
multi_polyline.addLayer(this.newLayer(id, _data['color']));
this.layer_group_real_time.addLayer(multi_polyline);
}
// get the differents layers of the layerGroup for the vehicle _id_
idAllLayers = this.layer_group_real_time.getLayer(id).getLayers();
currentLayerLatLng = idAllLayers[idAllLayers.length-1].getLatLngs();
if (current_lat != null && current_lon != null) {
// if previous elements have been stored
if (this.previousDataPoints[id] != null && this.previousColor[id] != null) {
oldDataPoint = this.previousDataPoints[id]['data'];
delta = this.measure(current_lat, current_lon, oldDataPoint['lat'], oldDataPoint['lon']);
if (delta > MAX_DIST || _data['color'] != this.previousColor[id]) {
if (delta < MAX_DIST){ // case where color has changed but we still need to add the point to the previous subpath
currentLayerLatLng.push(L.latLng(current_lat, current_lon));
}
this.layer_group_real_time.getLayer(id).addLayer(this.newLayer(id, _data['color']));
idAllLayers = this.layer_group_real_time.getLayer(id).getLayers();
currentLayerLatLng = idAllLayers[idAllLayers.length - 1].getLatLngs();
}
}
currentLayerLatLng.push(L.latLng(current_lat, current_lon));
idAllLayers[idAllLayers.length - 1].setLatLngs(currentLayerLatLng); // setting up the new coords
this.previousDataPoints[id] = _data;
this.previousColor[id] = _data['color'];
}
}
newLayer: function (_id, _color) {
var nl = L.polyline([],
{
color: _color,
opacity: 0.7,
stroke: true,
weight: 6,
vehicle_id: _id
});
nl.on('click', this.traceOnClick);
return nl;
},
ここで[EDIT]
は、私がGithubにアップロードした(少なくとも私はそれがあると思います) "最小限の完全かつ検証例" です。いくつかのパスが表示されているマップが含まれています。ロード時に表示されるパスは緑とピンクになりますが、ズームレベルを変更すると青のパスが表示されます。 @Jieterと@snkashisの提案を統合しましたが、問題はまだありません。
次の例では、読み少し難しいですが、私はあなたに '_leaflet_id'を割り当てていることに気付きました。あなたがするはずのものではなく、うまくいくかもしれませんが、エラーを追跡するのが難しいかもしれません。 id-collisionsがありますか? – Jieter
私はこれを使って、1つの車両に関連付けられているlayerGroupを簡単に見つけることができました(すでに存在しない場合は、車両用に作成する 'multi_polyline')。これは、各車両層で行われますが、サブレイヤレベル( 'multi_polyline'に追加するもの)では行われません。 私はid-collisionsを持っているとは思わないが、私はそのようなことについて何のエラーもなく、間違ったパスにポイントが追加されない。私はそれについてどうすればよいかわからないことを認めなければならない。 しかし、私は '_leaflet_id'を割り当てずに、各車両の異なるレイヤーを扱う方法を変えようとします。 –
リーフレットは' _leaflet_id'sをキーとしてオブジェクトにレイヤーを保持します。レイヤーが消えてしまった場合は、IDがもはやユニークではないため、何かが上書きされると思われます。 – Jieter