Me enfrento a un desafío con PostGIS que yo no puedo envolver mi cabeza alrededor. Sé que puedo resolver esto mediante un lenguaje de programación (y que es mi copia de seguridad-plan), pero realmente no se como resolver esto en PostGIS. He intentado buscar, pero no pudo encontrar ninguna respuesta que coincide con mi problema, esto podría ser porque estoy seguro de mis términos de búsqueda, así que por favor perdonen y me apunte en la dirección correcta de allí, de hecho, es una respuesta.
Mi problema es el siguiente:
- Tengo una tabla con una mezcla de Polígonos/Multipolígonos
- Cada uno (multi), el polígono tiene un atributo que se ubica (prioridad)
- Cada polígono tiene también un valor que me gustaría saber
- Tengo un área de búsqueda (polígono)
- Para mi área de consulta, quiero encontrar el área cubierta por cada polígono valor
Ejemplo:
Decir que tengo los tres polígonos que se representan en rojo, verde, añil y aquí:
Y que la más pequeña, rectángulo azul es mi consulta polígono
Además, los atributos son
geom | rank | value
-------|------|----
red | 3 | 0.1
green | 1 | 0.2
indigo | 2 | 0.2
Lo que quiero es seleccionar estas geometrías, de modo que el valor más alto (verde) ocupa todo el área de lo que puede (que yo.e la intersección entre mi consulta geom y que geom), a continuación, el siguiente más alto (índigo) llena la intersección entre la consulta geom y la geom MENOS los ya cubiertos) etc.
He encontrado esta pregunta: Utilizando ST_Difference para eliminar la superposición de funciones? pero no parece hacer lo que quiero.
Puedo yo entender cómo calcular áreas y tal, así que una consulta que me da las tres geometrías como se muestra en la segunda imagen se ve bien!
Información adicional: - Esta no es una tabla grande (~2000 filas) - no puede ser cero o varias superposiciones (no tres) - no puede ser de cualquiera de los polígonos en mi área de consulta (o sólo en algunas de sus partes) - me estoy quedando postgis 2.3 en postgres 9.6.6
Mi solución alternativa es hacer una consulta como esta:
SELECT
ST_Intersection(geom, querygeom) as intersection, rank, value
FROM mytable
WHERE ST_Intersects(geom, querygeom)
ORDER by rank asc
Y, a continuación, de forma iterativa "cortar" las partes de las geometrías en el código. Pero, como he dicho, realmente me gustaría hacer esto en PostGIS