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
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?
1 votos
Los índices son irrelevantes aquí. Estos deben ser polígonos masivos...
ST_Centroid
El tiempo de la cpu está dominado por la deserialización en mi experiencia.1 votos
Pruebe el
ST_XMin
yST_XMax
funciones y utilizar los puntos medios.0 votos
No está claro si quieres la forma más rápida de generar puntos o la forma más rápida de acceder a puntos. Nunca es necesario hacer algo caro "repetidamente". En su lugar, modifique el diseño de su base de datos para incluir los datos que necesita.
0 votos
Cuando dices que no te importa dónde, ¿quieres decir que el punto tiene que intersecar el polígono, pero no importa si está en el borde o en el interior? Si es así, podrías simplemente tomar el primer punto, ST_PointN, lo que creo que sería muy rápido ya que no se necesitan cálculos.
0 votos
@GIS-Jonathan ¡advertencia! tienes que comprobar si necesitas centroïd real o falso centroïd. Depende de si tienes una forma de polígono en forma de agujero o en forma de L y si necesitas el punto en las entidades de origen.