如何标注GeoJSON多边形?


9

我正在使用结合了GeoJSON功能的Leaflet。有没有办法标记GeoJSON要素(在本例中为多边形)?它应该从获得标签

feature.properties.name 

这是我想在其中插入标签的代码:

function style(feature) {
            return {
                weight: 2,
                opacity: 1,
                color: 'white',
                dashArray: '3',
                fillOpacity: 0.7,
                fillColor: getColor(feature.properties.coloring)
            };
        }

1
您是否愿意发布用于标记多边形的解决方案(如果仍在手边)?
2015年

Answers:


5

您需要知道传单期望使用的格式。RFM。示例:OpenLayers希望此GeoJSON格式创建一个点并提供一些自定义属性:

{"type":"FeatureCollection",
    "features":[
        {"type":"Feature",
            "properties":{
                "name":"TRON-02",
                "serial":"TRON002",
                "bearing":0,
                "color":"green",
                "size":15,
                "image":"img/unit_map3.png",
            },
            "geometry":{
                "type":"Point",
                "coordinates":[-50.06542968749966,-23.749149728383717]
            }
        }
    ]
}

如您所见,我创建了一个Geometry(点)并将其属性加入其中。当我将其发送给OpenLayers时,结果将适合@Aragon的示例,使用“颜色”和“名称”(作为标签)来自定义地图中的点。

请将此GeoJSON示例复制并粘贴到http://json.parser.online.fr/中,或使用该网站尝试并验证您自己的示例。


不是关于多边形的问题吗?关于点几何的答案如何解决了这个问题?
2015年

什么是多边形?您将使用相同的名称。唯一会改变的是“几何”部分。不仅解决了问题,而且到目前为止还收到了5次ups。
Magno C

然后让我重新表述:我有一个相同的问题,在多边形上放置标签与在点上放置标签完全不同,因此在这种情况下,多边形对我来说是一个带有多个边的二维封闭对象。这就是为什么我有兴趣获取一些详细信息,因此是我的第一条评论。一个“它并解决它”答案是不那么有用,但随后由于反正:-)
a1an

1
只要添加“属性”的东西,一切都会好起来的。请参见@Aragon答案return feature.properties.color;如您所见,它properties是一个feature属性,并具有color作为其属性之一。您可以按照这种方式将所需的任何东西放入该对象。
Magno C

2
RFM完全没有必要。点与多边形之间的差异非常大,因为知道要使用哪种几何正是这里的问题
Stephen Lead

5

这是我使用“传单多边形”和“标签”解决的方法,以便在多边形上使用其name属性获得浮动标签。

假设:

  • 您将JSON响应解析为变量json
  • json中只有简单的多边形没有孔
  • Polygon_style保留您的样式函数返回的样式选项
  • labels_layer是一个传单图层组(或直接是您的地图)

然后:

for ( var i=0; i < json.features.length; i++ ) {
    feat = json.features[i];
    coords = [];
    for ( var j = 0 ; j < feat.geometry.coordinates[0].length - 1; j++ ) {
        coord = feat.geometry.coordinates[0][j];
        point = [];
        point.push( coord[1], coord[0]);
        coords.push( point );
    }
    labels_layer.addLayer(L.polygon( coords, polygon_style ).bindLabel(feat.properties.name))  ;
}

奇怪的是,GeoJson(实际上是EPSG:4326)和Leaflet坐标按顺序交换。


1
对于使用Leaflet 1.0+的用户,L.Label已作为L.Tooltip移入Leaflet核心,并且不推荐使用该插件。您将使用bindTooltip()而不是bindLabel()。github.com/Leaflet/Leaflet.label
aethergy

1

我认为这个问题与openlayers有关。如果是这样,您可以使用它来标记;

var style = new OpenLayers.Style({
    weight: 2,
    opacity: 1,
    color: 'white',
    dashArray: '3',
    fillOpacity: 0.7,
    fillColor: "${getColor}",  
    label: "${getLabel}"
  } , {
    context: {
      getColor: function(feature) {
        return feature.properties.color;
      },
      getLabel: function(feature) {
        return feature.properties.name;
      }
    }
  );

我希望它可以帮助您...


1
不是OpenLayers。我正在使用结合了GeoJSON功能的Leaflet。所以这行不通。但是,谢谢您的尝试。
逆流2012年

为什么不不 fillColor: "${color}"创建功能呢?
Magno C

1
@Magno C,你的观点没有区别。它们都是一样的。如果您想添加更复杂的功能作为随机颜色或其他任何东西,我已经写过。仍然感谢您的观点。
阿拉贡

理解了阿拉贡。感谢您的新方法。将来可能会有用。竖起大拇指 !
Magno C

我认为@againstflow没有办法从我显示的格式中消失,因为这里有一个规范GeoJSON的规则:link
Magno C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.