10 votos

PostGIS ST_Buffer Radio Ayuda

Estoy tratando de encontrar a 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 averiguar qué pongo en el lugar de ? (radius) a cinco millas. Todo está en EPSG 4326, y de acuerdo a PostGIS documentación (lo mejor que puedo decir), mi radio debe estar en metros. Si me pongo en el 12,070.0 m (aproximadamente 5 millas), me sale partidos a mitad de camino en todo el país. ¿Alguien sabe a qué me estoy perdiendo?

15voto

Symmetric Puntos 158

Debido a que tus datos no se proyecta - es los puntos en un esferoide - distancias lineales suerte de no tener sentido. Cinco millas en el ecuador es mucho más pequeño ángulo de 5 millas en el círculo polar ártico. Pero por suerte PostGIS (>= 1.5) tiene la respuesta que estás buscando:

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

Tiene un geography tipo que está diseñado para este tipo de cosas. Es similar a la geometría, pero sólo se utiliza nunca EPSG:4326, y hay muchas menos funciones que trabajan con él.

En el ejemplo anterior, he llamado 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 regular WKT, porque el SRID parámetro es redundante), y echamos la latlon columna a la geografía tipo. Si usted está haciendo un montón de estos, puede ser más eficaz para crear una geografía de la columna en la tabla y omitir el elenco completo. Finalmente, ST_DWithin() puede tomar la geografía parámetros, y que hace lo correcto con distancias lineales.

4voto

Niall C. Puntos 1234

tal vez usted quiere que el ST_DWithin función de su lugar. ver nota en el st_buffer doc.
ST_Buffer

La gente a menudo comete el error de usar esta función para tratar de hacer radio de búsqueda. La creación de un buffer a un radio de búsqueda es lenta y sin sentido. Uso ST_DWithin lugar.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X