使用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中。