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?
postgis
postgis-1.5
Nik
źródło
źródło
Odpowiedzi:
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:
Ma
geography
typ 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.
źródło
być może chcesz zamiast tego ST_DWithin. patrz uwaga w dokumencie st_buffer.
ST_Buffer
źródło