Observo un comportamiento extraño con mi consulta PostGIS. Estoy tratando de lograr lo siguiente:
- Tengo una capa poligonal
- Tengo 2 capas de línea diferentes
- capa con líneas horizontales
- capa con líneas de 45
- el objetivo es cortar las líneas en los polígonos para obtener las partes de línea de cada línea por polígono
Estoy utilizando una consulta que se parece a esto:
CREATE TABLE split AS
( SELECT row_number() over() AS id,
a.id AS old_id,
st_intersection(a.geom, b.geom) AS geom
FROM lines a,
polygons b
WHERE st_intersects(a.geom, b.geom) ) ;
La consulta tarda unos 3 minutos para las líneas horizontales y verticales, pero más de 5 horas (canceladas ahí) para las líneas de 45°.
¿A alguien se le ocurre una posible causa? Todas las capas tienen índices espaciales, pk y demás. Estoy utilizando un Postgres 9.5 con PostGIS 2.2.
Realmente no tengo ni idea de ese comportamiento.
4 votos
¿Quizá porque el cuadro delimitador es un cuadrado grande en lugar de un rectángulo fino?
0 votos
No entiendo su comentario. El cuadro delimitador rotado es, por supuesto, un poco más grande que el original.
2 votos
No sé cómo funcionan internamente los índices espaciales de PostGIS pero supongo que siempre funcionan con una caja delimitadora. Para una línea vertical/horizontal, el grosor será realmente pequeño (cero en realidad) y será muy eficiente filtrar en base a la dimensión 'pequeña'. Esto es diferente para una línea a 45 grados. El cuadro delimitador será un cuadrado. Si su línea es larga, podría ser casi todo su lienzo, haciendo que el índice espacial sea inútil. Intente dividir sus líneas a 45 grados en segmentos más pequeños. Pero de nuevo sólo estoy suponiendo porque no sé cómo funcionan internamente los índices espaciales.
1 votos
¡ah vale, ahora me hago a la idea. esa podría ser efectivamente una razón. voy a intentarlo mañana y te cuento! ¡gracias!
3 votos
Regeneraría líneas más cortas (utilizando algo así ), que tienen una longitud basada en el diámetro medio aproximado de los polígonos que intersecan. De esta manera el índice espacial funcionará realmente como se espera. A continuación, se cruzan con ST_Union / ST_LineMerge para unir los segmentos de línea.
0 votos
Lo he probado ahora con líneas acortadas y el tiempo de procesamiento ha pasado de 5h a 1h. Así que el bbox parece ser el problema aquí. Ahora he podido hacer el cálculo durante la noche para todas las combinaciones posibles que necesitaba. ¡Gracias por su ayuda!