Come modificare facilmente i dati degli attributi usando le espressioni regolari?


30

Sto scrivendo un tutorial per gli studenti di Master che utilizza QGIS. Una delle attività richiede che i dati degli attributi siano modificati (vedi la bozza del tutorial qui se interessati).

La domanda è come farli modificare i dati degli attributi. So che questa domanda è stata posta in precedenza e la risposta era semplice: basta usare LibreOffice calc per modificarlo e quindi salvarlo, assicurandosi che l'ordine delle righe e i titoli delle colonne siano mantenuti gli stessi. Ho usato questo approccio in precedenza con grande efficacia.

Sfortunatamente, la soluzione non funziona più: salvataggio del file .dbf in LibreOffice (5.4.2) o OpenOffice (3.4.1) Calc rimescola i dati dal punto di vista di QGIS (nella tabella degli attributi appaiono solo numeri interi casuali), e crea invece un file .dbt aggiuntivo.

Quindi, per arrivare alla domanda: come posso dire a una classe di studenti di laurea specialistica di farlo la prossima settimana? Ho considerato le seguenti opzioni:

  1. Usa R invece (ottimo per me, ma spaventoso per gli studenti)
  2. Modifica il file come .csv, quindi unisciti in base al timestamp (va bene, ma sembra eccessivamente complesso e potrebbe introdurre più errori nella pratica di 2 ore)
  3. Usa un programma alternativo: ho provato Gnumeric ed Excel, nessuno dei quali ha generato rapidamente buoni risultati.

Per aiutare a rispondere a questa domanda, ho creato un esempio replicabile . Apri il file "points.shp" in QGIS, osserva la tabella degli attributi e poi chiudi. Modifica un paio di celle nella tabella degli attributi "points.dbf" in LibreOffice - salva. Riaprire "points.shp" in QGIS e osservare la tabella degli attributi rimescolati. Gli altri shapefile nella cartella .zip sono già stati danneggiati da LibreOffice e OpenOffice per illustrare come si presenta il problema.

In breve, come posso risolvere al meglio questo problema?


2
Benvenuti nel sito, vorrei dire che questa è una domanda davvero ben fatta e, si spera, possiamo trovare delle buone soluzioni. Suppongo che un po 'di pitone sia fuori discussione per questi studenti, poiché è così che
affronterei

13
La modifica diretta della parte .DBF di uno shapefile è troppo pericolosa per essere raccomandata per l'uso di routine e non dovrebbe essere utilizzata dai novizi, almeno non se a qualcuno interessano i dati. Tuttavia, è disponibile una soluzione più affidabile di natura simile: mantenere un campo identificativo univoco nel file di forma. Non modificarlo mai. Conserva invece gli attributi in una tabella correlata (in qualsiasi formato leggibile dal tuo GIS), uniti sullo stesso identificatore. Ora, in larga misura, è possibile modificare liberamente la tabella degli attributi senza perdere la connessione tra forma e attributo, purché si protegga il campo identificatore.
whuber

1
Le soluzioni Python andrebbero bene, purché siano facili da implementare e da capire ... Per quanto riguarda il mantenimento di un numero identificativo che è una buona opzione - (opzione 2 nella mia domanda) e probabilmente la mia risposta predefinita. Tuttavia, speravo in una "soluzione rapida" più semplice che non coinvolgesse file aggiuntivi (5 per shapefile è abbastanza IMO!)
RobinLovelace

3
Cosa intendi con 5 per shapefile? Prova 9! :-) (I file indice possono accumularsi, a seconda di quale GIS viene utilizzato.) Una volta che hai bisogno di più di un file correlato per mantenere un set di dati - e gli shapefile ne richiedono almeno tre - non c'è davvero nessun problema in più per aggiungere altri file. Aggiungi anche un file di metadati, mentre ci sei. :-) E una volta impostato il join, non si verifica automaticamente? (Non vedo come il timestamp potrebbe essere usato per il join, tuttavia. Quello sarebbe usato invece per un sistema di controllo della versione.)
whuber

3
Se hai qualche inclinazione a introdurli nei database, spatiaLite ha una GUI per la modifica dei campi e gli strumenti da riga di comando per i dati OSM. Quindi potresti coinvolgere un po 'di SQL e i tuoi studenti sarebbero probabilmente molto più avanti della curva.
Scro

Risposte:


18

Ho trovato la risposta più semplice, in base al consiglio di Ryan Garnett di farlo all'interno di QGIS:

Usa regexp_replace

Questa funzionalità è stata aggiunta al calcolatore di campo 1 anno fa da Jürgen Fischer (come illustrato da questa segnalazione di bug ). Ho provato per un po 'a scoprire come farlo, ma non sono riuscito a cercare "qgis regex" e altri termini vaghi.

La sua funzionalità è probabilmente meglio illustrata dalla necessità di standardizzare tutti i valori nella colonna "nome". Ad esempio, se è necessario sostituire tutte le celle che contengono il modello "Tesc" con "Tesco", rimuovendo le informazioni superflue come "Tesco, Infirmary Road" (che i collaboratori OSM aggiungono frequentemente), è possibile utilizzare la seguente funzione:

regexp_replace ("nome", 'Tesc. *', 'Tesco')

inserisci qui la descrizione dell'immagine

Immagino che questa sia la funzionalità di espressione regolare di Pythonic, in quanto è leggermente diversa da grep, che ho usato prima.

Penso che sia necessaria più documentazione (i dettagli sul sito Web QGIS sono limitati a poche parole) su come funziona, quindi ho aggiunto le pagine seguenti ai segnalibri per riferimento futuro:

Questa soluzione presenta un paio di vantaggi:

  1. Semplice: non sono necessari programmi aggiuntivi o componenti aggiuntivi
  2. Presenta agli studenti il ​​potere delle espressioni regolari, utilizzando le funzioni (Pythonic?) ("" "Che rappresenta il testo è interessante. Attenzione:" o nessun simbolo fallisce) e le funzioni della riga di comando.

Mi scuso per aver risposto alla mia domanda e molte grazie ad altri per avermi guidato verso la luce! Spero che questo thread di domande sia di utilità educativa per gli altri che affrontano problemi simili.


3
Non preoccuparti, rispondere alle tue domande non è un problema.
underdark

Sono contento che tu abbia trovato qualcosa che ti aiuterà. Grazie per averlo condiviso, so che lo userò.
Ryan Garnett,

1
Ho chiesto agli sviluppatori di QGIS, è Qt regex qt-project.org/doc/qt-4.8/qregexp.html
wildintellect

9

Questa potrebbe essere una risposta stupida, in quanto potrebbe essere un obiettivo di apprendimento per gli studenti laureati, ma c'è un motivo per cui non stai modificando gli attributi in QGIS con l'uso del Field Calculator? Nelle versioni precedenti di QGIS (pre 1.7) non era possibile modificare gli attributi direttamente all'interno di QGIS; da qui la necessità di modificare i file .DBF in OpenOffice ecc.

A partire da 1.7 e 1.8 è possibile modificare i dati degli attributi direttamente nel Field Calculator, con la possibilità di eseguire espressioni condizionali. Sono disponibili anche plugin di attributi Python, che possono fornire opzioni aggiuntive per la modifica degli attributi. Questa potrebbe essere una soluzione e / o un'opzione per il tuo tutorial.

Come precedente studente di Master e ora impiegato universitario, capisco questo problema, il requisito precedente per eseguirlo al di fuori di QGIS, e ora apprezzo la capacità di eseguire tutte le modifiche agli attributi all'interno di QGIS. Sarei felice di assisterti di più, se lo desideri.


1
Ciao Ryan, sì, sarebbe la soluzione ideale. È la capacità di cercare e sostituire il testo nella tabella degli attributi, di standardizzare i nomi disordinati di OSM, che mi sta spingendo a provare a modificare direttamente il file .dbf. Preferirei modificarlo all'interno di QGIS. Proverà il plug-in Python Attribute - potrebbe essere la soluzione idea. Avrei dovuto rendere più chiaro il fatto che sto cercando la funzione di ricerca / sostituzione regex nella domanda.
RobinLovelace,

@ user1694378 puoi ancora chiarire la tua domanda.
underdark

Grazie mille per avermi spinto a farlo - rispecchia meglio ciò che volevo davvero fare.
RobinLovelace,

3

Puoi usare la Base di LibreOffice per modificare i tuoi file dbf .

  1. Apri base (ottieni il menu principale)
  2. Selezionare "Connetti a un database esistente" e selezionare il tipo "dBASE".
  3. Seleziona la cartella con i tuoi file dbf.
  4. Selezionare le opzioni finali come desiderato e "Fine".
  5. Assegna un nome al file di connessione al database come desideri (ad es. "MyxBasefiles.odb) e salvalo da qualche parte. D'ora in poi accedi ai file del database facendo clic su questo file. OoOoo, Nizza.
  6. Seleziona "Tabelle" sul pannello di sinistra e ci sono i tuoi file di dati (chiamati "tabelle"). Pasticciare con loro.

Ora puoi iniziare a modificarli. Spero che dovrebbe essere abbastanza buono per i tuoi scopi.

Puoi anche provare DBF Explorer anche se è solo Windows. Ha ricerca e sostituzione però.

inserisci qui la descrizione dell'immagine


1
Ciao RK Grazie per la pronta risposta: sembra essere un modo affidabile e sicuro per modificare i file .dbf. Ho appena provato quello che hai detto e sono felice di dire che funziona.
RobinLovelace,

Buono a sapersi. Bella lezione che hai lì. :)
RK,

Ma ... ho appena provato quello che hai detto e sono felice di dire che funziona per le singole celle. Sfortunatamente non è una soluzione al 100% per questa particolare applicazione, perché sembra che OOBase non abbia la funzionalità di sostituzione della ricerca richiesta per il tutorial a causa di un [bug] ( lists.freedesktop.org/archives/libreoffice-bugs/2010 -Dicember /… ). Sicuramente ha funzionato su singole celle: testato. Quindi questa è una soluzione al 90% per l'editing cella per cella, a meno che non abbia perso la funzionalità di sostituzione della ricerca. Qualche idea su come sostituire tutte le voci "Tesc. *" Con "Tesco", per esempio?
RobinLovelace,

Collegamento migliore per il bug di OO Base: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace

Aggiornato la mia risposta.
RK,
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.