¿Copiar atributos de una capa de polígono a otra?

11

Tengo un problema que parece que no puedo entender. Tengo dos capas poligonales:

  • Polígono A: es un subconjunto del polígono B con los mismos campos y tiene polígonos idénticos al Polígono B
  • Polígono B: tiene los datos de atributo que quiero tener en el Polígono A

¿Cómo se puede hacer esto? Probé la herramienta QGIS "Unir atributos por ubicación", pero como algunos de los polígonos están dentro de otros, tiende a vincularse a la primera intersección que encuentra (el polígono externo).

Diego R
fuente
crear centroides (puntos) del Polígono A y unir los atributos a B y exportar a un nuevo archivo para preservar los atributos de A.
Mapperz
3
@Mapperz Este es un enfoque peligroso, ya que puede producir errores a pesar de que generalmente generará una respuesta probable. Si los polígonos se superponen, todas las apuestas están canceladas. Incluso cuando no hay superposiciones, es posible que el centroide de un polígono se encuentre dentro de un polígono diferente (sin superposición). La corrección se puede garantizar en general solo cuando todos los polígonos en A no se superponen y son convexos.
Whuber
+1 @ Diego: su pregunta condujo a una discusión / debate bastante interesante; una interesante en eso!
Dano

Respuestas:

9

@Dano plantea con razón algunos problemas que se abordan mejor en una respuesta completa.

Una dificultad , ya señalada por @Celenius, es que una unión entre B y A (en cualquier dirección) duplica todos los campos; Puede ser oneroso corregir esto. He sugerido en los comentarios que la forma fácil y obvia (exportar a una hoja de cálculo) plantea preguntas sobre la integridad de los datos. Otra dificultad , ya abordada por la propuesta de Celenius, se refiere a resolver este problema cuando ninguna combinación de atributos puede servir como clave para A y B, porque eso impide una unión a la base de datos. La unión espacial soluciona ese problema.

¿Cuál es, entonces, una buena solución? Un enfoque utiliza A para identificar los registros correspondientes de B que contienen los datos deseados. Dependiendo de los supuestos sobre las configuraciones de los polígonos, si se superponen, si algunos pueden contener otros, etc., esto puede llevarse a cabo de varias maneras: usando una capa para seleccionar objetos en la otra, o mediante uniones. El punto aquí es que todo lo que queremos hacer en esta etapa es seleccionar el subconjunto de B correspondiente a A.

Habiendo logrado esa selección, exporte la selección y deje que reemplace A. Hecho .

Esta solución asume que todos los campos en B están destinados a reemplazar sus contrapartes en A. Si no, entonces es realmente necesario realizar una unión 1-1 de B (fuente) a A (destino). La unión basada en identificadores es la mejor, pero hacer una unión en la identidad del polígono (Celenius) funciona bien si los identificadores no están disponibles y no hay posibilidad de que las formas de los polígonos correspondientes en A y B difieran, aunque sea ligeramente . (Este es un punto sutil, y la causa potencial de errores insidiosos, porque las ediciones previas en B a polígonos que no corresponden a A aún podrían modificar invisiblemente los otros polígonos en B si el SIG está "encajándose" o "manteniendo la topología" o realizar cambios globales de forma automática durante las ediciones locales).

En esta coyuntura, hay dos copias de cada campo: si [Foo] es un campo común para A y B, entonces la unión contiene A. [Foo] y B. [Foo]. Usando un cálculo de campo , copie B. [Foo] en A. [Foo]. Repita para todos los campos necesarios. Una vez hecho esto, elimine la unión.

Aunque este procedimiento puede ser un poco oneroso cuando hay muchos campos involucrados, sus méritos incluyen

  • Es sencillo y rápido de escribir.
  • La secuencia de comandos deja una pista de auditoría que documenta el procesamiento que se realiza en los datos. Esto es crucial para proteger la integridad de los datos.
  • Se defiende contra algunos tipos de errores mayoristas, como retener el campo incorrecto después de la unión (manteniendo así los datos antiguos en lugar de los nuevos para ese campo) o eliminar un campo crucial.
  • Aprovecha las defensas integradas que ofrece el sistema de gestión de la base de datos, como la aplicación de los tipos de datos y la aplicación de las reglas comerciales, que funcionan para prevenir e identificar errores y para mantener la coherencia entre todas las tablas y capas de la base de datos.

Algunos de los principios rectores involucrados en esta sugerencia son

  1. Use su sistema de administración de base de datos para procesar datos en lugar de usar software no diseñado o inadecuado para esta tarea.
  2. Evite cambiar las estructuras de la base de datos (como eliminar o agregar campos) cuando las operaciones no lo requieren absolutamente.
  3. Use las capacidades de automatización del software para simplificar el trabajo, documentarlo y hacer que las operaciones sean reproducibles.

Uno podría objetar que en muchos casos hay formas más rápidas y fáciles de alcanzar el mismo resultado. Sí, puede haber, y pueden ser efectivos y generalmente funcionan cuando se realizan con cuidado. Pero las soluciones que ponen en riesgo los datos son difíciles de recomendar y defender como respuestas de uso general. Se emplean mejor en situaciones puntuales con pequeños conjuntos de datos donde la corrupción en los datos debería volverse rápidamente evidente y las consecuencias de tales errores son irrelevantes.

whuber
fuente
+1 @ whuber: es obvio que ha intentado sopesar todas las variables aquí; Una respuesta bien pensada. Consulte la adición a mi respuesta original, ya que me quedaré sin espacio en este cuadro de comentarios.
Dano
1
para las personas que se preguntan qué pasó con el "Celenius", mencionaron varios lugares en este hilo: ahora conocido como @djq, y su respuesta está aquí . Felicitaciones a la máquina wayback: web.archive.org/web/20120127210858/http://gis.stackexchange.com/…
matt wilkie
5

En Arcmap, puede unir espacialmente el Polígono B al Polígono A; Esto relacionaría los atributos. Como los nombres de los campos son los mismos, creará una nueva combinación del nombre.

djq
fuente
Esto es lo que pondría. A mis ojos, esta respuesta corta es la correcta.
Simon
4

Exporte la tabla para Shapefile "B" a Excel y elimine las columnas que son redundantes y cualquier columna que contenga información que no necesita. Asegúrese de mantener su columna de identificador compartido, luego guárdela en la carpeta correspondiente. Vaya a ArcMap, agregue la tabla, luego haga clic con el botón derecho en Shapefile "A" y realice una unión a la tabla . El enlace debería conducir a un video sobre cómo hacer esto.


@ whuber: todo el enfoque es sólido y garantiza la integridad de los datos. Lo único que puedo decir para refutar esta respuesta es que ciertas situaciones / proyectos no nos dan el tiempo o el presupuesto para ser tan metódicos en nuestro enfoque.

Un ejemplo fiel a la vida:

Una empresa minera junior está sentada en un importante yacimiento con cientos de millones de dólares en infusiones de efectivo que se basan en su capacidad para "probar" el recurso. Una revisión de escritorio de publicaciones y mapas / datos de geología conduce a un programa de perforación muy específico y muy costoso. Cuando los ensayos regresan de la primera ejecución, estos valores se etiquetan en sus ubicaciones de puntos respectivas a través de una unión de tabla y se vuelven a extraer en un formato Excel donde los datos se preparan meticulosamente para importarlos a DataMine (para la interpolación 3D de cuerpos de mineral).

En mi experiencia , los geólogos del proyecto requerían que estos datos se prepararan en Excel, que siguieran CADA regla / convención de formato al pie de la letra (sin espacios, sin caracteres especiales, etc.) y que el archivo de importación de DataMine se entregara en formato .csv (en aquel entonces de todos modos). Esto conduciría a una mayor inversión en perforación dirigida, y revisaríamos el proceso (en algunos casos) muchas veces. Todo esto generalmente ocurrió en una línea de tiempo excepcionalmente apretada y crítica.

Cada uno de nosotros tiene nuestra propia historia y nuestra propia gama de experiencias que hemos incorporado a nuestro enfoque sobre cómo hacemos las cosas. Dicho esto, mi experiencia ha visto a Excel como una necesidad absoluta y una herramienta vital en mis flujos de trabajo; Es lo que sé. Tomamos todas las precauciones de control de calidad / control de calidad en la preparación de estos datos. Donde ustedes rehuirían a Excel, no tuve más remedio que usarlo.

Dano
fuente
(-1) Usar Excel para hacer una unión no solo es más difícil que lograrlo con un SIG o RDBMS, sino que también genera errores graves.
whuber
8
Excel es simple, funciona y, debido a eso, es probable que sea responsable de más errores no detectados y mayoristas que cualquier software jamás producido. Viola los principios básicos de los DBMS que se desarrollaron para proteger contra errores que Excel hace demasiado fáciles de cometer, como (1) ordenar algunas columnas pero no otras; (2) errores tipográficos que cambian los tipos de datos; (3) pulsaciones de teclas extraviadas que borran datos; (4) eliminación accidental de filas o columnas; (5) conversión oculta de datos, como texto a fechas; (6) truncamiento oculto de datos; (7) redondeo oculto de valores numéricos; y muchos más.
whuber
2
Esta respuesta y el comentario resultante es una ilustración maravillosa de cómo una respuesta "mala" puede invocar buenos resultados, revelando información que de otro modo no saldría a la luz. No sienta que debería eliminarlo para evitar "recibir un golpe".
Matt Wilkie
3
... y para compensar el golpe, una gran pregunta sería preguntar por qué el uso de Excel a datos de proceso puede conducir a problemas muy serios. Y cómo usarlo de manera segura.
Matt Wilkie
1
(+1) Para la edición reflexiva y bien descrita. @matt Vea las discusiones en stats.stackexchange.com sobre ¿Cuál sería una buena manera de trabajar con un gran conjunto de datos en Excel? y Excel como banco de trabajo de estadísticas .
whuber
1

A fines de la década de 1990, recibimos una actualización a gran escala de todos nuestros cuerpos de agua y cursos de agua, cubriendo unas 55 hojas de mapas NTS y ​​miles de características no recordadas. Necesitábamos mantener los atributos de valor agregado de nuestra antigua hidrología (nombres de lago, elevación de superficie, etc.) y reemplazar la geometría. La geometría de lo antiguo y lo nuevo era lo suficientemente cercana como para garantizar que los centroides de cada polígono aún estarían delimitados por los nuevos límites del polígono; este es un punto importante, sin esta certeza básica, el enfoque a continuación no es una buena idea.

La solución en este caso particular fue, en lugar de llevar los atributos a la geometría, llevar la geometría a los atributos. Entonces, conceptualmente:

  1. desde * Layer_with_attributes *, elimine polígonos pero mantenga registros de tabla,
  2. desde * Layer_with_polys * copiar y pegar geometría en * Layer_with_attributes *
  3. fusionar y guardar.

Consulte aquí para obtener una descripción más extendida y una receta para . No estoy seguro de que incluso sea posible en Arcgis o Qgis modernos eliminar una geometría sin eliminar simultáneamente su registro de atributos, pero bueno, por si acaso, esta es la idea.

wilkie mate
fuente
1

No estoy seguro, pero quizás algunos DBMS realizan operaciones de igualdad en los campos Shape en SQL (?). Me parece que si dos geometrías son idénticas, el =operador SQL debería devolver true ( WHERE A.Shape = B.Shape).

Si esto es cierto para la base de datos que está utilizando, debería poder hacer una unión espacial utilizando la misma sintaxis que usaría para una unión no espacial.


Parece que el método ST_Equals (un estándar OGC) podría usarse para esto.

Kirk Kuykendall
fuente
0

Como siempre, Whuber tiene razón. Necesita pensar detenidamente sobre su proceso. Especialmente si se trata de grandes conjuntos de datos y esta operación se llevará a cabo muchas veces o si los datos son de misión crítica.

Considere sus datos y responsabilidades:

¿Qué has hecho?

¿Qué estás haciendo?

¿Que estas intentando hacer?

Y siempre pregunta: ¿por qué?


Ahora una respuesta fácil dirigida directamente a la pregunta formulada. Teniendo en cuenta que siempre hay al menos 5 formas de hacer las cosas, pero generalmente solo hay una mejor manera.

Asumiendo que el conjunto completo tiene todos los atributos que desea que estén en el subconjunto y el subconjunto no tiene nada que no esté en el conjunto completo, excepto información desactualizada.

Adivinando que la topología del subconjunto coincide con el conjunto completo (incluido Origen / Proyección y Tolerancia XY).

1) Use la función para señalar con la casilla de verificación "Interior" marcada y cree una clase de entidad de puntos o un archivo de forma desde el subconjunto.

2) Use Seleccionar por unión espacial para buscar todos los polígonos en el conjunto completo que correspondan al subconjunto en función de la clase de entidad de punto o el archivo de forma recién creados.

3) Exporte la selección desde el conjunto completo, y ese puede ser su nuevo subconjunto.

usuario23715
fuente
0

Seguramente, si el Polígono A es un subconjunto del Polígono B, el enfoque más sencillo sería recorrer el Polígono A, usar la ID que estaría en el Polígono A (y B si A fuera un subconjunto o B) para buscar los datos de la fila en Polígono B y luego actualice la fila en el Polígono A.

Peludo
fuente