Python与开源GIS:使用OGR模块打开矢量数据

首先来看一下使用Python如何对矢量数据进行操作。 在 Python 中使用 OGR,只需要导入ogr模块。在早期的版本中,OGR是使用下面的语句导入的:

In [ ]:
import ogr

或者使用目前建议的方法:

In [ ]:
from osgeo import ogr

为了保持兼容性,同样可以使用下面的方法:

In [ ]:
try:
    from osgeo import ogr
except:
    import ogr

先看一下使用ogr读取数据的简单流程:

OGR读取数据流程

首先我们先看一下如何打开一个数据。这里使用矢量数据常用的数据集ESRI的ShapeFile。 可以使用ogr.Open()函数直接打开矢量数据,在这个过程中,ogr会自动根据文件的类型来确定相应的驱动

In [2]:
inshp = '/gdata/stats_county.shp'
from osgeo import ogr
datasource = ogr.Open(inshp)
driver = datasource.GetDriver()
driver.name
       
Out[2]:
'ESRI Shapefile'

这样就打开了一个数据源(DataSource),并将其赋给datasource变量。

上面这种方法打开的是按缺省方式进行的,在实际编程中,应该对要打开的数据类型进行一下处理。要读取某种类型的数据,必须要先载入数据驱动,也就是初始化一个对象,让它“知道”某种数据结构。

driver = ogr.GetDriverByName('ESRI Shapefile')

数据驱动driver的Open()(方法返回一个数据源对象),其中update为0是只读,为1是可写)。 例如:

Open(self, char name, int update = 0) -> DataSource

In [5]:
import sys
from osgeo import ogr
inshp = '/gdata/stats_county.shp'
driver = ogr.GetDriverByName('ESRI Shapefile')
dataSource = driver.Open(inshp,0)
if dataSource is None:
    print ('could not open')
    sys.exit(1)
print ('done!')
done!

注意filename一定要写绝对路径! 使用Python的内省函数dir()看一下datasource有哪些可用的方法。

In [6]:
dir(datasource)
Out[6]:
['CommitTransaction',
 'CopyLayer',
 'CreateLayer',
 'DeleteLayer',
 'Dereference',
 'Destroy',
 'ExecuteSQL',
 'FlushCache',
 'GetDescription',
 'GetDriver',
 'GetLayer',
 'GetLayerByIndex',
 'GetLayerByName',
 'GetLayerCount',
 'GetMetadata',
 'GetMetadataDomainList',
 'GetMetadataItem',
 'GetMetadata_Dict',
 'GetMetadata_List',
 'GetName',
 'GetRefCount',
 'GetStyleTable',
 'GetSummaryRefCount',
 'Reference',
 'Release',
 'ReleaseResultSet',
 'RollbackTransaction',
 'SetDescription',
 'SetMetadata',
 'SetMetadataItem',
 'SetStyleTable',
 'StartTransaction',
 'SyncToDisk',
 'TestCapability',
 '__class__',
 '__del__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattr__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__len__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__swig_destroy__',
 '__swig_getmethods__',
 '__swig_setmethods__',
 '__weakref__',
 '_s',
 'name',
 'this']
In [ ]: