Comment modifier facilement les données d'attribut à l'aide d'expressions régulières?

30

J'écris un tutoriel pour les étudiants MSc qui utilise QGIS. Une des tâches nécessite la modification des données d'attribut (voir le brouillon pdf du tutoriel ici si vous êtes intéressé)

La question est de savoir comment les amener à modifier les données d'attribut. Je sais que cette question a déjà été posée , et la réponse était simple: il suffit d'utiliser LibreOffice calc pour la modifier, puis l'enregistrer, en veillant à ce que l'ordre des lignes et les titres des colonnes restent les mêmes. J'ai déjà utilisé cette approche avec grand succès.

Malheureusement, la solution ne fonctionne plus: l'enregistrement du fichier .dbf, dans LibreOffice (5.4.2) ou OpenOffice (3.4.1) Calc brouille les données du point de vue de QGIS (seuls les nombres entiers aléatoires apparaissent dans le tableau des attributs), et crée un fichier .dbt supplémentaire à la place.

Donc, pour arriver à la question: comment dire à une classe d'étudiants MSc de le faire la semaine prochaine? J'ai considéré les options suivantes:

  1. Utilisez plutôt R (super pour moi, mais effrayant pour les étudiants)
  2. Modifiez le fichier en tant que .csv, puis joignez-vous en fonction de l'horodatage (bien, mais semble trop complexe, et pourrait introduire plus d'erreur dans la pratique de 2 heures)
  3. Utilisez un programme alternatif: j'ai essayé Gnumeric et Excel, aucun des deux n'a généré rapidement de bons résultats.

Pour aider à répondre à cette question, j'ai créé un exemple reproductible . Ouvrez le fichier "points.shp" dans QGIS, observez la table attributaire puis fermez. Modifiez quelques cellules dans la table attributaire "points.dbf" dans LibreOffice - enregistrez. Rouvrez "points.shp" dans QGIS et observez la table des attributs brouillés. Les autres fichiers de formes dans le dossier .zip ont déjà été corrompus par LibreOffice et OpenOffice pour illustrer à quoi ressemble le problème pour moi.

En bref, comment résoudre au mieux ce problème?

RobinLovelace
la source
2
Bienvenue sur le site, je voudrais dire que c'est une question vraiment bien posée, et j'espère que nous pourrons trouver de bonnes solutions. Je suppose qu'un peu de python est hors de question pour ces étudiants, car c'est ainsi que
j'aborderais
13
La modification directe de la partie .DBF d'un fichier de formes est trop dangereuse pour être recommandée pour une utilisation de routine et ne devrait pas du tout être utilisée par les novices - du moins pas si quelqu'un se soucie des données. Cependant, une solution plus fiable de nature similaire est disponible: maintenir un champ d'identifiant unique dans le fichier de formes. Ne le modifiez jamais. Au lieu de cela, conservez les attributs dans une table associée (dans n'importe quel format que votre SIG peut lire), jointe sur le même identifiant. Maintenant, dans une large mesure, vous pouvez modifier librement la table attributaire sans perdre la connexion entre la forme et l'attribut - tant que vous protégez le champ identifiant.
whuber
1
Les solutions Python seraient bien, tant qu'elles sont faciles à implémenter et à comprendre ... En ce qui concerne la conservation d'un numéro d'identification, c'est une bonne option - (option 2 dans ma question) et probablement ma réponse par défaut. Cependant, j'espérais une "solution rapide" plus simple qui n'impliquerait pas de fichiers supplémentaires (5 par fichier de formes, c'est assez IMO!)
RobinLovelace
3
Que voulez-vous dire, 5 par fichier de formes? Essayez 9! :-) (Les fichiers d'index peuvent s'accumuler, selon le SIG utilisé.) Une fois que vous avez besoin de plusieurs fichiers associés pour gérer un ensemble de données - et que les fichiers de formes en nécessitent au moins trois - ce n'est vraiment pas un problème jeter des fichiers supplémentaires. Ajoutez également un fichier de métadonnées pendant que vous y êtes. :-) Et une fois que vous avez configuré la jointure, cela ne se produit-il pas automatiquement? (Je ne vois pas comment l'horodatage pourrait être utilisé pour la jointure, cependant. Ce serait utilisé à la place pour un système de contrôle de version.)
whuber
3
Si vous avez une envie de les présenter à des bases de données, spatialité a une interface graphique pour l' édition sur le terrain et les outils de ligne de commande pour les données OSM. Ensuite, vous pourriez impliquer un peu de SQL et vos élèves seraient sans doute en avance sur la courbe.
Scro

Réponses:

18

Réponse la plus simple que j'ai trouvée, basée sur les conseils de Ryan Garnett pour le faire dans QGIS:

Utilisez regexp_replace

Cette capacité a été ajoutée au calculateur de terrain il y a 1 an par Jürgen Fischer (comme illustré par ce rapport de bogue ). J'ai essayé pendant un certain temps de découvrir comment procéder, mais j'ai échoué dans la recherche de "qgis regex" et d'autres termes vagues.

Sa fonctionnalité est probablement mieux illustrée par la nécessité de normaliser toutes les valeurs dans la colonne "nom". Par exemple, si nous devons remplacer toutes les cellules qui contiennent le motif «Tesc» par «Tesco», en supprimant les informations superflues comme «Tesco, Infirmary Road» (que les contributeurs OSM ajoutent fréquemment), la fonction suivante peut être utilisée:

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

entrez la description de l'image ici

Je suppose que c'est une fonctionnalité d'expression régulière Pythonic, car elle est un peu différente de grep, que j'ai utilisée auparavant.

Je pense que plus de documentation (les détails sur le site Web de QGIS sont limités à quelques mots) est nécessaire sur la façon dont cela fonctionne, j'ai donc mis en signet les pages suivantes pour référence future:

Cette solution présente deux avantages:

  1. Simple: aucun programme supplémentaire ni module complémentaire requis
  2. Initie les élèves à la puissance des expressions régulières, en utilisant des fonctions (Pythonic?) (Le "'" représentant du texte est intéressant. Avertissement: "ou aucun symbole ne tombe en panne) et des fonctions en ligne de commande.

Toutes mes excuses pour avoir répondu à ma propre question et un grand merci aux autres pour m'avoir guidé vers la lumière! J'espère que ce fil de questions sera utile à d'autres personnes confrontées à des problèmes similaires.

RobinLovelace
la source
3
Ne vous inquiétez pas, répondre à vos propres questions n'est pas un problème.
underdark
Je suis content que vous ayez trouvé quelque chose qui vous aidera. Merci du partage, je sais que je vais l'utiliser.
Ryan Garnett
1
J'ai demandé aux développeurs QGIS, c'est Qt regex qt-project.org/doc/qt-4.8/qregexp.html
wildintellect
9

Cela peut être une réponse stupide, car cela peut être un objectif d'apprentissage pour les étudiants diplômés, mais y a-t-il une raison pour laquelle vous ne modifiez pas les attributs dans QGIS avec l'utilisation de la calculatrice de champ? Dans les versions précédentes de QGIS (pré-1.7), la modification des attributs directement dans QGIS n'était pas possible; d'où la nécessité d'éditer les fichiers .DBF dans OpenOffice etc.

Depuis les versions 1.7 et 1.8, vous pouvez modifier les données d'attribut directement dans la calculatrice de champ, avec la possibilité d'effectuer des expressions conditionnelles. Il existe également des plugins d'attributs Python disponibles, qui peuvent fournir des options supplémentaires pour la modification des attributs. Cela peut être une solution et / ou une option pour votre didacticiel.

En tant qu'ancien étudiant à la maîtrise et maintenant employé de l'université, je comprends ce problème, l'exigence précédente de l'exécuter en dehors de QGIS, et j'apprécie maintenant la possibilité d'effectuer toutes les modifications d'attribut dans QGIS. Je serais heureux de vous aider davantage si vous le souhaitez.

Ryan Garnett
la source
1
Salut Ryan, oui, ce serait la solution idéale. C'est la possibilité de rechercher et de remplacer du texte dans la table d'attributs, de normaliser les noms OSM en désordre, qui me pousse à essayer de modifier le fichier .dbf directement. Je préfère le modifier dans QGIS. Va essayer le plugin Python Attribute - peut-être la solution idéale. J'aurais dû rendre le fait que je suis à la recherche d'une capacité de recherche / remplacement d'expressions plus claires dans la question.
RobinLovelace
@ user1694378, vous pouvez toujours clarifier votre question.
underdark
Merci à moi de m'avoir poussé à le faire - reflète mieux ce que je voulais réellement faire.
RobinLovelace
3

Vous pouvez utiliser la base de LibreOffice pour modifier vos fichiers dbf .

  1. Ouvrir la base (obtenir le menu principal)
  2. Sélectionnez "Se connecter à une base de données existante" et sélectionnez le type "dBASE".
  3. Sélectionnez le dossier contenant vos fichiers dbf.
  4. Sélectionnez les options finales souhaitées et "Terminer".
  5. Nommez votre fichier de connexion à la base de données comme vous le souhaitez (par exemple "MyxBasefiles.odb) et enregistrez-le quelque part. Accédez désormais à vos fichiers de base de données en cliquant sur ce fichier. OoOoo, Nice.
  6. Sélectionnez "Tables" dans le panneau de gauche, et il y a vos fichiers de données (appelés "tables"). Jouez avec eux.

Vous pouvez maintenant commencer à les modifier. J'espère que cela devrait suffire à vos besoins.

Vous pouvez également essayer DBF Explorer bien que ce soit uniquement Windows. Il a cependant la recherche et le remplacement.

entrez la description de l'image ici

RK
la source
1
Salut RK Merci pour la réponse rapide: semble être un moyen fiable et sûr de modifier les fichiers .dbf. Je viens d'essayer ce que vous avez dit et je suis heureux de dire que cela fonctionne.
RobinLovelace
Bon à savoir. Belle leçon que vous avez là-bas. :)
RK
Mais ... J'ai juste essayé ce que vous avez dit et je suis heureux de dire que cela fonctionne pour des cellules individuelles. Malheureusement, ce n'est pas une solution à 100% pour cette application particulière, car il semble que OOBase ne dispose pas de la fonction de recherche-remplacement requise pour le didacticiel en raison d'un [bogue] ( lists.freedesktop.org/archives/libreoffice-bugs/2010 -Décembre /… ). Certainement travaillé sur des cellules individuelles cependant: testé. C'est donc une solution à 90% pour l'édition cellule par cellule, sauf si j'ai manqué la fonctionnalité de remplacement de la recherche. Des idées sur la façon de remplacer toutes les entrées "Tesc. *" Par "Tesco", par exemple?
RobinLovelace
Meilleur lien pour le bogue OO Base: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace
Mis à jour ma réponse.
RK