¿Crear círculo en PostGIS?

22

Estoy usando PostGIS 1.5.2, con geometrías en SRID: 900913. Necesito crear círculos usando una lista de puntos como centro, con un radio de 600 kilómetros. Estoy usando esta consulta:

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

Pero los círculos creados no tienen 600 kilómetros de radio (el radio está cerca de esta longitud, pero no exactamente).

¿Existen otros métodos para crear círculos en PostGIS?

NOTA: La información representada es de España. La proyección correcta es 4326, pero el cliente usa rásteres de Google, por lo que estoy almacenando datos en 900913 para evitar reproyecciones y aumentar el rendimiento.

angelcervera
fuente
1
¿Cómo midió los radios para descubrir que no son 600 km?
Underdark
1
@underdark Sé que la distancia entre dos ciudades y el círculo generado usando como centro uno de esta ciudad no se extienden a otra ciudad. Verifico la distancia entre dos ciudades usando gmap-pedometer.com
angelcervera
3
Esto suena relacionado con gis.stackexchange.com/questions/10148/…
underdark
@underdark Usando el SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));retorno más de 100 km de diferencia respecto a gmap-pedometer.com, pero si supongo que esta longitud es correcta, el radio del círculo es perfecto. Pero la gente usa la primera distancia como radio, no la distancia devuelta por st_distance. ¿Es posible transformar la primera distancia a la segunda?
angelcervera

Respuestas:

15

Prueba esto:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

Esto cambia a la geografía y luego utiliza la selección SRID incorporada para volver (irónicamente) a la geometría donde se ejecuta un buen búfer plano y luego voltea hacia atrás. El problema con su enfoque en Mercator es que Mercator no conserva la distancia. Usar una proyección local más apropiada da mejores resultados, y eso es lo que sucede en el método anterior.

Paul Ramsey
fuente
4

Puede aumentar el valor de quad_seg para obtener un círculo más preciso. Para obtener un círculo real, debe trabajar con un tipo de geometría curva, pero no sé qué software puede mostrar eso.

La precisión de srid 90013 también es muy mala, ya que es una proyección que cubre todo el mundo.

Obtendrá un resultado más preciso con una proyección local.

Nicklas Avén
fuente
@ nicklas-aven ¿Es posible una diferencia de 100 km en una distancia de 600 km porque estoy usando la proyección 900913 y no 4326?
angelcervera
1
Sí, es posible. mira Pauls comentarla cuando no podía creer esa inexactitud gis.stackexchange.com/questions/3264/… . La cosa es que 4326 no se proyecta.
Nicklas Avén
3

Depende de dónde se creen tus círculos. ¿Están cerca del ecuador o más cerca de los polos?

Echa un vistazo a este mapa . ¿Crees que Antártica o Groenlandia son realmente tan grandes? Esa es la proyección que estás usando, ¿verdad?

Le recomendaría que leyera rápidamente este documento del USGS sobre proyecciones , en particular la tabla a continuación que le da una idea rápida de qué proyecciones son buenas para qué.

Y después de todo eso, creo que finalmente debería responder a tu pregunta :)

Lo que Nicklas dijo fue un buen consejo. ¿Hay alguna proyección particular para su área local que funcione mejor?

De lo contrario, es posible que desee ver el nuevo tipo de Geografía PostGIS . Sin embargo, la respuesta más adecuada depende de dónde se encuentren sus datos.

ACTUALIZACIÓN: Dado que ahora sabemos que sus datos están en España, ¿buscó almacenarlos en una proyección local como UTM Zone 31N , hacer sus operaciones con eso y luego proyectarlos de nuevo en Google Web Mercator?

Ragi Yaser Burhum
fuente
1
+1 por usar el tipo de geografía para mapas que cubren grandes áreas. El problema aquí es que no hay una función de búfer nativa para el tipo de geografía en postgis. pero hay una conversión incorporada a la "mejor cuadrícula", que construye el búfer y luego vuelve a 4326. Por lo tanto, conocer sus datos y elegir una cuadrícula manualmente brinda un mejor control.
Nicklas Avén
Nicklas, tienes razón sobre el casting y estoy de acuerdo contigo al 100% sobre la proyección local (es decir, conocer tus datos). Sin embargo, si la respuesta es que solo quiere tener datos "mundiales", en mi humilde opinión, la lógica de lanzamiento dentro del tipo de Geografía hará un trabajo mucho mejor al descubrir qué SR es apropiado para esa operación de distancia en particular en lugar de cualquier otro lógica personalizada complicada. Otra cosa buena sobre el tipo de geografía es que, aunque muchas de las operaciones se asignan actualmente a las matemáticas cartesianas, las operaciones se siguen actualizando para usar las matemáticas de la esfera.
Ragi Yaser Burhum
2

Puede utilizar el nuevo tipo de geometría SQL / MM Parte 3 CIRCULARSTRING y / o CURVEPOLYGON.

Sin embargo, tenga en cuenta que el soporte para este tipo es limitado, tanto con funciones internas como con programas externos. Puede usar ST_CurveToLine para ayudar a visualizarlo.

Además, es un poco desagradable (a partir de PostGIS 2.0 svn) que SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)es solo una aproximación aproximada de π . (Compare 3.14033115695475 con 3.14159265358979 de pi()).

Mike T
fuente