Tengo una tabla de polígonos PostGIS donde algunos se cruzan entre sí. Esto es lo que estoy tratando de hacer:
- Para un polígono determinado seleccionado por id, dame todos los polígonos que se cruzan. Básicamente,
select the_geom from the_table where ST_Intersects(the_geom, (select the_geom from the_table where source_id = '123'))
- A partir de estos polígonos, necesito crear nuevos polígonos para que la intersección se convierta en un nuevo polígono. Entonces, si el polígono A se cruza con el polígono B, obtendré 3 nuevos polígonos: A menos AB, AB y B menos AB.
¿Algunas ideas?
postgis
polygon
intersection
atogle
fuente
fuente
Respuestas:
Como usted dijo que obtiene un grupo de polígonos de intersección para cada polígono que le interesa, puede crear lo que se conoce como "superposición de polígonos".
Esto no es exactamente lo que está haciendo la solución de Adam. Para ver la diferencia, eche un vistazo a esta imagen de una intersección ABC:
Creo que la solución de Adam creará un polígono "AB" que cubre el área de "AB! C" y "ABC", así como un polígono "AC" que cubre "AC! B" y "ABC", y un " BC "polígono que es" BC! A "y" ABC ". Por lo tanto, los polígonos de salida "AB", "AC" y "BC" se superpondrían al área "ABC".
Una superposición de polígonos produce polígonos no superpuestos, por lo que AB! C sería un polígono y ABC sería un polígono.
Crear una superposición de polígonos en PostGIS es bastante sencillo.
Básicamente hay tres pasos.
El paso 1 es extraer la línea [Tenga en cuenta que estoy usando el anillo exterior del polígono, se vuelve un poco más complicado si desea manejar correctamente los agujeros]:
El paso 2 es "nodear" la línea de trabajo (producir un nodo en cada intersección). Algunas bibliotecas como JTS tienen clases "Noder" que puede usar para hacer esto, pero en PostGIS la función ST_Union lo hace por usted:
El paso 3 es crear todos los polígonos no superpuestos posibles que pueden provenir de todas esas líneas, realizado por la función ST_Polygonize :
Puede guardar la salida de cada uno de esos pasos en una tabla temporal, o puede combinarlos en una sola declaración:
Estoy usando ST_Dump porque la salida de ST_Polygonize es una colección de geometría, y (generalmente) es más conveniente tener una tabla donde cada fila sea uno de los polígonos que componen la superposición de polígonos.
fuente
ST_ExteriorRing
cae cualquier agujero.ST_Boundary
preservará los anillos interiores, pero también creará un polígono dentro de ellos.Si entiendo correctamente, quieres tomar (A es la geometría izquierda, B es la derecha):
Imagen de A∪B http://img838.imageshack.us/img838/3996/intersectab1.png
Y extraer:
A ∖ AB
Imagen de A ∖ AB http://img830.imageshack.us/img830/273/intersectab2.png
AB
Imagen de AB http://img828.imageshack.us/img828/7413/intersectab3.png
y B ∖ AB
Imagen de B ∖ AB http://img839.imageshack.us/img839/5458/intersectab4.png
Es decir, tres geometrías diferentes para cada par de intersección.
Primero, creemos una vista de todas las geometrías de intersección. Asumiendo que el nombre de su tabla es
polygons_table
, usaremos:Ahora tenemos una vista (prácticamente, una tabla de solo lectura) que almacena pares de gemas que se cruzan, donde cada par aparece solo una vez debido a
t1.id<t2.id
condición.Ahora reunamos sus intersecciones
A∖AB
,AB
yB∖AB
, usando SQLUNION
en las tres consultas:Notas:
&&
operador se utiliza como filtro antes que elintersects
operador, para mejorar el rendimiento.VIEW
consulta gigantesca en lugar de una gigantesca; Esto es solo por conveniencia.AB
es la unión, no la intersección, deA
yB
- Use ST_Union en lugar de st_intersection en laUNION
consulta en los lugares apropiados.∖
signo es un signo unicode para establecer diferencia; elimínelo del código si confunde su base de datos.fuente
Lo que está describiendo es la forma en que el operador de Union trabaja en ArcGIS, pero es un poco diferente de Union o Intersection en el mundo GEOS. El manual de Shapely tiene ejemplos de cómo funcionan los conjuntos en GEOS . Sin embargo, el wiki de PostGIS tiene un buen ejemplo con el trabajo de línea que debería ser el truco para usted.
Alternativamente, podría calcular tres cosas:
Esos deberían ser los tres polígonos que mencionaste en tu segundo punto.
fuente
Algo como:
INSERTAR EN NUEVOS VALORES DE TABLA ((seleccione id, the_geom de old_table donde st_intersects (the_geom, (seleccione the_geom de old_table donde id = '123')) = true
EDITAR: necesita la intersección real del polígono.
INSERTAR EN los valores de new_table ((seleccione id, ST_Intersection (the_geom, (seleccione the_geom de antiguo donde id = 123))
A ver si eso funciona.
fuente