Estoy tratando de encontrar todos los puntos dentro de un radio de cinco millas de un punto dado. Tengo una consulta como esta:
SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)
No puedo entender lo que puse en lugar de ?
(radio) para obtener cinco millas. Todo está en EPSG 4326, y de acuerdo con la documentación de PostGIS (lo mejor que puedo decir), mi radio debe estar en metros. Si pongo 12,070.0m (aproximadamente 5 millas), obtengo coincidencias en todo el país. ¿Alguien sabe lo que me estoy perdiendo?
postgis
postgis-1.5
Nik
fuente
fuente
Respuestas:
Debido a que sus datos no se proyectan, son puntos en un esferoide, las distancias lineales no tienen sentido. Cinco millas en el ecuador es un ángulo mucho más pequeño que 5 millas en el círculo polar ártico. Pero afortunadamente PostGIS (> = 1.5) tiene la respuesta que está buscando:
Tiene un
geography
tipo diseñado para este tipo de cosas. Es similar a la geometría, pero solo usa EPSG: 4326, y hay muchas menos funciones que funcionan con ella.En el ejemplo anterior, he llamado a ST_GeogFromText () (También hay un ST_GeographyFromText () , y no estoy seguro de si hay una diferencia) en el punto de interés (podría funcionar con WKT normal, porque el parámetro SRID es redundante), y lance la columna de latlon al tipo de geografía. Si está haciendo muchos de estos, puede ser más eficiente crear una columna de geografía en su tabla y omitir el reparto por completo. Finalmente, ST_DWithin () puede tomar parámetros de geografía y hace lo correcto con distancias lineales.
fuente
quizás quieras la función ST_DWithin en su lugar. ver nota en el documento st_buffer.
ST_Buffer
fuente