使用GDAL/OGR库¶
访问GeoPackage还有其他方法,包括使用其他prorging语言和库。提供这种功能的软件库之一是免费的开源地理空间数据抽象层(GDAL)及其向量工具包OGR。GDAL提供了C、C++和Python绑定,允许它被导入各种应用程序。
要在Windows、Linux或macosx上构建和安装GDAL,可以从 here。
为了快速入门,在安装QGIS的过程中还安装了GDAL1.11。
下面是一个使用gdal1.11读取GeoPackage的Python脚本示例。源代码改编自 here。当程序运行时,它会打印出特征属性的值。
import sys
import ogr
# First open a handle on the GeoPackage.
ds = ogr.Open( "/home/ogckm/Downloads/states10.gpkg" )
# If the file handle is null then exit
if ds is None:
print "Open failed.\n"
sys.exit( 1 )
# Select the dataset to retrieve from the GeoPackage and assign it to an layer instance called lyr.
# The names of available datasets can be found in the gpkg_contents table.
lyr = ds.GetLayerByName( "statesQGIS" )
# Refresh the reader
lyr.ResetReading()
# for each feature in the layer, print the feature properties
for feat in lyr:
feat_defn = lyr.GetLayerDefn()
# for each non-geometry feature property, print its value
for i in range(feat_defn.GetFieldCount()):
field_defn = feat_defn.GetFieldDefn(i)
if field_defn.GetType() == ogr.OFTInteger:
print "%d" % feat.GetFieldAsInteger(i)
elif field_defn.GetType() == ogr.OFTReal:
print "%.3f" % feat.GetFieldAsDouble(i)
elif field_defn.GetType() == ogr.OFTString:
print "%s" % feat.GetFieldAsString(i)
else:
print "%s" % feat.GetFieldAsString(i)
# Confirm whether there is a geometry property
geom = feat.GetGeometryRef()
if geom is not None and geom.GetGeometryType() == ogr.wkbMultiPolygon:
print "has a geometry property"
print "\n"
ds = None
注意,gdal2.0使用一组不同的类来访问向量数据。我们在本例中使用了gdal1.11,因为它目前默认包含在Linux存储库中,而且还捆绑在QGIS中。