2012-11-09 46 views
26

我正在尝试我想象的是一个相当常见的使用案例,其中包含传单多面体对象。传单(geojson)多边形上的简单标签

我创建的MultiPolygon使用以GeoJSON:

var layer = L.GeoJSON(g, style_opts); 

我想什么是把一个简单的文本标签在每个多边形的中心。 (例如,像在每个州的中心放置州名一样)。

我看: https://groups.google.com/forum/?fromgroups=#!topic/leaflet-js/sA2HnU5W9Fw

里面居然覆盖文本,但是当我添加了一堆的多边形,它似乎把标签偏离中心怪异的方式,我目前无法追查问题。

我也看了看:https://github.com/jacobtoye/Leaflet.label

但似乎只把标签上的多边形,当鼠标移动到多边形,并且不留静态的多边形。

我认为我的最佳行动方式是使用第一个链接,并追踪它为什么会改变位置,但同时,如果有人知道快速简单的方法在小册子上的多边形上打上标签,我会非常感激。此外,如果我对上述两个链接有任何错误的假设,请随时将我理清。

非常感谢。

回答

22

单张标签插件还允许静态标签,请参见demo。 多段线标签不是静态的唯一原因是当您沿着折线移动时,它会四处移动。

你也许可以做得比这更好的,通过重写bindLabel()为多边形,但是这是一个简单的方法来静态标签添加到多边形的中心:

label = new L.Label() 
label.setContent("static label") 
label.setLatLng(polygon.getBounds().getCenter()) 
map.showLabel(label); 

http://jsfiddle.net/CrqkR/6/

+1

感谢您的回答。管理得到这个工作。你确实需要在调用'showLabel()'之前将标签添加到地图中:'label.addTo(map)' – Ben

+0

@Ben我试过了,它的工作原理与书面一样。看到http://jsfiddle.net/CrqkR/6/ – flup

+0

我一定是做错了,然后......感谢更新 – Ben

12

你可以使用onEachFeature选项L.geoJson为每个多边形创建一个新的L.divIcon

L.geoJson(geoJsonData, { 
    onEachFeature: function(feature, layer) { 
    var label = L.marker(layer.getBounds().getCenter(), { 
     icon: L.divIcon({ 
     className: 'label', 
     html: feature.properties.NAME, 
     iconSize: [100, 40] 
     }) 
    }).addTo(map); 
    } 
); 
+1

如果您在地图上将“geoJsonData”切换为要素图层,您将如何完成此项工作?您当前的方法在开始时将标签添加到地图中。感谢您的任何提示。 – redshift

+0

如果您的'L.geoJson'图层保存在一个名为'geojson'的变量中,您可以调用'geojson.clearLayers()'然后'geojson.addData(newGeoJsonData)' – clhenrick

+0

@redshift ..在这里检查我的答案http:/ /stackoverflow.com/questions/31691297/how-to-remove-a-leaflet-label-when-a-topojson-layer-containing-it-is-removed/31695242#31695242 – muzaffar