如何以编程方式将excel电子表格(.xls)转换为shapefile?

时间:2010-07-05 07:38:05

标签: python excel gis shapefile

我有一个excel电子表格,我想以编程方式转换为ESRI shapefile。它包含两列中的X和Y坐标,以及其他列中的各种属性数据。电子表格采用excel 97格式(即不是.xlsx)。

我希望能够将其转换为点几何shapefile,每行的x,y对代表一个点。理想情况下,我希望第三列指定x,y坐标对的坐标系,并使excel文件包含异构坐标系。

如何以编程方式将此Excel电子表格(.xls)转换为shapefile?最好是在Python中,但也可以接受其他实现。

5 个答案:

答案 0 :(得分:5)

这样的事情?

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 :(得分:4)

这里有一篇关于使用GDAL创建shapefile的Python教程:

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

您只需要用Excel文件中的点替换源数据 - 因为Fabian指出有读取Excel文件的库(或将其保存为DBF)。

或者,如果您有ESRI的ArcMap,请将Excel另存为DBF文件(我不记得ArcMap是否直接读取Excel),然后使用X,Y字段将此DBF添加为“事件图层”以表示点。 ArcMap会将这些显示为要素,然后您可以右键单击并将图层导出到shapefile。

答案 2 :(得分:2)

xlrd是一个用于读取Excel文件的python模块,我自己也没用过它。

答案 3 :(得分:1)

您可能希望GDAL / OGR库使用Python执行此操作,安装完成后,可以更轻松地使用ogr2ogr中所述的http://nautilus.baruch.sc.edu/twiki_dmcc/bin/view/Main/OGR_example#Converting_from_CSV_to_shapefile实用程序。

答案 4 :(得分:0)

Arcmap支持名为arcpy的库的Python。众所周知,Pandas的工作方式与Excel类似,可以轻松读取和处理数据。是的,有时它可以用于导出到.xls和.xlsx文件。我在大熊猫的DataFrame和Arcmap的shp之间编码了一个互换函数。它是这样的:

@Override
    public boolean onTouchEvent(MotionEvent event) {
        final float x = event.getX();
        final float y = event.getY();
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:

            if (x > width - main_right.getWidth()
                    && x < width - main_right.getWidth()
                            + main_right.getWidth()
                    && y > height
                            - (main_right.getHeight() + main_right.getHeight() / 2)
                    && y < height
                            - (main_right.getHeight() + main_right.getHeight() / 2)
                            + main_right.getHeight()) {

                x += 1;

                canvas_main.drawBitmap(image, (width / 2) + x2,
                        height - (image.getHeight() + image.getHeight() / 2),
                        paint);

            } else {
                x = 0;
            }
            return true;
        }
        return false;
    }