Точки внутри многоугольника в PostGIS - PullRequest
0 голосов
/ 03 июня 2018

У меня есть таблица samplecol, которая содержит (образец):

vessel_hash  | status | station | speed |  latitude   |  longitude  | course | heading |        timestamp         |                      the_geom                      
--------------+--------+---------+-------+-------------+-------------+--------+---------+--------------------------+----------------------------------------------------
 103079215239 | 99     | 841     | 5     | -5.41844510 | 36.12160900 | 314    | 511     | 2016-06-12T06:31:04.000Z | 0101000020E61000001BF33AE2900F424090AF4EDF7CAC15C0
 103079215239 | 99     | 3008    | 0     | -5.41778710 | 36.12144900 | 117    | 511     | 2016-06-12T06:43:27.000Z | 0101000020E6100000E2900DA48B0F424042C3AC61D0AB15C0
 103079215239 | 99     | 841     | 17    | -5.42236900 | 36.12356900 | 259    | 511     | 2016-06-12T06:50:27.000Z | 0101000020E610000054E6E61BD10F42407C60C77F81B015C0
 103079215239 | 99     | 841     | 17    | -5.41781710 | 36.12147900 | 230    | 511     | 2016-06-12T06:27:03.000Z | 0101000020E61000004D13B69F8C0F424097D6F03ED8AB15C0
 103079215239 | 99     | 841     | 61    | -5.42201900 | 36.13256100 | 157    | 511     | 2016-06-12T06:08:04.000Z | 0101000020E6100000CFDC43C2F71042409929ADBF25B015C0
 103079215239 | 99     | 841     | 9     | -5.41834020 | 36.12225000 | 359    | 511     | 2016-06-12T06:33:03.000Z | 0101000020E6100000CFF753E3A50F42408D68965F61AC15C0

Я пытаюсь получить все точки внутри многоугольника с помощью:

poisInpolygon = """SELECT col.vessel_hash,col.longitude,col.latitude,
            ST_Contains(ST_GeomFromEWKT('SRID=4326; POLYGON((-15.0292969 47.6357836,-15.2050781 47.5172007,-16.2597656 29.3821751, 35.0683594 26.1159859, 38.0566406 47.6357836,-15.0292969 47.6357836))'),
            ST_GeomFromEWKT(col.the_geom)) FROM samplecol As col;"""

Вывод:

(103079215291L, Decimal('40.87123100'), Decimal('29.24107000'), False) 

(103079215291L, Decimal('40.86702000'), Decimal('29.23967000'), False) 

(103079215291L, Decimal('40.87208200'), Decimal('29.22113000'), False) 

(103079215291L, Decimal('40.86973200'), Decimal('29.23963000'), False) 

(103079215291L, Decimal('40.87770800'), Decimal('29.20229900'), False)

Я не понимаю, что является ложным в результатах.Это правильный путь или я что-то не так делаю?

Также этот код использует ИНДЕКС в поле the_geom?

1 Ответ

0 голосов
/ 04 июня 2018

Запрос возвращает false, потому что все точки из вашей выборки находятся за пределами данного многоугольника.Вот обзор ваших точек (где-то на северо-востоке Танзании) и полигона (Южная Европа и Северная Африка):

enter image description here

Чтобы проверить свой запрос,Я добавил еще одну точку где-то в Málaga, которая находится внутри вашего многоугольника, и она вернула true точно так же, как и ожидалось (последняя геометрия в операторе вставки как EWKT).Это скрипт:

CREATE TEMPORARY TABLE t (the_geom GEOMETRY);
INSERT INTO t VALUES ('0101000020E61000001BF33AE2900F424090AF4EDF7CAC15C0'),
             ('0101000020E6100000E2900DA48B0F424042C3AC61D0AB15C0'),
             ('0101000020E610000054E6E61BD10F42407C60C77F81B015C0'),
             ('0101000020E61000004D13B69F8C0F424097D6F03ED8AB15C0'),
             ('0101000020E6100000CFDC43C2F71042409929ADBF25B015C0'),
             ('0101000020E6100000CFF753E3A50F42408D68965F61AC15C0'),
             (ST_GeomFromEWKT('SRID=4326;POINT(-4.4427 36.7233)'));

А вот ваш запрос:

db=# SELECT 
ST_Contains(ST_GeomFromEWKT('SRID=4326; POLYGON((-15.0292969 47.6357836,-15.2050781 47.5172007,-16.2597656 29.3821751, 35.0683594 26.1159859, 38.0566406 47.6357836,-15.0292969 47.6357836))'),
            ST_GeomFromEWKT(col.the_geom)) 
FROM t As col;

st_contains 
-------------
 f
 f
 f
 f
 f
 f
 t
(7 Zeilen)

Кстати: сохранение тех же координат, что и GEOMETRY и NUMERIC, является полностью избыточным.Возможно, вы захотите избавиться от столбцов latitude и longitude и извлечь их значения с помощью ST_X и ST_Y по требованию.

...