2016-06-21 1 views
0

私は車両に関連付けられたパスを描くためにリーフレットを使用しています。各ビークルパスは、レイヤーグループで構成され、パス内に異なる色を持つことができます(色は温度に依存します)。リーフレットはレイヤーグループの特定の色の点を表示しません

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の提案を統合しましたが、問題はまだありません。

+1

次の例では、読み少し難しいですが、私はあなたに '_leaflet_id'を割り当てていることに気付きました。あなたがするはずのものではなく、うまくいくかもしれませんが、エラーを追跡するのが難しいかもしれません。 id-collisionsがありますか? – Jieter

+0

私はこれを使って、1つの車両に関連付けられているlayerGroupを簡単に見つけることができました(すでに存在しない場合は、車両用に作成する 'multi_polyline')。これは、各車両層で行われますが、サブレイヤレベル( 'multi_polyline'に追加するもの)では行われません。 私はid-collisionsを持っているとは思わないが、私はそのようなことについて何のエラーもなく、間違ったパスにポイントが追加されない。私はそれについてどうすればよいかわからないことを認めなければならない。 しかし、私は '_leaflet_id'を割り当てずに、各車両の異なるレイヤーを扱う方法を変えようとします。 –

+1

リーフレットは' _leaflet_id'sをキーとしてオブジェクトにレイヤーを保持します。レイヤーが消えてしまった場合は、IDがもはやユニークではないため、何かが上書きされると思われます。 – Jieter

答えて

0

最後に、車両レイヤーのタイプをL.layerGroupからL.geoJsonに変更するという考えに達しました。そしてそれは働いた!なぜか分からなくても。

Git repositoryを私のソリューションで更新しました。


(以前私もmulti_polyline._leaflet_id = id;をやって立ち止まったし、今L.Util.setOptions(vehicleLayer, {vehicle_id: id});を使用してきたコメントで言ったように。私は道でvehicleLayerにmulti_polylineに改称しました。)

+0

あなたのソリューションを何かに変換するのに少し時間がかかりました(作業に気づいてから作業を止めてから作業を中止しました)。 – Jieter

+0

'L.LatLng'にはdistanceToメソッドがあり、' measure'関数そうです。完全なlatlngオブジェクトを使用すると、コードの乱雑さが軽減されます。 – Jieter

+0

あなたの例は、18kのJSコードでは厳密ではありませんでした。 – Jieter

0

あなたの例ではまだmulti_polyline._leaflet_id = id;が表示されていますが、L.Util.setOptionsを使用して自分の内部識別子(車両IDなど)をマークしていませんか?

+0

私はこのコードを手にしたとき、このようにしてL.Util.setOptionsについて知りませんでした。私はそれを使用するために私のコードを変更しましたが、問題はまだここにあります。私はGitHubの例を使って投稿を更新しました。 –

+0

また、別の実装を作成する代わりに、この機能(https://iosphere.github.io/Leaflet.hotline/demo/)に事前ビルドされたプラグインを使用できない特定の理由がありますか? – snkashis

+0

私はこのプラグインの存在を知らなかった。私はそれを試してみました。それはかなり良いことですが、それは私のために少し重いようです(リアルタイムデータを表示する数分後に地図/ブラウザが実際に遅くなります)、またマップコントロール(マップをドラッグするなど)にいくつかの問題の原因にもなります。 –

関連する問題