use*_*013 17 javascript geojson leaflet
我试图在传单中插入标记之间的行(从JSON数据生成).我看到了一个示例,但它不适用于JSON数据.我可以看到标记,但没有出现任何线条.
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);
Run Code Online (Sandbox Code Playgroud)
我的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"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
nat*_*der 10
有许多方法可以通过迭代原始GeoJSON或生成的L.GeoJson图层来生成折线几何图形.这是一个简单的函数,它将L.geoJson一层点转换为一个坐标数组,可以传递给L.polyline:
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;
}
Run Code Online (Sandbox Code Playgroud)
这是一个小提琴,展示了一些合成的GeoJSON数据:
http://fiddle.jshell.net/nathansnider/36twhxux/
假设您的GeoJSON数据仅包含点几何,您应该能够window.geojson在$.getJSON成功函数中定义之后使用它,如下所示:
pathCoords = connectTheDots(window.geojson);
var pathLine = L.polyline(pathCoords).addTo(map)
Run Code Online (Sandbox Code Playgroud)
如果您的GeoJSON数据更复杂,您可能需要添加一些条件来检查几何类型等,但这至少应该让您大致了解如何继续.
编辑:
Nathan 的想法是正确的,因为您必须自己构建多段线(标记之间的线)。
严格来说,您必须在点列表仍然是数组时使用您的数据(并假设数组顺序是您想要获取的线连接顺序)。这意味着您必须直接处理您的 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);
Run Code Online (Sandbox Code Playgroud)
GeoJSON 数据将由 Leaflet 转换为折线、多边形等的向量,以及点要素的标记。请参阅传单教程和参考。
如果要指定单张应该怎样风格的载体,你的确应该补上保持对象的路径选项(如您style在第一行的变量),但你应该把它作为style选择你的L.geoJson层,而不是里面的图标。
当您想指定 Leaflet 应如何设置标记的样式时,您确实可以设置一个特定的图标,该图标仅适用于点特征。您应该更好地使用pointToLayeroption,因为代码将真正应用于点,而不是尝试将其应用于向量(setIcon例如没有方法)。
最后,当您想要执行一些适用于向量和标记的操作时,您可以使用onEachFeature选项,例如绑定您的弹出窗口。
所以你最终会得到类似的东西:
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);
}
});
Run Code Online (Sandbox Code Playgroud)
正如评论中指出的那样,每当您寻求其他人的帮助时,如果您花时间正确陈述您的问题,并附上描述/截图出错并发布一些干净的代码。例如,客户端代码的一个非常好的做法是在jsFiddle上重现该问题。
| 归档时间: |
|
| 查看次数: |
19353 次 |
| 最近记录: |