2014-12-29 1 views
0

У меня есть geojson (json для данных с привязкой) с одним «свойством» -array, содержащим много полигонов. Я хочу прокрутить элементы в «feature» -array и удалить некоторые из них (у которых область полигона меньше 70.0). Это структура моего GeoJSON:Удаление объекта из массива в (geo) json с использованием Java

{ 
    "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

Проверьте свой код. Вы помещаете точки в переменную 'координат' (с' s'), а затем вызываете 'area()' с 'coord'. Это опечатка в вопросе или неправильный код? –

+0

Это была опечатка, но мой исходный код использовал координаты. Так что опечатка была только здесь. Спасибо. – Selphiron

ответ

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 и обратным отсчетом.

+0

Это похоже на правильное направление, но все же что-то не так. С 'System.out.println (область (координаты));' Я узнал, что самый большой Polygon имеет область 2932899.1. Поэтому я изменил if-блок на: 'if (площадь (координаты) <2932899.0) { features.remove (firstFeature); j--; } ' , чтобы получить geojson только с самым большим полигоном. Но я получаю исключение в 'JSONObject firstFeature = (JSONObject) features.get (j);' Ошибка: 'Исключение в потоке 'main" java.lang.ArrayIndexOutOfBoundsException: -1' – Selphiron

+1

Код должен делать 'j ++' после каждого петля. Следовательно, не должно быть возможности получить индекс '-1' с кодом выше (для первого элемента' j' будет '-1' в конце цикла, тогда' j ++ 'превратит это в '0'). Другим решением было бы удалить приращение в цикле и использовать 'if (area ...) {...} else {j ++; } '. Если ничего не помогает, вам нужно отлаживать код по строчке, чтобы узнать, что происходит. –

+0

перемещение j ++ из заголовка цикла под if-block сделало это! И я узнал, что функция области вычисляет площадь на 60% меньше, чем это было бы .. Возможно, вы должны отредактировать свой ответ, чтобы я мог его принять (или это нормально, так как это в разделе комментариев?) – Selphiron

Смежные вопросы