6 votos

Forma rápida de convertir polígonos en puntos en PostGIS

¿Cuál es la forma más rápida de convertir un polígono en un punto en PostGIS?

No me importa donde el punto está en relación con la geometría, pero el punto resultante sí debe ser coherente.

Utilizando ST_Centroid tarda unos 19 segundos en hacerlo para 1000 polígonos, lo que parece muy lento (¡tengo que hacerlo repetidamente para millones!), pero eso es probablemente porque está calculando el centroide de la característica.

Coqueteé brevemente con ST_DumpPoints pero eso parece llevar aún más tiempo (más de 30 segundos para los mismos 1000) puntos.

¿Cuál es la forma más rápida de hacerlo?

0 votos

Probablemente ya hayas hecho esto, pero asegúrate de tener índices/vacío/análisis/rendimiento del servidor... gis.stackexchange.com/a/194576/72697

0 votos

El tiempo que se tarda en utilizar ST_centroid dependerá en gran medida de la complejidad de los polígonos. Quizás algún método que utilice el centroide de un mbr podría ser más rápido. Estoy un poco desconcertado en el uso de ST_DumpPoints: esto creará múltiples puntos por polígono, mientras que estoy asumiendo que sólo quiere uno? Si sus polígonos son complejos, esto explicaría por qué ST_DumpPoints tardó mucho tiempo.

0 votos

¿Sus polígonos serían propicios para los centroides de las cajas delimitadoras? ¿Tal vez podría sacarlos de la indexación?

10voto

Patrick Puntos 20392

La velocidad de los diferentes enfoques dependerá, por supuesto, de la complejidad de los polígonos en cuestión. La página web algoritmos para calcular un centroide, como con ST_Centroide En el caso de los polígonos, es necesario deserializar el polígono como ha dicho @dbaston, y también hacer el cálculo utilizando todos los puntos. ST_Xmax , ST_Xmin y ST_Ymax , ST_Ymin será más rápido, ya que hay menos cálculos que con el centroide. Tal vez, sorprendentemente, la adición de un índice espacial no parece aumentar la velocidad de estas funciones mín/máx, a pesar de que el cuadro delimitador es una parte integral de Gist (espacial) de indexación - que, como dbaston ha señalado en los comentarios, es porque los puntos bbox se almacenan como una sola precisión y, por lo tanto, son inutilizables por el bounding box functionns. ST_PointOnSurface está garantizado para encontrar un punto en el polígono, pero al igual que con ST_Centroid, implica un algoritmo que realmente utiliza todos los puntos, también vea esto responder .

ST_DumpPoints parece un desperdicio, ya que devuelve un array de todos los puntos, por lo que tienes todo el gasto de deserializar la geometría en un array de puntos, y luego estás tirando n-1 de los puntos.

El el más rápido método que pude encontrar fue usar ST_PointN junto con ST_Exteriorring , ya que ST_PointN requiere un Linestring, que ST_ExteriorRing devuelve. ST_PointN sólo necesita extraer el primer punto (en el ejemplo de abajo), y no necesita hacer ningún otro cálculo.

Aquí hay algunos números bastante arbitrarios para algunas pruebas utilizando una tabla de 10.000 geometrías cada una con al menos 1000 puntos, repitiendo 10 veces, y promediando, en mi portátil, en orden de velocidad descendente:

SELECT ST_PointOnSurface(geom) FROM sometable;

tardó 2345 ms.

SELECT ST_Centroid(geom) FROM sometable;

tardó 460 ms.

SELECT ST_MakePoint(ST_Xmin(geom), ST_Ymin(geom)) FROM sometable;

tardó 259 ms.

SELECT ST_PointN(ST_Exteriorring(geom), 1) FROM sometable;

tardó 112ms.

Hice las mismas pruebas con geometrías más pequeñas y el espacio entre los ST_PointN y ST_XMax/ST_Ymax (o equivalentes mínimos) estaba más cerca, pero ST_PointN seguía siendo el claro ganador.

Usted ha declarado que no le importa dónde está el punto, pero que tiene que ser coherente, así que PuntoN(geom, 1) parece satisfacer sus propósitos, ya que siempre devolverá el primer punto y es el más rápido.

0 votos

Me alegro de que esto te funcione. Me preocupaba estar respondiendo a la pregunta equivocada. Debes tener unos polígonos muy, muy grandes o un ordenador muy, muy lento para algunos de los números que estabas reportando arriba. Supongo que este enfoque está ahorrando mucho tiempo.

1 votos

Los cuadros delimitadores se almacenan con una sola precisión, por lo que no se utilizan para ST_XMin etc.

0 votos

@dbaston, gracias. Realmente necesito aprender a entender mejor la fuente.

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