June 14, 2020

GIS空间分析之Buffer

版权声明:本文为博主原创文章,转载请注明原文出处!

作者:阿振

写作时间:2020-06-14 周末 夏夜


开篇

GIS空间分析是通过对GIS系统中的空间地物的空间位置以及分布形态等空间特性进行分析推理等得到额外有用信息的过程。GIS空间分析包含广泛的内容,是GIS系统的核心功能。

从这篇博文开始,我们会简单介绍几种GIS系统中最常见最简单的空间分析功能,并使用Python的GDAL API进行实现。

首先,我们来看一下开源GIS软件QGIS中提供的几种简单的空间分析工具,我们接下来的几篇博文会介绍如何使用Python脚本实现这些功能。

QGIS空间分析功能

虽然,这些都是最基础的空间分析操作,但是很多复杂的分析功能就是这些简单操作的组合,所以掌握这些基础操作很重要。

案例介绍

本文我们将使用缓冲区分析工具Buffer制作中国地图的晕线。中国地图边界的晕线就是我们经常看到的国界外面的突出色浅色部分。

那么我们如何制作晕线呢?一个解决方案是我们给国界做一个缓冲区,然后将缓冲区图层放置在边界图层的上面就可以形成这样的效果。

代码展示

下面的代码展示了如何制作面状地物的缓冲区。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from pathlib import Path
import ogr

ogr.UseExceptions()

in_ds: ogr.DataSource = ogr.Open('../data/China.shp')
in_lyr: ogr.Layer = in_ds.GetLayer()

fname: str = 'Buffer.shp'
# 创建输出Buffer文件
driver: ogr.Driver = ogr.GetDriverByName('ESRI Shapefile')
if Path(fname).exists():
driver.DeleteDataSource(fname)
# 新建DataSource,Layer
out_ds: ogr.DataSource = driver.CreateDataSource(fname)
out_lyr: ogr.Layer = out_ds.CreateLayer(fname,
in_lyr.GetSpatialRef(), ogr.wkbPolygon)
def_feature: ogr.FeatureDefn = out_lyr.GetLayerDefn()

# 遍历原始的Shapefile文件给每个Geometry做Buffer操作
for feature in in_lyr:
geometry = feature.GetGeometryRef()
buffer = geometry.Buffer(20000.0)
out_feature = ogr.Feature(def_feature)
out_feature.SetGeometry(buffer)
out_lyr.CreateFeature(out_feature)
out_feature = None
out_ds.FlushCache()
del in_ds, out_ds

结果展示(紫色部分就是我们的缓冲区):

缓冲区分析

方法总结

  1. 首先我们使用Driver类的CreateDataSource()方法创建输出缓冲区文件。
  2. 然后使用DataSource类的CreateLayer()方法创建一个图层,该方法有三个参数,分别是图层名,空间投影以及空间几何体类型。这里我们的空间投影直接从原始的Shapefile中进行读取,输入的空间几何体类型设置为ogr.wkbPolygon
  3. 加下来我们对原始数据图层中的每个Feature要素进行遍历,取出其中的Geometry,然后利用Geometry类的Buffer()方法生成新的缓冲区Feature。Buffer的参数是缓冲区的距离,距离的单位是投影坐标系中的默认单位。
  4. 生成新的缓冲区Geometry以后,我们新建一个Feature并使用SetGeometry()将缓冲区Geometry设置为该Feature的Geometry。最后使用CreateFeature()方法将该Feature添加到图层中。
  5. 如此循环,直到遍历完所有的Feature为止。