PostGIS Query всегда возвращает все результаты - PullRequest
1 голос
/ 12 февраля 2020

Я играю с PostGIS впервые и получаю все результаты обратно независимо от расстояния, которое я использую в запросе расстояния. Мои данные выглядят так:

Id                                      GeoLocation
8eb63480-4d63-11ea-b06a-8c1645ef6ad2    POINT (52.6323202 1.2947649)
a0f2dde6-4d64-11ea-b06a-8c1645ef6ad2    POINT (52.6294342 1.2936336)
a0f2dde7-4d64-11ea-b06a-8c1645ef6ad2    POINT (52.6277909 1.2909079)
a0f2dde8-4d64-11ea-b06a-8c1645ef6ad2    POINT (52.6260535 1.2952051)

И когда я запускаю запрос для точки, которая должна быть на расстоянии более мили:

SELECT * FROM "Locations"   WHERE ST_DWithin("GeoLocation", 'POINT(52.6219322 1.2630061)', 1);

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

Может ли это быть проблема формата координат? Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Используя параметры типа geography, вы получите возвращенное расстояние в метрах, поэтому вам нужно преобразовать его в мили, если вы предпочитаете работать с этой единицей измерения. Если вы можете справиться с градусами, просто придерживайтесь geometry.

WITH locations (geolocation) AS (
  VALUES ('POINT (52.6323202 1.2947649)'),
         ('POINT (52.6294342 1.2936336)'),
         ('POINT (52.6277909 1.2909079)'),
         ('POINT (52.6260535 1.2952051)')
) 
SELECT *
FROM locations 
WHERE ST_DWithin(
          geoLocation::geography, 
          'POINT(52.6219322 1.2630061)'::geography, 1609*2.2) ;

         geolocation          
------------------------------
 POINT (52.6294342 1.2936336)
 POINT (52.6277909 1.2909079)
(2 Zeilen)

EDIT : @JGH указал, что ST_Distance не использует пространственный индекс, и моим предыдущим предложением было использовать его вместо ST_DWithin. Это означает, что я ошибся в своем предпочтении ST_Distance :) В любом случае, вот как можно добиться аналогичных результатов с ST_Distance для тех, кто все еще хочет его использовать:

WITH locations (geolocation) AS (
  VALUES ('POINT (52.6323202 1.2947649)'),
         ('POINT (52.6294342 1.2936336)'),
         ('POINT (52.6277909 1.2909079)'),
         ('POINT (52.6260535 1.2952051)')
) 
SELECT *
FROM locations 
WHERE ST_Distance(
          geoLocation::geography, 
          'POINT(52.6219322 1.2630061)'::geography) * 0.000621371 > 2.2 ;

         geolocation          
------------------------------
 POINT (52.6323202 1.2947649)
 POINT (52.6260535 1.2952051)
(2 Zeilen)

Дальнейшее чтение: Getting all Buildings in range of 5 miles from specified coordinates

2 голосов
/ 12 февраля 2020

Так как они кажутся координатами по долготе и широте, вы должны использовать тип данных geography.

...