Найти точки внутри пересечения многоугольников в PostgreSQL / PostGIS - PullRequest
0 голосов
/ 25 июня 2019

Я хочу найти точки внутри пересечения (рисунок 1) полигонов в PostgreSQL.

Пример рисунка 1 enter image description here

Я использую psycopg2, и код, который я использовал:

intersects = """select ST_Intersects( ST_GeographyFromText('SRID=4326; POLYGON(( 32.0361328 33.6877818, 31.9042969 33.5780147,33.5742188 11.3507967,66.2695313 20.4270128, 51.9433594 34.270836, 32.0361328 33.6877818))'),
              ST_GeographyFromText('SRID=4326; POLYGON((33.7060547 37.1953306,36.6943359 16.0880422,64.9072266 12.4258478,64.8632813 37.0551771,33.5742188 37.1953306,33.7060547 37.1953306))')), col.vessel_hash,ST_X(col.the_geom) AS long, ST_Y(col.the_geom) AS lat
        from samplecol as col"""

        cursor.execute(intersects)
        pointsINtw = cursor.fetchall()
        count = 0;
        shipsrecords = open("/home/antonis/Desktop/testme1.txt", "w")
        for ex in pointsINtw:
            if str(ex[0])=='True':
                count = count + 1
                shipsrecords.write(str(ex) + "\n")

        print (CBLUE + "Number of returned results: " + CBLUEEND), count

Пример записи:

vessel_hash  | speed |  latitude   |  longitude  | course | heading |        timestamp         |                      the_geom                      
--------------+--------+---------+-------+-------------+-------------+--------+---------+--------------------------+----------------------------------------------------
 103079215239 | 5     | -5.41844510 | 36.12160900 | 314    | 511     | 2016-06-12T06:31:04.000Z | 0101000020E61000001BF33AE2900F424090AF4EDF7CAC15C0

Проблема в том, что приведенный выше код не работает должным образом.Я создаю два многоугольника, как на рисунке 1, и я знаю, что внутри пересечения существуют некоторые точки.Но код всегда возвращает все точки из базы данных.

Если я создаю два многоугольника, которые не пересекаются, то алгоритм, кажется, работает правильно, поскольку он не возвращает ни одной точки.

Кто-нибудь знает, что я делаю не так?

1 Ответ

1 голос
/ 25 июня 2019

demo: db <> fiddle (по вашему запросу, с вашими полигонами, собственными точками),

визуализация ситуации (возможно, Chrome необходим)

ST_Intersects() только проверяет, занимают ли два заданных полигона некоторое пространство. Это правда, они делятся. Но в вашем запросе нет части, включающей проверку с точками. Вы вызываете только проверку пересечения, но без использования вашего столбца точек.


Я полагаю, вам нужно вычислить многоугольник пересечения (ST_Intersection()), а не только проверять его наличие. После этого вы можете использовать этот результат, чтобы проверить, есть ли в нем ваши очки (ST_Contains()):

псевдокод:

SELECT
    ST_Contains(
        ST_Intersection(my_geometry1, my_geometry2),
        my_pointgeometry
    )
...

демо: дб <> скрипка (В демо-версии используется геометрия, а не география, и по некоторым причинам полигон должен быть действительным; вам необходимо адаптировать его к своему варианту использования)

...