Convertir le fichier de formes en CSV, y compris les attributs ET la géométrie?

21

J'ai un fichier de formes avec 60k + entrées, qui sont tous des polygones avec des attributs correspondants (totaux de superficie, noms de propriétaires fonciers, numéros d'identification fiscale, etc.). Ce dont j'ai finalement besoin, c'est d'un fichier CSV avec tous ces attributs et leur géométrie correspondante (au format xyz compatible KML, c'est-à-dire PAS au format WKT).

Je sais que je peux ouvrir le fichier .dbf dans Excel et obtenir les attributs. Je sais également que je peux ouvrir le fichier de formes dans QGIS et copier les données dans Excel, ce qui me permet d'obtenir des attributs et une géométrie WKT.

Existe-t-il un moyen simple de convertir le fichier de formes en CSV (ouvrable dans Excel) avec un attribut et une géométrie conviviale Google Earth?

Rikk
la source
Pour répondre à vos spécifications, une application ou un script devrait être construit. Je ne pense pas que ce soit difficile, mais je ne pense pas non plus que ce soit trivial. Si j'étais chargé de le faire, j'estimerais probablement 1 semaine à temps plein pour un tel travail.
Stephen Quan
3
Merci, c'est utile. C'est un peu fou cependant. Si la taille de mon fichier n'était pas si grande, je pourrais le faire automatiquement via Google. La façon dont je le fais généralement consiste à importer un .shp dans Google Earth et à l'enregistrer au format .kml. Je télécharge ensuite le .kml dans Google Fusion Tables (pour info: Google Fusion Tables a une limite de téléchargement de 100 Mo) et l'exporte vers .csv. Je peux ensuite jouer avec le .csv comme je veux - changer les attributs, ajouter de nouveaux polygones pour lesquels j'ai les coordonnées, etc., etc. - puis je retélécharger le .csv nouvellement enregistré vers Google Fusion Tables, exporter vers .kml et ouvrez-le dans Google Earth.
Rikk
Donc je suppose que la question devient alors ... comment puis-je diviser un fichier .shp en deux parties? Cela me permettrait d'obtenir les fichiers .kml individuels sous la limite de 100 Mo et je peux utiliser la méthode mentionnée ci-dessus pour convertir.
Rikk
1
J'ai répondu à la question posée ci-dessous, mais je viens de voir votre commentaire. Pourquoi avez-vous besoin de csv? Pourquoi ne pas modifier vos attributs, ajouter de nouveaux polygones, etc. dans le SIG (vous avez dit que vous aviez QGIS), puis les exporter vers votre KML final?
user2856
@Rikk - en réponse à la question de votre commentaire: Un moyen simple de diviser un fichier de formes serait de faire une sélection spatiale sur une partie de votre fichier de formes, puis de cliquer avec le bouton droit sur votre calque et de sélectionner "Exporter". Vous pouvez ensuite simplement exporter les fonctions sélectionnées vers un nouveau fichier de formes plus petit. Ce n'est en aucun cas scientifique, mais c'est simple. Vous pouvez également sélectionner certains attributs si vous souhaitez une approche plus organisée.
Radar le

Réponses:

28

Voici un script simple qui utilise les liaisons python OGR :

import ogr,csv,sys

shpfile=r'C:\Temp\test.shp' #sys.argv[1]
csvfile=r'C:\Temp\test.csv' #sys.argv[2]

#Open files
csvfile=open(csvfile,'wb')
ds=ogr.Open(shpfile)
lyr=ds.GetLayer()

#Get field names
dfn=lyr.GetLayerDefn()
nfields=dfn.GetFieldCount()
fields=[]
for i in range(nfields):
    fields.append(dfn.GetFieldDefn(i).GetName())
fields.append('kmlgeometry')
csvwriter = csv.DictWriter(csvfile, fields)
try:csvwriter.writeheader() #python 2.7+
except:csvfile.write(','.join(fields)+'\n')

# Write attributes and kml out to csv
for feat in lyr:
    attributes=feat.items()
    geom=feat.GetGeometryRef()
    attributes['kmlgeometry']=geom.ExportToKML()
    csvwriter.writerow(attributes)

#clean up
del csvwriter,lyr,ds
csvfile.close()

EDIT: et un autre script pour convertir de votre CSV en KML

import ogr,csv,sys,os
ogr.UseExceptions()

csvfile=r'C:\temp\test.csv' #sys.argv[1]
kmlfile=r'C:\temp\test.kml' #sys.argv[2]

csvreader=csv.reader(open(csvfile,'rb'))
headers=csvreader.next()

ds = ogr.GetDriverByName('KML').CreateDataSource(kmlfile)
lyr = ds.CreateLayer(os.path.splitext(os.path.basename(kmlfile))[0])

for field in headers[:-1]: #skip kmlgeometry
    field_def = ogr.FieldDefn(field)
    print lyr.CreateField(field_def)

for rec in csvreader:
    feat = ogr.Feature(lyr.GetLayerDefn())
    for i,field in enumerate(headers[:-1]): #skip kmlgeometry
        feat.SetField(field, rec[i])
    feat.SetGeometry(ogr.CreateGeometryFromGML(rec[-1]))
    lyr.CreateFeature(feat)

del lyr,ds
user2856
la source
Pouvez-vous décrire plus en détail comment utiliser ces liaisons, car elles masquent des informations importantes que vos lecteurs devraient connaître.
Andrew S
8

Si vous convertissez votre fichier de formes en spatialite, vous devriez pouvoir effectuer les opérations suivantes:

1) Expérimentez avec SQL pour tester la sortie:

ex.

Onglet SELECT col1, col2, col3, AsKml (geometry_column) FROM

2) Une fois satisfait du résultat, vous pouvez l'exporter au format CSV:

/programming/5776660/export-from-sqlite-to-csv-using-shell-script

Pour plus d'informations sur Spatialite:

https://www.gaia-gis.it/fossil/libspatialite/index

Fonctions SQL Spatialite:

http://www.gaia-gis.it/gaia-sins/spatialite-sql-3.0.0.html

Brent Edwards
la source
3

Si vous travaillez sur QGIS, vous pouvez générer instantanément un document CSV en cliquant avec le bouton droit sur la couche -> Enregistrer sous -> CSV.

Si vous travaillez avec ArcMap, vous pouvez exporter le KML en utilisant l'outil Layer to KML (Aller à l'option Rechercher dans le programme). Pour certaines raisons, il génère un KMZ au lieu d'un KML (c'est du moins ce qui s'est passé dans mon cas).

Afin de convertir un KMZ en KML:

  • Importez votre fichier KMZ dans Google Earth et faites un clic droit sur votre couche et enregistrez-le au format KML
  • Ouvrez QGIS et faites glisser et déposez le fichier KML - il chargera automatiquement la couche (> QGIS 2.10 PISA)
  • Faites un clic droit sur le fichier et enregistrez-le au format CSV

Cette procédure est plus longue si vous travaillez avec ArcGIS mais dans QGIS, cela peut être fait en un rien de temps. Vous devrez dans tous les cas installer QGIS.

Menelaos Kotsollaris
la source
Testé votre solution pour QGIS et cela ne fonctionne pas. L'enregistrement au format csv ne conserve pas la composante spatiale.
Philipp Schwarz
QGIS vous donne une option pour sélectionner WKT pendant l'exportation - cela exporte la géométrie (composante spatiale) au format WKT avec le reste des entités dans le fichier de forme.
kozyr
À partir de QGIS 3.0, vous rechercherez la liste déroulante «géométrie» sous «Options de couche» dans la boîte de dialogue d'exportation, puis sélectionnez AS_XY, AS_XYZouAS_WKT
leo
2

Sur la ligne de commande, vous pouvez utiliser ogr2ogr, comme ceci:

ogr2ogr -f CSV output.csv input.shp -lco GEOMETRY=AS_XYZ

lcoest pour les "options de création de couches", je pense. D'autres options disponibles sont documentées ici: http://www.gdal.org/drv_csv.html

Leo
la source
Leo, j'obtiens "L'erreur 1 n'a pas pu récupérer la couche demandée 'GEOMETRY = AS_XYZ'. Je peux afficher le fichier dans QGIS et voir clairement un vecteur contenant les contours du pays.
Andrew S
-1

allez simplement à l'outil de conversion dans la carte en arc. puis allez à table pour exceller. un fichier Excel sera créé. convertir ce document Excel en fichier .csv

ruqaia shabir
la source