4 votos

PostGIS Intersección comportamiento extraño

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

He aquí un ejemplo: example

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.

3voto

davidsleeps Puntos 4437

He reproducido tu problema y he hecho algunas pruebas. He creado una intersección entre una capa de polígonos y con líneas horizontales (cada km), luego con líneas a 45°, y luego con las mismas líneas a 45° divididas cada km verticalmente (lo que equivale a sqrt(2) = 1.414 km).

enter image description here

Estos son los resultados de la consulta de intersección:

  • horizontal : 8,7 seg (sin índice)
  • horizontal : 8,9 seg (índice)
  • 45° : 60 seg (sin índice)
  • 45° : 61 seg (índice)
  • 45° split : 120 seg (sin índice)
  • 45° split : 32,2 seg (índice)

Así que parece que el índice espacial no tiene mucho impacto con líneas largas. Resulta más útil con líneas más cortas.

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