es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminación de geometrías no intersecantes en PostGIS

Estoy trabajando con datos geoespaciales (bastante grandes). Ahora los polígonos de datos grandes están distribuidos en el mapa y necesito subdividir las áreas de interés (donde tengo datos) en azulejos para trabajar en ellos posteriormente.
Actualmente estoy utilizando el método postgis ST_Square que crea los polígonos del tamaño requerido. Comando para crear azulejos en postgis

ST_SquareGrid(0.2, geom)

geom es el polígono que necesito subdividir y 0.2 es el tamaño en metros en el que estoy creando los azulejos. Estoy utilizando la proyección 3857.

Esta función parece funcionar completamente bien hasta que descubrí que está creando azulejos para el área donde no hay datos disponibles. Como se muestra en la imagen a continuación. Solo debería haber 3 cuadrados ya que el cuarto cuadrado no tiene ningún dato en él.

¿Puede ayudarme a controlar esto para que solo cree los azulejos donde haya datos y evite crear azulejos vacíos?

El enlace a la imagen: Aquí

(La solución puede estar en GeoDjango o PostGis)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución a este problema es utilizar la función ST_Intersects en PostGIS. Esta función se puede utilizar para verificar si una geometría se cruza con otra geometría. En este caso, podemos usarla para verificar si cada mosaico se cruza con el polígono que contiene los datos.

    Aquí hay una forma de implementar esta solución:

    1. Primero, necesitamos crear un polígono que cubra el área donde tenemos los datos. Este polígono debe tener la misma proyección que los mosaicos. Llamemos a este polígono “data_polygon”.
    2. A continuación, podemos utilizar la función ST_Intersects para verificar si cada mosaico se cruza con data_polygon. Así es como podemos modificar la consulta original para incluir esta verificación:

    SELECT (ST_Dump(ST_Intersection(grid.geom, data_polygon.geom))).geom as geom
    FROM (
        SELECT ST_SquareGrid(0.2, geom) AS geom
        FROM some_table
        WHERE some_condition
    ) AS grid
    JOIN data_polygon ON ST_Intersects(grid.geom, data_polygon.geom);
    

    Lo que estamos haciendo aquí es unir la cuadrícula de mosaicos con data_polygon en la condición de que se crucen. Esto solo devolverá los mosaicos que cubren el área con datos.

    1. Por último, podemos agregar un índice en data_polygon para acelerar la verificación de intersección. Podemos crear un índice espacial utilizando el siguiente comando:
    CREATE INDEX data_polygon_idx ON data_polygon USING gist (geom);
    

    Esto creará un índice que debería hacer que la verificación de la intersección sea mucho más rápida.

    Con estas modificaciones, la consulta solo debería devolver mosaicos que cubren el área con datos y no crear mosaicos vacíos.

Comments are closed.