Ayuda de PostGIS ST_Buffer Radius


9

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?


4326 es dd (grados decimales). 12070 es un área bastante grande (radio) cuando se proyecta como latlon.
Brad Nesom el

1
incorrecto - 12 070 metros = 7.49995029 millas, entonces 5 millas son 8046.72 metros entonces (? = 8046.72) - ¿es su geografía o geometría de datos?
Mapperz

Respuestas:


14

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:

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

Tiene un geographytipo 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.


Agradezco la ayuda Todavía soy bastante nuevo en PostGIS.
Nik

4

quizás quieras la función ST_DWithin en su lugar. ver nota en el documento st_buffer.
ST_Buffer

Las personas a menudo cometen el error de usar esta función para intentar hacer búsquedas de radio. Crear un búfer para una búsqueda de radio es lento e inútil. Utilice ST_DWithin en su lugar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.