Guida di PostGIS ST_Buffer Radius


9

Sto cercando di trovare tutti i punti entro un raggio di cinque miglia da un determinato punto. Ho una domanda come questa:

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

Non riesco a capire cosa ho messo al posto di ?(raggio) per ottenere cinque miglia. Tutto è in EPSG 4326, e secondo la documentazione di PostGIS (per quanto posso dire), il mio raggio dovrebbe essere in metri. Se inserisco 12.070,0 m (circa 5 miglia), ottengo partite a metà del paese. Qualcuno sa cosa mi sto perdendo?


4326 è dd (gradi decimali). 12070 è un'area piuttosto grande (raggio) quando viene proiettata come latlon.
Brad Nesom,

1
errato - 12.070 metri = 7.49995029 miglia, quindi 5 miglia è 8046.72 metri quindi (? = 8046.72) - la tua geografia o geometria dei tuoi dati?
Mapperz

Risposte:


14

Poiché i tuoi dati non vengono proiettati - sono punti su uno sferoide - le distanze lineari non hanno senso. Cinque miglia all'equatore è un angolo molto più piccolo di 5 miglia sul circolo polare artico. Ma per fortuna PostGIS (> = 1.5) ha la risposta che stai cercando:

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

Ha un geographytipo progettato proprio per questo genere di cose. È simile alla geometria, ma utilizza sempre e solo EPSG: 4326 e ci sono molte meno funzioni che funzionano con esso.

Nell'esempio sopra, ho chiamato ST_GeogFromText () (Esiste anche un ST_GeographyFromText () e non sono sicuro che ci sia una differenza) sul punto di interesse (potrebbe funzionare con WKT normale, poiché il parametro SRID è ridondante) e lanciare la colonna latlon sul tipo di geografia. Se stai facendo molti di questi, può essere più efficiente creare una colonna geografica nella tabella e saltare completamente il cast. Infine, ST_DWithin () può prendere i parametri geografici e fa la cosa giusta con distanze lineari.


Apprezzo l'aiuto. Sono ancora abbastanza nuovo su PostGIS.
Nik,

4

forse vuoi invece la funzione ST_DWithin. vedi nota nel documento st_buffer.
ST_Buffer

Le persone spesso commettono l'errore di usare questa funzione per provare a fare ricerche nel raggio. La creazione di un buffer per una ricerca nel raggio è lenta e inutile. Utilizzare invece ST_DWithin .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.