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.