Pomoc PostGIS ST_Buffer Promień

9

Próbuję znaleźć wszystkie punkty w promieniu pięciu mil od danego punktu. Mam takie zapytanie:

SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)

Nie mogę zrozumieć, co umieściłem w miejscu ?(promienia), aby uzyskać pięć mil. Wszystko jest w EPSG 4326 i zgodnie z dokumentacją PostGIS (najlepiej jak potrafię powiedzieć) mój promień powinien być w metrach. Jeśli ustawię 12 070,0 m (około 5 mil), dostanę mecze w połowie kraju. Czy ktoś wie, czego mi brakuje?

Nik
źródło
4326 to dd (stopnie dziesiętne). 12070 to dość duży obszar (promień), gdy jest wyświetlany jako latlon.
Brad Nesom
1
niepoprawnie - 12 070 metrów = 7,49995029 mil, więc 5 mil to 8046.72 metrów tak (? = 8046.72) - czy twoja geografia lub geometria danych?
Mapperz

Odpowiedzi:

14

Ponieważ dane nie są rzutowane - są to punkty na sferoidie - odległości liniowe nie mają sensu. Pięć mil na równiku jest znacznie mniejszym kątem niż 5 mil na kole podbiegunowym. Ale na szczęście PostGIS (> = 1,5) ma odpowiedź, której szukasz:

SELECT * FROM table WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT(0,0)'), geography(latlon), 12070);

Ma geographytyp przeznaczony do tego rodzaju rzeczy. Jest podobny do geometrii, ale zawsze korzysta z EPSG: 4326 i działa z nim znacznie mniej funkcji.

W powyższym przykładzie wywołałem ST_GeogFromText () (istnieje również ST_GeographyFromText () i nie jestem pewien, czy istnieje różnica) w punkcie zainteresowania (może działać z normalnym WKT, ponieważ parametr SRID to redundantne) i rzutuj kolumnę latlonową na typ geograficzny. Jeśli robisz wiele z nich, bardziej efektywne może być utworzenie kolumny geograficznej w tabeli i całkowite pominięcie obsady. Wreszcie ST_DWithin () może przyjmować parametry geograficzne i robi to dobrze z odległościami liniowymi.

MerseyViking
źródło
Doceniam pomoc. Nadal jestem dość nowy w PostGIS.
Nik
4

być może chcesz zamiast tego ST_DWithin. patrz uwaga w dokumencie st_buffer.
ST_Buffer

Ludzie często popełniają błąd, używając tej funkcji do próby wyszukiwania w promieniu. Tworzenie bufora do wyszukiwania w promieniu jest powolne i bezcelowe. Zamiast tego użyj ST_DWithin .

Brad Nesom
źródło