如何使用Leaflet分别设置GeoJSON GeometryCollection的每个几何

时间:2018-08-12 16:07:14

标签: javascript leaflet geojson

我正在制作一张交互式地图,该地图使用Leaflet和一些GeoJSON数据显示城市铁路运输的历史。我的GeoJSON数据如下所示:

var lines = [
    {
        "type": "FeatureCollection",
        "name": "stadtmitte_gerresheim",
        "startYear": "1902",
        "endYear": "2019",
        "lineColor": "#DD0000",
        "trainID": "001",
        "features": [
        {
            "type": "Feature",
            "properties": {
                "lineName": "U73",
                "station1": "Universität Ost/Botanischer Garten",
                "station2": "Gerresheim S",
                "startYear": "2016",
                "endYear": "2019",
                "lineColor": "#DD0000",
            },
            "geometry": {
                "type": "GeometryCollection",
                "geometries": [
                    {
                        "type": "LineString",
                        "lineID": "001",
                        "lineDescription": "Schleife am S-Bahnhof Gerresheim",
                        "coordinates": [...
                        ]
                    },
                    {
                        "type": "LineString",
                        "lineID": "002",
                        "lineDescription": "Gerresheim S bis Ecke Schönaustraße/Heyestraße",
                        "coordinates": [...
                        ]
                    }
....

我正在使用几个FeatureCollection,其中包含一些Feature。如您所见,每个要素的几何由GeometryCollection定义(主要由LineString组成)。

我想使用Leaflet根据其成员为每个单个几何体(GeometryCollections中的LineStrings)设置样式。目前,我只能通过Feature设置整个GeometryCollection的样式:

L.geoJSON(route, {
                filter: function(feature) {
                    if (checkYear(feature)) {
                        return true;
                    } else {
                        return false;
                    }
                },
                style: function(feature) {
                    switch (feature.properties.tunnel) {
                        case 'yes': return {color: "#ff0000", dashArray: "1,6"};
                        default: return {color: "#ff0000"}
                    }
                },
                pointToLayer: function (feature, latlng) {
                    getIconSize();
                    switch (feature.properties.underground) {
                        case 'yes': return L.marker(latlng, {icon: stadtbahnIcon});
                        default: return L.marker(latlng, {icon: strassenbahnIcon});
                    }
                }
            }).addTo(mymap);
        }

我的问题:是否可以将单个样式函数传递给同一要素的不同几何,而不是将同一样式函数传递给该要素中的所有几何?如果是这样,怎么办?我想应该有可能,因为Leaflet为每个Geometry创建一条路径。

欢呼声

1 个答案:

答案 0 :(得分:2)

  

是否可以将单个样式功能传递给同一要素的不同几何?

否。

Leaflet在GeoJSON right over here中为每个L.Layer创建一个Feature实例;以及style回调函数just loops over the L.Layers corresponding to each feature的应用,它不会对嵌套的L.LayerGroup(也包括创建的L.PolylineL.Polygon GeometryCollection的结果是没有对原始GeoJSON功能及其属性的引用。

我想您可能要使用TurfJS' geomEach(或类似的东西)来预处理您的要素和几何。