我有一个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一个)或者双打都有问题。
答案 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
开始迭代并倒计时。