#1 Mon 07 July 2014 17:09
- Jed
- Juste Inscrit !
- Date d'inscription: 16 Apr 2014
- Messages: 6
Import de données csv dans un shape
Bonjour,
je suis face à un problème auquel je ne trouve pas de documentation assez fournie... Tout d'abord je précise que je débute dans la programmation, j'essaye de coder avec python.
Mon travail doit être le suivant :
- j'ai un .csv à double entrée avec en lignes et en colonnes des cultures (nomenclature RPG), pour chaque combinaison de cultures j'ai ainsi une valeur (de kp pour les connaisseurs) ;
- j'ai un fichier shape avec trois champs : les deux premiers champs contiennent les enregistrements que l'on retrouve dans mon .csv ; et le troisième champ est vide : il est censé contenir la valeur correspondante à la combinaison de mes enregistrements.
Ex : pour le couple champ1 : autrecin et champ2 : blet, il doit aller me chercher 'autrecin' dans les colonnes et 'blet' dans les lignes => l'enregistrement dans le troisième champ devra être '5' (kp de la combinaison 'autrecin-blet').
J'espère que je suis clair...
J'aurai bien rentré ces combinaisons à la main mais j'ai 15 000 polygones à renseigner!^^
Du coup je me suis lancé dans python mais je ne trouve pas mon bonheur, si vous avez des petits tuyaux ou si il y a des tutos (j'ai dû les rater) qui parlent de ça je suis preneur.
Merci.
Hors ligne
#2 Mon 07 July 2014 18:57
Re: Import de données csv dans un shape
Bonjour,
une jointure dans LibreOffice ne suffit pas (ou j'ai pas bien compris) ?
1- ouvrir le fichier CSV et le fichier DBF du SHP avec LibreOffice (Excel gère mal les DBF associés à des SHP),
2- faire une Recherche Verticale (fonction RECHERCHEV) avec LibreOffice pour ramener dans la bonne colonne du DBF, le champ du CSV (selon une colonne commune)
3- enregistrer le DBF
Dernière modification par David.D (Mon 07 July 2014 19:01)
Hors ligne
#3 Tue 08 July 2014 08:34
- Jed
- Juste Inscrit !
- Date d'inscription: 16 Apr 2014
- Messages: 6
Re: Import de données csv dans un shape
Bonjour,
merci de la réponse, hélas le souci c'est que je n'ai pas de correspondance directe entre mon csv et le dbf.
Les enregistrements dans mon dbf sont issus de deux champs (deux enregistrements par ligne) et je dois les faire correspondre avec un enregistrement en ligne et un en colonne de mon csv. Du coup la jointure ne s'y prête pas trop...
De plus j'ai 25 lignes et autant de colonnes dans mon csv, pour 15 000 lignes dans mon dbf.
Hors ligne
#4 Tue 08 July 2014 11:34
- Mapp Ben
- Participant occasionnel
- Date d'inscription: 31 Mar 2014
- Messages: 37
Re: Import de données csv dans un shape
En python, spontanément, je pense à un algorithme de ce type
Fichier 1 = Ouvrir le fichier csv en lecture
Liste 1 = colonne 1
Liste 2 = Ligne 1
Fichier 2 = ouvrir le fichier dbf en lecture et écriture
Liste 3 = liste avec 3 éléments [a, b , c]
Parcourir Fichier 2,
Parcourir liste 1
Si a = Liste1.élement
Liste_Intermédiaire = ajouter le numéro de Liste1.élement
Parcourir liste = 2
Si b = Liste2.élement
Liste_Intermédiaire = ajouter le numéro de Liste2.élement
C = Liste intermédiaire
Réinitialiser Liste intermédiaire
Hors ligne
#5 Tue 08 July 2014 16:58
- Jed
- Juste Inscrit !
- Date d'inscription: 16 Apr 2014
- Messages: 6
Re: Import de données csv dans un shape
Salut Ben, merci de ta réponse. En effet c'est ça l'idée, j'en ai discuté avec des collègues c'est le schéma en gros.
Maintenant c'est dans la pratique que c'est plus compliqué!^^
Mais j'avance, si ça intéresse quelqu'un je pourrais faire circuler le script quand il sera ok.
Hors ligne
#6 Tue 08 July 2014 17:29
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Import de données csv dans un shape
Bonjour,
Je connais pas trop Python, mais vous n'iriez pas plus vite avec une structure de données type dictionnaire ? (https://docs.python.org/2/tutorial/data … ctionaries)
Le fichier CSV est representé en python par un dictionnaire de dictionnaire (clé: culture, valeur: dictionnaire des cultures en ligne):
Exemple:
Code:
dict_culture = {'ble': {'ble': 0, 'orge': 1, 'mais': 2}, 'orge': {'ble': 3, 'orge': 0, 'mais': 5}, 'mais': {'ble': 6, 'orge': 7, 'mais': 0}} dict_culture['ble']['orge'] => 1 dict_culture['orge']['ble'] => 3
Vous ouvrez le shapefile en ecriture avec Shapely ou OGR (je ne vous conseille pas de toucher a un dbf de shapefile avec autre chose que des libs qui lisent du shapefile)
Pour chaque record du shapefile:
Code:
record.champ3 = dict_culture[champ1][champ2]
Vous sauvez le shapefile
Vu la concision du langage python, ca doit se faire un 3/4 lignes de code
(Il y a pleins d'exemples pour charger un CSV dans un dictionnaire en python, sur le web)
Nicolas
Hors ligne
#7 Tue 08 July 2014 18:07
- Jed
- Juste Inscrit !
- Date d'inscription: 16 Apr 2014
- Messages: 6
Re: Import de données csv dans un shape
Effectivement ça peut être une solution, mais si il faut renseigner son dictionnaire à la main ça fait énormément de combinaisons possibles! (Il y a 25 classes...) Le but étant d'automatiser le processus. Ou alors j'ai raté l'info sur la doc de Python..^^
Et pour le dbf je me suis affranchi du problème : je l'ai exporté en csv pour le traitement sous Python ; et je ferai un copier-coller sur une mise à jour de mon shape sous ArcGIS.
Encore merci pour vos idées, du coup j'ai suivi l'idée de Ben, avec un petit coup de main de mes collègues pour les aspects purement technique.
Jed
Hors ligne
#8 Tue 08 July 2014 18:34
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Import de données csv dans un shape
Effectivement ça peut être une solution, mais si il faut renseigner son dictionnaire à la main ça fait énormément de combinaisons possibles! (Il y a 25 classes...) Le but étant d'automatiser le processus. Ou alors j'ai raté l'info sur la doc de Python..^^
Heu non le but n'est pas de remplir a la main !
Chaque ligne lue dans le CSV est transformée en dictionnaire python: culture:valeur.
Hors ligne