Copia degli attributi da un livello poligonale a un altro?


11

Ho un problema che non riesco a farmi girare la testa. Ho due livelli poligonali:

  • Poligono A: è un sottoinsieme del poligono B con gli stessi campi e ha poligoni identici al poligono B
  • Poligono B: contiene i dati degli attributi che desidero essere nel Poligono A

Come si può fare? Ho provato lo strumento QGIS "Unisci attributi per posizione" ma poiché alcuni poligoni si trovano all'interno di altri, tende a collegarsi al primo incrocio che trova (il poligono esterno).


creare centroidi (punti) del poligono A e unire gli attributi a B ed esportarli in un nuovo file per preservare gli attributi da A.
Mapperz

3
@Mapperz Questo è un approccio pericoloso, perché può produrre errori anche se di solito genererà una risposta dall'aspetto probabile. Se i poligoni si sovrappongono, tutte le scommesse sono disattivate. Anche quando non ci sono sovrapposizioni, è possibile che il centroide di un poligono si trovi all'interno di un poligono diverso (non sovrapposto). La correttezza può essere garantita in generale solo quando tutti i poligoni in A sono non sovrapposti e convessi.
whuber

+1 @ Diego - la tua domanda porta a discussioni / dibattiti piuttosto interessanti; uno interessante a quello!
Dano,

Risposte:


9

@Dano solleva giustamente alcuni problemi che sono meglio risolti in una risposta completa.

Una difficoltà , già notata da @Celenius, è che un'unione tra B e A (in entrambe le direzioni) duplica tutti i campi; può essere oneroso correggerlo. Ho suggerito nei commenti che l'ovvio modo semplice (esportazione in un foglio di calcolo) solleva questioni di integrità dei dati. Un'altra difficoltà , già affrontata dalla proposta di Celenius, riguarda la risoluzione di questo problema quando nessuna combinazione di attributi può servire da chiave sia per A che per B, poiché ciò impedisce un join al database. L'unione spaziale aggira quel problema.

Qual è, allora, una buona soluzione? Un approccio utilizza A per identificare i record corrispondenti di B contenenti i dati desiderati. A seconda delle ipotesi sulle configurazioni dei poligoni - se si sovrappongono, se alcuni possono contenere altri, ecc. - Ciò può essere effettuato in vari modi: usando uno strato per selezionare oggetti nell'altro, o tramite unioni. Il punto qui è che tutto ciò che vogliamo fare in questa fase è selezionare il sottoinsieme di B corrispondente ad A.

Dopo aver raggiunto quella selezione, esporta la selezione e lascia che sostituisca A. Fatto .

Questa soluzione presuppone che tutti i campi in B siano destinati a sostituire le loro controparti in A. In caso contrario, è davvero necessario eseguire un join 1-1 di B (sorgente) con A (destinazione). Il join basato sugli identificatori è il migliore, ma fare un join sull'identità poligonale (Celenius) funziona bene se gli ID non sono disponibili e non è possibile che le corrispondenti forme poligonali in A e B possano differire, anche se leggermente . (Questo è un punto sottile, e la potenziale causa di errori insidiosi, perché le precedenti modifiche in B ai poligoni che non corrispondono ad A potrebbero comunque modificare in modo invisibile gli altri poligoni in B se il GIS sta "scattando" o "mantenendo la topologia" o altrimenti apportando automaticamente modifiche globali durante le modifiche locali.)

In questo frangente, ci sono due copie di ogni campo: se [Foo] è un campo comune ad A e B, allora il join contiene A. [Foo] e B. [Foo]. Utilizzando un calcolo di campo , copiare B. [Foo] in A. [Foo]. Ripetere l'operazione per tutti i campi necessari. Al termine, rimuovere il join.

Sebbene questa procedura possa essere un po 'onerosa quando sono coinvolti molti campi, i suoi meriti includono

  • Scrivere è semplice e veloce.
  • Lo scripting lascia una traccia di controllo che documenta l'elaborazione in corso sui dati. Questo è fondamentale per proteggere l'integrità dei dati.
  • Difende da alcuni tipi di errori all'ingrosso, come la conservazione del campo errato dopo l'unione (mantenendo quindi i vecchi dati anziché i nuovi dati per quel campo) o l'eliminazione di un campo cruciale.
  • Sfrutta le difese integrate offerte dal sistema di gestione del database, come l'applicazione del tipo di dati e l'applicazione delle regole di business, che operano per prevenire e identificare errori e per mantenere la coerenza tra tutte le tabelle e i livelli nel database.

Alcuni dei principi guida coinvolti in questo suggerimento sono

  1. Utilizzare un sistema di gestione del database per elaborare i dati anziché utilizzare software non progettato o non idoneo per questa attività.
  2. Evitare di modificare le strutture del database (come eliminare o aggiungere campi) quando le operazioni non lo richiedono assolutamente.
  3. Utilizzare le funzionalità del software per l'automazione per semplificare il lavoro, documentarlo e rendere le operazioni riproducibili.

Si potrebbe obiettare che in molti casi ci sono modi più veloci e più facili per raggiungere lo stesso risultato. Sì, ci può essere e possono essere efficaci e di solito funzionano se eseguiti con cura. Ma le soluzioni che rischiano i dati sono difficili da raccomandare e difendere come risposte di carattere generale. Sono meglio impiegati in situazioni una tantum con piccoli set di dati in cui la corruzione nei dati dovrebbe rapidamente diventare evidente e le conseguenze di tali errori sono irrilevanti.


+1 @ whuber - È ovvio che hai tentato di soppesare tutte le variabili qui; una risposta ben ponderata. Si prega di vedere l'aggiunta alla mia risposta originale, poiché finirò lo spazio nella casella di commento.
Dano,

1
per le persone che si chiedono cosa sia successo al "Celenius" menzionato vari punti in questa discussione: ora conosci come @djq, e la sua risposta è qui . Complimenti per la macchina del ritorno: web.archive.org/web/20120127210858/http://gis.stackexchange.com/…
matt wilkie

5

In Arcmap è possibile unire spazialmente il poligono B al poligono A; questo metterebbe in relazione gli attributi. Poiché i nomi dei campi sono gli stessi, verrà creata una nuova combinazione del nome.


Questo è ciò che vorrei mettere. Ai miei occhi, questa breve risposta è quella giusta.
Simon,

4

Esporta la tabella per Shapefile "B" in Excel ed elimina le colonne ridondanti e tutte le colonne contenenti informazioni non necessarie. Assicurati di mantenere la colonna dell'identificatore condiviso, quindi salvala nella cartella appropriata. Vai su ArcMap, aggiungi la tabella, quindi fai clic con il pulsante destro del mouse su Shapefile "A" e conduci un join di tabella . Il collegamento dovrebbe portare a un video su come eseguire questa operazione.


@ whuber - L'intero approccio è solido e garantisce l'integrità dei dati. L'unica cosa che posso dire per confutare questa risposta è che certe situazioni / progetti non ci offrono il tempo o il budget per essere così metodici nel nostro approccio.

Un esempio realistico:

Una Junior Mining Company è seduta su un importante organo minerario con centinaia di milioni di dollari in infusioni di denaro contante sulla sua capacità di "provare" la risorsa. Una revisione desktop di pubblicazioni e mappe / dati geologici porta a un programma di esercitazione molto mirato e molto costoso. Quando i dosaggi tornano dalla prima esecuzione, questi valori vengono taggati nelle rispettive posizioni dei punti tramite un join di tabella e pompati indietro in un formato Excel in cui i dati vengono accuratamente preparati per l'importazione in DataMine (per l'interpolazione 3D di corpi).

Nella mia esperienza , il progetto Geologists ha richiesto che questi dati fossero preparati in Excel, che seguisse OGNI regola / convenzione di formattazione alla lettera (nessuno spazio, nessun carattere speciale, ecc.) E che il file di importazione DataMine fosse consegnato in un formato .csv (allora comunque). Ciò porterebbe a maggiori investimenti nella perforazione mirata e rivisiteremmo il processo (in alcuni casi) più volte. Tutto ciò si è verificato generalmente in una sequenza temporale estremamente rigorosa e critica.

Ognuno di noi ha la propria storia e la propria gamma di esperienze che abbiamo incorporato nel nostro approccio al modo in cui facciamo le cose. Detto questo, la mia esperienza ha visto Excel come una necessità assoluta e uno strumento vitale nei miei flussi di lavoro; è quello che so. Abbiamo preso tutte le precauzioni di QA / QC nella preparazione di questi dati. Dove voi ragazzi evitiate Excel, non avevo altra scelta che usarlo.


(-1) Usare Excel per fare un join non è solo più difficile che realizzarlo con un GIS o RDBMS, ma invita anche a gravi errori.
whuber

8
Excel è semplice, funziona e per questo motivo è probabilmente responsabile di errori all'ingrosso non rilevati rispetto a qualsiasi altro software mai prodotto. Viola i principi di base dei DBMS sviluppati per proteggere da errori che Excel rende troppo facili da commettere, come (1) ordinare alcune colonne ma non altre; (2) errori tipografici che cambiano i tipi di dati; (3) sequenze di tasti vaganti che cancellano i dati; (4) cancellazione involontaria di righe o colonne; (5) conversione nascosta di dati, come testo in date; (6) troncamento nascosto dei dati; (7) arrotondamento nascosto di valori numerici; e tanti altri.
whuber

2
questa risposta e il conseguente commento sono una meravigliosa illustrazione di come una "cattiva" risposta possa invocare buoni risultati, rivelando informazioni che altrimenti non potrebbero venire alla luce. Per favore, non sentirti come se dovessi eliminarlo per evitare di "colpire".
Matt Wilson

3
... e per compensare il successo, una GRANDE DOMANDA sarebbe quella di chiedere perché l'uso di Excel per elaborare i dati può portare a problemi molto seri. E come usarlo in sicurezza.
matt wilkie,

1
(+1) Per la modifica ponderata e ben descritta. @matt Dai un'occhiata alle discussioni su stats.stackexchange.com riguardo a Quale sarebbe un buon modo di lavorare con un set di dati di grandi dimensioni in Excel? ed Excel come workbench statistico .
whuber

1

Alla fine degli anni '90 abbiamo ricevuto un aggiornamento su larga scala a tutti i nostri corpi idrici e corsi d'acqua, che copre circa 55 fogli di mappe NTS e un numero di migliaia non registrato. Dovevamo mantenere gli attributi a valore aggiunto della nostra vecchia idrologia (nomi dei laghi, elevazione della superficie, ecc.) E sostituire la geometria. La geometria del vecchio e del nuovo era abbastanza vicina da poter garantire che i centroidi di ciascun poligono sarebbero ancora delimitati dai nuovi confini del poligono - questo è un punto importante, senza questa certezza di base l'approccio di seguito non è una buona idea.

La soluzione in questo caso particolare era invece di portare gli attributi alla geometria, portare la geometria agli attributi. Quindi, concettualmente:

  1. da * Layer_with_attributes *, elimina i poligoni ma conserva i record della tabella,
  2. da * Layer_with_polys * copia e incolla la geometria in * Layer_with_attributes *
  3. unisci e salva.

Vedi qui per una descrizione più estesa e la ricetta per . Non sono nemmeno sicuro che nei moderni Arcgis o Qgis sia possibile eliminare una geometria senza eliminare contemporaneamente il record degli attributi, ma ehi, nel caso lo fosse, ecco l'idea.


1

Non sono sicuro, ma forse alcuni DBMS eseguono operazioni di uguaglianza sui campi Shape in SQL (?). Mi sembra che se due geometrie sono identiche l' =operatore SQL dovrebbe restituire true ( WHERE A.Shape = B.Shape).

Se questo è vero per il database che si sta utilizzando, si dovrebbe essere in grado di eseguire un join spaziale utilizzando la stessa sintassi che si farebbe per un join non spaziale.


Sembra che il metodo ST_Equals (uno standard OGC) possa essere utilizzato per questo.


0

Come al solito whuber ha ragione. Devi riflettere attentamente sul tuo processo. Soprattutto se si tratta di insiemi di dati di grandi dimensioni e questa operazione verrà eseguita più volte o se i dati sono di importanza critica.

Considera i tuoi dati e le tue responsabilità:

Cos'hai fatto?

Cosa stai facendo?

Che cosa hai intenzione di fare?

E chiedi sempre: perché?


Ora per una risposta semplice diretta direttamente alla domanda posta. Tenendo presente che ci sono sempre almeno 5 modi per fare le cose, ma di solito solo un modo migliore.

Supponendo che il set completo abbia tutti gli attributi che si desidera siano nel sottoinsieme e il sottoinsieme non ha nulla che non sia già nel set completo tranne le informazioni obsolete.

Indovinando che la topologia del sottoinsieme corrisponde al set completo (inclusi Origine / Proiezione e Tolleranza XY).

1) Utilizzare la funzione Feature to Point con la casella "Inside" selezionata e creare una classe feature punti o shapefile dal sottoinsieme.

2) Utilizzare un Seleziona per unione spaziale per trovare tutti i poligoni nel set completo che corrispondono al sottoinsieme in base alla classe di feature Punto o al file di forma appena creati.

3) Esporta la selezione dal set completo e può essere il tuo nuovo sottoinsieme.


0

Sicuramente, se il poligono A è un sottoinsieme del poligono B, l'approccio più semplice sarebbe quello di passare in rassegna il poligono A, utilizzare l'ID che si troverebbe nel poligono A (e B se A fosse un sottoinsieme o B) per cercare i dati della riga in Poligono B, quindi aggiorna la riga in Poligono A.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.