Unión PostGIS entre dos tablas, preservando atributos

8

Estoy tratando de unir los límites del gobierno de los niveles superior e inferior del nivel de los Estados Unidos de tal manera que genere una tabla PostGIS con los nombres de los niveles superior e inferior para cada forma.

En mi ejemplo a continuación, Ues un conjunto de datos y tiene una columna con filas UAy UB. Les otro conjunto de datos y tiene LA, LBy LC. Cuando Lunimos las formas juntas, debería obtener las mismas formas pero el nuevo conjunto de datos unido tiene ambas columnas de datos.

ingrese la descripción de la imagen aquí

Editar : Mi imagen de ejemplo anterior es bastante desagradable. Las respuestas hasta ahora se han relacionado con la consulta de los datos suponiendo que la geometría esté disponible. Esto es importante pero se saltea la parte más confusa de mi pregunta. Un mejor ejemplo:

imagen

La forma amarilla es de U, la forma naranja es de L. Tenga en cuenta que se superponen, pero algunas piezas de los polígonos no están contenidas completamente dentro de otra forma (como en mi ejemplo, dónde LBy LCestán completamente dentro UB).

La pregunta que intentaba hacer es cortar correctamente las dos capas para que el conjunto de datos resultante no tenga superposiciones. Vea, por ejemplo, esta publicación de la lista de correo que se acerca pero no funciona del todo.

MagneticMonster
fuente
1
Comentario secundario: llamar a esto una "unión", que es el término ESRI para la operación, será confuso para las personas de PostGIS, ya que la función ST_Union hace lo contrario de esto (lo que ESRI llama "disolver") y fusiona las características. Un término neutral para el vendedor podría ser "superposición".
Paul Ramsey
Creo que mi pregunta es muy similar a esta que ya se hizo y se respondió bastante bien.
magneticMonster

Respuestas:

5

Sin saber los nombres de sus columnas, esta es mi mejor suposición. (No he tenido la oportunidad de hacer una prueba, por lo que puede que no sea exactamente correcto). Espero que pueda averiguar los nombres de columna que utilicé. Suponiendo que L es un subconjunto de U:

SELECT l.id AS l_id, u.ab AS uab, l.abc AS labc, ST_Intersection(u.geom, l.geom) AS geom
  FROM u, l
  WHERE ST_Intersects(ST_PointOnSurface(l.geom), u.geom);
Scro
fuente
2
Esto es correcto, consulte también gis.stackexchange.com/a/31562/457 para ver un ajuste de rendimiento en este enfoque.
Paul Ramsey
Esto es perfecto una vez que tengo las formas generadas, pero primero necesito construir las formas unidas. Mi dibujo de ejemplo no es el mejor para demostrar esto, pero primero necesito cortar las geometrías para que no haya superposiciones.
magneticMonster
Creo que no leyó el SQL lo suficientemente cerca, está generando nuevas formas que consisten solo en las áreas compartidas. El resultado de esta consulta no tiene características superpuestas.
Paul Ramsey
Tienes toda la razón, Paul. Creo que quise comentar la respuesta de Nicklas a continuación.
magneticMonster
1

La respuesta depende de cuán limpios y consistentes sean sus datos. Si puede suponer que el centroide de la tabla L se puede encontrar dentro del polígono correspondiente en la tabla U, puede escribir algo como:

SELECT * FROM U INNER JOIN L ON ST_Intersects(L.Centroid(geom),U.geom);

Entonces deberías obtener lo que quieres. Si usa toda la geometría en lugar del centroide de L, obtendrá muchas coincidencias extrañas.

HTH

Nicklas

Nicklas Avén
fuente
Tenga en cuenta que la función Centroide no garantiza un punto que se encuentre dentro del polígono. ST_PointOnSurface lo hace.
Scro
@Scro tienes toda la razón. Señorita de mi parte.
Nicklas Avén