2015-11-02 22 views
7

リーフレットのマーカー(JSONデータから生成される)の間に線を挿入しようとしています。私は例を見ましたが、JSONデータでは機能しません。私はマーカーを見ることができますが、線は現れません。 リーフレットのマーカー間の線を描く

enter image description here

var style = { 
    color: 'red', 
    fillColor: "#ff7800", 
    opacity: 1.0, 
    fillOpacity: 0.8, 
    weight: 2 
}; 

$.getJSON('./server?id_dispositivo=' + id_device + '', function(data) { 
    window.geojson = L.geoJson(data, { 
    onEachFeature: function (feature, layer) { 
     var Icon = L.icon({ 
     iconUrl: './images/mymarker.png', 
     iconSize: [18, 28], // size of the icon 
     style: style, 
     }); 
     layer.setIcon(Icon); 
     layer.bindPopup(feature.properties.date + '<br />' + feature.properties.id); 
    } 
    }); 
}); 
map.addLayer(geojson); 
私のJSONデータ:

{ 
    "type": "FeatureCollection", 
    "features": [ 
    { 
     "type": "Feature", 
     "geometry": { 
     "type": "Point", 
     "coordinates": [ 
      -70.219841, 
      8.6310997 
     ] 
     }, 
     "properties": { 
     "id": 336, 
     "id_user": 1, 
     "id_device": 1, 
     "timestamp": 1446571154, 
     "date": "12:49PM 03-11-2015", 
     "Latitude": 8.6310997, 
     "Longitude": -70.219841, 
     "speedKPH": 0, 
     "heading": "", 
     "Name": "N\/D", 
     "City": "N\/D", 
     "estatus": "Stop" 
     } 
    } 
    ] 
} 
+0

コードを読み取り可能にするための書式設定についてはどうでしょうか。あなたがそれをやることが大変な努力であれば、誰かがあなたがそれを働かせるように努力することはおそらく多大な努力です。適切な問題の説明も、エラーと何が起こっているの説明が含まれて1つを助けてくれる – charlietfl

+0

申し訳ありませんが、私の英語は良くありません、何が起こったか、あなたに感謝します。 – user4131013

+0

あなたのjsonに問題があるようです。 http://jsonlint.com/にプラグインすると、エラーがあることが示されます。 –

答えて

2

元のGeoJSONレイヤーまたは結果のL.GeoJsonレイヤーを反復してポリラインジオメトリを生成する方法はたくさんあります。ここでL.polylineに渡すことができる座標の配列にポイントのL.geoJson層を向けるだろう1つの単純な機能は次のとおりです。

function connectTheDots(data){ 
    var c = []; 
    for(i in data._layers) { 
     var x = data._layers[i]._latlng.lat; 
     var y = data._layers[i]._latlng.lng; 
     c.push([x, y]); 
    } 
    return c; 
} 

、ここでは、いくつかの合成にGeoJSONデータ上の仕事でそれを示すフィドルです:

http://fiddle.jshell.net/nathansnider/36twhxux/

あなたにGeoJSONデータは点のみのジオメトリが含まれていると仮定すると、あなたがそうのようなあなたの$.getJSON成功関数内window.geojsonを定義した後、あなたはそれを使用することができるはずです。

pathCoords = connectTheDots(window.geojson); 
var pathLine = L.polyline(pathCoords).addTo(map) 

GeoJSONデータがより複雑な場合は、ジオメトリタイプなどを確認するためにいくつかの条件を追加する必要がありますが、これは少なくともどのように進めるかについての一般的な考えが必要です。

+0

'data._layers'オブジェクトのプロパティ:繰り返しの順序はJS仕様に従って保証されていません。結果として得られるポリラインは任意の順序でポイントを結ぶことができます...私が行う機会があったすべてのテストでも一貫した順序が得られます。 – ghybs

+0

私が欲しいのですが、このオプションを追加するには何が必要ですか?{color: 'red'、weight:10、opacity:.7、dashArray:'20、15 '、lineJoin:' round '} – user4131013

+0

Whe useこのタラe pathCoords = connectTheDots(window.geojson); var pathLine = Lポリライン(pathCoords).addTo(map)私はエラーconnectTheDotsが定義されていません – user4131013

1

EDIT:

ネイサンのアイデアは、あなたがポリライン(あなたのマーカー間のラインを構築する必要がありますという意味では正しいです)あなた自身。

厳密にするには、ポイントのリストが配列のままである(配列の順序が取得したい線の順番であると仮定して)データを使用する必要があります。つまり、GeoJSONデータを直接操作する必要があります。

たとえば、あなたはどうなる:

function connectDots(data) { 
    var features = data.features, 
     feature, 
     c = [], 
     i; 

    for (i = 0; i < features.length; i += 1) { 
     feature = features[i]; 
     // Make sure this feature is a point. 
     if (feature.geometry === "Point") { 
      c.push(feature.geometry.coordinates); 
     } 
    } 
    return c; 
} 

L.polyline(connectDots(data)).addTo(map); 

にGeoJSONデータはベクトルなどのポリライン、ポリゴン、ため、ポイント機能のマーカーにリーフレットによって変換されます。 リーフレットtutorialおよびreferenceを参照してください。

あなたはリーフレットがベクトルのスタイルを設定する方法を指定したい場合は、あなたが実際に(最初の行にあなたのstyle変数のように)path optionsを保持するオブジェクトを構成する必要がありますが、あなたはあなたのL.geoJson層のstyle optionとしてそれを与える必要があります、アイコンの中ではありません。

マーカーのリーフレットのスタイル設定方法を指定する場合は、実際にはポイントフィーチャにのみ適用される特定のアイコンを設定することができます。 pointToLayer optionをよく使うべきです。コードは実際には点にのみ適用されるので、ベクトルに適用するのではなく(例:setIconのメソッドを持たない)。

最後に、ベクターとマーカーの両方に適用されるアクションを実行する場合は、たとえばonEachFeature optionを使用してポップアップをバインドします。

だからあなたのようなもので終わるでしょう:

var myIcon = L.icon({ 
    iconUrl: './images/mymarker.png', 
    iconSize: [18, 28] 
}); 

var geojson = L.geoJson(data, { 

    style: style, // only applies to vectors. 

    // only applies to point features 
    pointToLayer: function(feature, latlng) { 
     return L.marker(latlng, {icon: myIcon}); 
    }, 

    // will be run for each feature (vectors and points) 
    onEachFeature: function(feature, layer) { 
     layer.bindPopup(feature.properties.date + '<br />' + feature.properties.id); 
    } 

}); 

としては、コメントで指摘あなたが他の人に助けを求める時はいつでも、あなたはそれらのタスクが容易になるだろう(それゆえ、あなたがより良く、より速くなるだろうサポート)あなたが問題を適切に述べる時間を取って、間違っていることの説明/スクリーンショットといくつかのきれいなコードを投稿すると。クライアントサイドコードのための非常に良い習慣は、たとえばjsFiddleに問題を再現することです。

+0

ありがとうございました私の質問をより良く説明する画像を入れてくれました – user4131013

+0

これは私が元々確かに理解していたものとは非常に異なっています! GeoJSONにデータがないことがわかりましたが(表示していないので、わかりません)あなたはポイントデータだけを持っているようですが、ポリラインはありません。だから、あなたはおそらくポイントオーダーが正しいと仮定してパスを自分で構築しなければならないでしょう... – ghybs

+0

もし私がこのオプションを追加してくれてありがとうございましたあなたにもう一度感謝する必要があるもの{ color: 'red'、 weight :10、 不透明度:.7、 dashArray:'20,15 '、 lineJoin:' round ' } – user4131013

関連する問題