你知道吗?用 Python 脚本读取 GeoPackage 竟然如此简单

在地理空间数据处理这一领域,高效访问GeoPackage的问题始终是核心议题。借助GDAL/OGR库进行访问是常用的方法,不过这个过程中既有挑战也有便利,其中有不少值得咱们深入研究的点。

GDAL/OGR库概述

GDAL/OGR库地位特殊。这是一个免费的、开源的地理空间数据抽象层,里面包含OGR向量工具包。它支持C、C++和Python等多种编程语言。比如,在众多地理信息处理项目中,不管是处理大规模地形测绘数据,还是分析小范围城市地理信息,Python绑定都得到了广泛使用。它能够轻松被导入各种应用程序,这个特点让许多程序员和地理信息处理人员受益,大大提升了开发效率。各个地区的数据处理中心等机构都能用它来处理各种地理数据。

GDAL/OGR库,它是地理空间数据处理走向开源化过程中的一个典型例子。以前,咱们得花大价钱买商业软件才能干这些活儿,现在,这个库基本上都能搞定。比如在欧洲,有些小型的地理研究团队,资金有限,就靠这个库完成了当地关于土壤质量和植被覆盖的地理空间项目。

构建与安装的多平台性

安装GDAL挺方便的。不管是Windows系统,它那个专门的安装环境,还是Linux系统,那个拓展性很强的生态环境,还有macosx那个封闭的集成环境,用户都能轻松搭建和安装。不过,要获取这些资源,得去特定的网站,就是这里。

以Linux系统为例,安装过程挺简单。有个叫Hubert的程序员,他在非洲做地理数据标注项目。当时,很多队友都在为兼容问题发愁,可Hubert不一样,他很快就用自己熟悉的方法,在Linux系统上装好了GDAL库,开始处理湿地数据了。至于Windows用户,虽然操作习惯有点不一样,但按照官方的详细指南,在上海的一家小地理信息公司里,新来的程序员小刘,也成功地在自己的电脑上装好了GDAL库,开始做城市交通地理数据的分析了。

结合QGIS安装入门

新手可以通过安装QGIS快速上手。安装QGIS的同时,还会自动安装GDAL1.11。这种捆绑安装省去了不少配置的麻烦。QGIS的插件系统成熟,地理数据可视化功能方便,再加上GDAL1.11的特性,让很多人能立刻开始地理空间数据的工作。

在拉美地区,不少高校的地理学专业课程里都有QGIS的应用和学习。学生们在安装QGIS的时候,几乎没遇到什么门槛,就接触到了GDAL1.11。然后,他们就开始研究本地地理标识物和人口分布的关系了。这样,他们就能快速学会操作那些简单的地理数据处理工作了。

Python脚本访问示例

用Python脚本搭配GDAL1.11读取GeoPackage挺简单的。这里有一个从特定来源改编的源代码,给我们提供了一个不错的例子。运行这个脚本,它会把特征属性的值打印出来。这种脚本在推广地理空间数据的应用和理解上起到了不小的作用。

在印度尼西亚的一个环境监测项目中,科学家们得分析GeoPackage里的地理空间数据,目的是弄清森林覆盖率变化和周围环境因子之间的联系。他们用Python脚本迅速处理这些数据,准确获取特征属性值,然后对地理现象进行科学判断,得出有用结论。代码简单易懂,让地理数据的解读过程变得轻松顺畅。

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在处理向量数据方面差异挺大,gdal2.0用的是另一套类别。用gdal1.11在某些情况下挺有优势的。现在,它默认在Linux的库里有,还和QGIS一起装。

在中东,有个土地规划项目。他们技术团队对比了多个版本,最后选了gdal1.11来处理地形地貌数据。这主要是因为,用gdal1.11不会出现版本兼容问题,还能和QGIS配合,快速看到效果。他们不想冒升级到gdal2.0可能带来的功能和代码调整风险。

开源库带来的意义

GDAL/OGR库开源了,这事儿挺有意义的。不管是个人爱好者用它来搞自己的地图模型,还是跨国地理研究团队用它来处理气候模型的大数据,这都行。免费的,谁都能用,给地理空间数据处理领域开了个大门,让更多人能进来。不光是教育领域,学生也能低成本学,贫困地区的机构也不用因为软件贵就不敢研究了。你有没有想过加入用GDAL/OGR库访问GeoPackage的大家庭?如果你有经验或者疑问,欢迎在下面评论分享,别忘了点赞和转发这篇文章。

发表评论