2010-07-05 8 views
3

J'ai une feuille de calcul Excel que je veux convertir en fichier de forme ESRI par programme. Il contient les coordonnées X et Y dans deux colonnes, ainsi qu'une variété de données d'attribut dans d'autres colonnes. La feuille de calcul est au format Excel 97 (c'est-à-dire pas .xlsx).Comment convertir une feuille de calcul Excel (.xls) en un fichier de formes par programme?

Je voudrais être capable de convertir cela en un fichier de formes de géométrie ponctuelle, chaque paire x, y de chaque ligne représentant un point. Idéalement, je voudrais avoir une troisième colonne spécifiant le système de coordonnées de la paire de coordonnées x, y, et que le fichier Excel contienne des systèmes de coordonnées hétérogènes.

Comment puis-je convertir cette feuille de calcul Excel (.xls) en un fichier de formes par programme? De préférence en Python, mais d'autres implémentations seront acceptées.

Répondre

2

xlrd est un module python pour lire le fichier Excel, je ne l'ai pas utilisé moi-même difficile.

4

Il y a un tutoriel Python à la création d'un fichier de formes en utilisant GDAL ici:

http://invisibleroads.com/tutorials/gdal-shapefile-points-save.html

Vous aurez juste besoin de remplacer les données source avec les points du fichier Excel - que Fabian a fait remarquer il y a bibliothèques pour lire les fichiers Excel (ou enregistrez-le en tant que fichier DBF). Sinon, si vous avez ArcMap de ESRI, enregistrez le fichier Excel en tant que fichier DBF (je ne me souviens pas si ArcMap lit directement Excel), puis ajoutez ce fichier DBF en tant que "couche d'événements" en utilisant les champs X, Y pour représenter les points. ArcMap les affichera en tant que fonctions et vous pourrez alors cliquer avec le bouton droit de la souris et exporter le calque dans un fichier de formes.

5

quelque chose comme ça?

import xlrd 
book = xlrd_open_workbook("data.xls") 
sheet = book.sheet_by_index(0) 
data = [] #make a data store 
for i in xrange(sheet.nrows): 
    row = sheet.row_values(i) 
    x=row[0] 
    y=row[1] 
    data.append(x,y) 

import point_store 
point_store.save('points-shifted.shp', [data], '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs') 
1

Vous voudrez peut-être les GDAL/OGR libs de le faire avec Python, et après avoir installé les il est plus facile d'utiliser simplement l'utilitaire ogr2ogr comme expliqué à http://nautilus.baruch.sc.edu/twiki_dmcc/bin/view/Main/OGR_example#Converting_from_CSV_to_shapefile. Arcmap supporte le Python pour la bibliothèque nommée arcpy.

+0

Je préfère ne pas aller sur la route CSV parce que je voudrais maintenir les types de données exprimées par la chaîne de format Excel. – fmark

0

Comme nous le savons, les Pandas fonctionnent comme les Excel et peuvent facilement lire et gérer les données. Oui, il peut parfois être utile d'exporter vers le fichier .xls et .xlsx. J'ai codé une fonction d'interconversion entre DataFrame des pandas et la shp d'Arcmap. Comme ceci:

def Shp2dataframe(path): 

    fields=arcpy.ListFields(path) 

    table=[] 

    fieldname=[field.name for field in fields] 

    data=arcpy.SearchCursor(path) 

    for row in data: 

     r=[] 

     for field in fields: 

      r.append(row.getValue(field.name)) 

     table.append(r) 

    return pd.DataFrame(table,columns=fieldname) 


'''Fuction: 

make the table of pandas's DataFrame convert to the shp of esri 

Input: 

df -- pandas DataFrame from the shp converted 

outpath -- the shp output path 

geometryType -- the type of geomentey, eg:'POINT','POLYLINE','POLYGON','MULTIPOINT' 

temple -- the temple, at most time it is used the DataFrame's shp 

''' 
def Dataframe2ShpTemplate(df,outpath,geoType,template): 
out_path = outpath.replace(outpath.split('/')[-1],'') 

out_name = outpath.split('/')[-1] 

geometry_type = geoType 

feature_class = arcpy.CreateFeatureclass_management(

    out_path, out_name, geometry_type, template) 


desc = arcpy.Describe(outpath) 

if template=='': 

    fields = set(list(df.columns)+['Shape','FID']) 

    originfieldnames = [field.name for field in desc.fields] 

    for fieldname in fields: 

     if fieldname not in originfieldnames: 

      arcpy.AddField_management(outpath,fieldname,'TEXT') 

for row in df.index: 

    df['[email protected]'] = df['Shape'] 

    cursor = arcpy.da.InsertCursor(outpath,[field for field in df.columns]) 

    cursor.insertRow([df[field][row] for field in df.columns]) 

print 'Pandas to shp finish!' 

del cursor 
Questions connexes