如何从现有文件创建geoJson文件的子集

时间:2017-04-26 06:17:05

标签: javascript json leaflet mapbox geojson

我有一个geoJSON文件,如下所示:

    var geoJSON=    
    {

    "type":"FeatureCollection",

    "features": [                                             
        {"type": "Feature","geometry":{"type":"LineString", "coordinates":[[102.463303,36.447488],[102.514114,36.439755]]},"properties": {"id":"01","points":9}},
        {"type": "Feature","geometry":{"type":"LineString", "coordinates":[[102.593765,36.414341],[102.634964,36.402183]]},"properties": {"id":"02","points":8}},
        {"type": "Feature","geometry":{"type":"LineString", "coordinates":[[102.880783,36.485038],[102.882156,36.561187]]},"properties":{"id":"03","points":10}}

........
and so on
                ]};

由此我想创建一个变量filtered_geoJSON,其中只有点> = 9可用,如下所示:

var filtered_geoJSON=    
        {

    "type":"FeatureCollection",

    "features": [                                             
        {"type": "Feature","geometry":{"type":"LineString", "coordinates":[[102.463303,36.447488],[102.514114,36.439755]]},"properties": {"id":"01","points":9}},
        {"type": "Feature","geometry":{"type":"LineString", "coordinates":[[102.880783,36.485038],[102.882156,36.561187]]},"properties":{"id":"03","points":10}}

........
and so on
                ]};

因为每次我都更新每个Line String的点,如

  geoJSON['features'][i]['properties']['points']=data[i].points;

因此,我希望每次都创建filtered_geoJSON变量并将其传递给

L.geoJson(filtered_geoJSON, {
                     style: style,
                     onEachFeature: onEachFeature
                }).addTo(map);

所以我只画出点数> gt的点数。

所以我尝试了

var top_geoJSON={"type":"FeatureCollection","features": []};
            var c=0;
            for (i = 0; i<40000; i++) { 


                if(geoJSON['features'][i]['properties']['score']!=data[i].points){
                      links['features'][i]['properties']['score']=data[i].score;
                }

                if(geoJSON['features'][i]['properties']['points']>9){
                    filtered_geoJSON[c]=geoJSON['features'][i];
                     c++;
                }  

filtered_geoJSON在那里,但没有在地图中绘制线条。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

宣传单L.geoJSON工厂有一个filter选项,您可以使用它来提供整个geoJSON数据,并让Leaflet只保留符合您指定条件的那些(即在你的情况下feature.properties.points >= 9

在您更新filtered_geoJSON重新构建您的points变量时,您必须先构建一个新的L.geoJSON,然后才能获得某些内容你的地图。

此外,即使直接更改geoJSON数据,Leaflet也不会通过filter再次对其进行评估,因此,如果某些功能低于9,或者某些新功能超出,则 >不会自动反映在地图上。

最简单的解决方案是删除以前创建的L.geoJSON图层组,并使用更新的geoJSON数据(以及相同的过滤器)构建一个新图层,以便Leaflet重新评估您的功能再次。

稍微复杂的解决方案是直接遍历L.geoJSON图层组子图层(而不是原始的geoJSON数据),通常使用eachLayer,更新他们的{{1}在那里确定它现在应该隐藏还是显示回来。您最初需要创建feature.properties.points图层组而不使用任何过滤器,并手动将子图层添加到地图/从地图中删除它们。当然,您也可以使用中间L.geoJSON