Leaflet:Circle的行为与CircleMarker不同

时间:2012-08-15 09:24:20

标签: javascript geojson leaflet

在Leaflet的文档中:http://leafletjs.com/reference-1.2.0.html#circlemarker它表示CircleMaker扩展了Circle,并且它是相同的,除了半径以像素而不是米为单位指定,因此圆圈保持恒定的大小如果你缩放地图。

但我确实需要Circles,因为我试图在地图上绘制100米半径的圆圈。为此,我使用以下代码:

var geojsonLayer = new L.GeoJSON(null,{
pointToLayer: function (latlng){
    return new L.CircleMarker(latlng, {
        radius: 5,
        fillColor: "#ff7800",
        color: "#000",
        weight: 1,
        opacity: 1,
        fillOpacity: 0.8,
    });
}});

map.addLayer(osm);
map.addLayer(geojsonLayer);
geojsonLayer.addGeoJSON(jsonExample);

这很好用,但是,如果我将代码更改为使用“Circle”而不是CircleMaker,则整个地图无法加载,并且我收到一个javascript错误:

Error: Error: Invalid LatLng object: (56.229917, NaN)

我可以通过预过滤geojson来去除那些缺乏纬度和经度的点来解决这个问题,但我很困惑:Circle和CircleMaker都指定他们将LatLng对象作为中心点的规范,我不知道某个LatLng对象如何作为CircleMarker的中心点有效,但如果用作Circle的中心点则无效。

我是否忽略了一些显而易见的事情,或者这只是传单中的弱点和/或错误,我只需要解决这个问题?

3 个答案:

答案 0 :(得分:4)

我通过更改L.circle中leaflet.js的_getLngRadius()方法来修复此问题。在传单版本0.4.4中,它位于第4913行附近。

此方法与circleMarker中的方法不同,因为它会动态计算圆的半径。如果您更改了

的行
  

this._mRadius / hLength

  

this._mRadius.radius / hLength

应该没问题。

答案 1 :(得分:4)

代码没有问题了。虽然由于构造函数不同,很容易出现同样的问题:

L.CircleMarker( <LatLng> latlng, <Path options> options? )

L.Circle( <LatLng> latlng, <Number> radius, <Path options> options? )

务必将半径传递给新的圈子。

答案 2 :(得分:1)

你可以在你的函数开头添加if(latlng&amp;&amp; latlng.lat&amp;&amp; latlng.lng)(latlng)

将忽略有缺陷的数据。