Как выполнить пространственное объединение сетки и полигонов с помощью геоинструментов?

У меня есть GridCoverage2D и набор MultiPoints, поэтому полигоны не перекрываются. Оба покрывают одну и ту же географическую область, и я хочу знать, в каком многоугольнике находится каждая точка. Итак, это проблема точки в многоугольнике.

Наивный способ сделать это с помощью геоинструментов - перебрать все 700000 точек и запросить каждую 260 раз, если она лежит в многоугольнике. Это работает, но ужасно медленно ....

Есть ли более быстрый способ сделать это в геоинструментах?

Выполнение чего-то подобного в R (с использованием функции «over») занимает пару секунд, в то время как мой наивный вложенный цикл выполнялся часами. Так же 700000 раз 100 звонков "внутри"

while(pointFeatures.hasNext())  {
        SimpleFeature pointFeature = pointFeatures.next();
        Geometry   defaultGeometryPoint = (Geometry) pointFeature.getDefaultGeometry();
        PreparedGeometry prep = PreparedGeometryFactory.prepare( defaultGeometryPoint );
        SimpleFeatureIterator polygonFeatures = collection.features();
        while(polygonFeatures.hasNext()) {
            SimpleFeature polygonFeature = polygonFeatures.next();
            Geometry polygonFeatureDefaultGeometry = (Geometry) polygonFeature.getDefaultGeometry();
            if(prep.within(polygonFeatureDefaultGeometry)) {
                System.out.println("polygonFeature = " + polygonFeature);
                break;
            }

        }
    }

person user2976698    schedule 21.02.2018    source источник


Ответы (1)


Я бы сделал что-то вроде этого псевдокода:

for each polygon:
    get bounding box
    for x in bbox.minx,bbox.maxx
       for y in bbox.miny,bbox.maxy
           if check ig point(x,y) is in polygon is True
               note point in poly.

Но было бы намного быстрее, если бы у вас были реальные точки, а не сетка.

person Ian Turton    schedule 22.02.2018