使用Java从(geo)json中的数组中删除对象

时间:2014-12-29 09:19:22

标签: java json polygon geojson

我有一个geojson(地理参考数据的json),其中包含一个"特征" -array,包含许多多边形。我想循环遍历"特征" -array中的元素并删除其中的一些元素(其多边形区域小于70.0)。这是我的geojson的结构:

{
   "type": "FeatureCollection",

   "features": [
      { "type": "Feature", "properties": { "DN": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 5117.0, 0.0 ], [ 5117.0, 1.0 ], [ 5124.0, 1.0 ], [ 5117.0, 0.0 ] ] ] } },
      { "type": "Feature", "properties": { "DN": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.0, 149.0 ], [ 0.0, 150.0 ], [ 61.0, 150.0 ], [ 0.0, 149.0 ] ] ] } }
   ]
}

在这里,我尝试遍历"功能" -array的元素,计算每个多边形的面积,如果面积小于70.0,则将其删除:

public static void smallPolygonRemover() throws IOException, ParseException{
        // read geojson
        FileReader reader = new FileReader("source.geojson");
        JSONParser jsonParser = new JSONParser();
        JSONObject jsonObject = (JSONObject) jsonParser.parse(reader);
        JSONArray features = (JSONArray) jsonObject.get("features");

        for (int j = 0; j < features.size(); j++) {
              JSONObject firstFeature = (JSONObject) features.get(j);
              JSONObject geometry = (JSONObject) firstFeature.get("geometry");
              JSONArray coordinates = (JSONArray) geometry.get("coordinates");
              // area(coordinate) calculates the area of the polygon with given coordinates
              if(area(coordinates)<70.0){
                    features.remove(firstFeature);
              }
        }
        // write the edited geojson to a file
        FileWriter writer = new FileWriter("Removed.geojson");
        writer.write(jsonObject.toJSONString());
        writer.close();
}

问题是:应该删除的多边形仍然存在,但其他多边形消失了。我使用features.remove(firstFeature);错了吗?我也试过features.remove(features);但没有用..另一种可能性是区域功能错误(我使用this一个)或者双打都有问题。

1 个答案:

答案 0 :(得分:2)

您错过了循环和remove()之间的交互:如果删除数组中的条目,则所有其他元素的索引都会更改。这意味着如果您删除项目#2,那么项目#3将变为#2。然后你的循环将索引设置为3,这意味着你永远不会检查项目#3并继续使用旧的#4。

从循环中删除j++并改为使用此代码:

 if(area(coordinate)<70.0){
     features.remove(firstFeature);
     // removing the polygon moves j+1 to j, so we need to leave j alone
 } else {
     j++; // this polygon is OK, move to the next one
 }

或以features.size()-1开始迭代并倒计时。