GIS空間分析之Clip


版權聲明:本文爲博主原創文章,轉載請註明原文出處!

作者:阿振

寫作時間:2020-06-16 週一 早安


開篇

接着上篇《GIS空間分析之Buffer》之後,這篇來介紹矢量數據的裁剪(Clip)。裁剪其實算不上是一種空間分析功能,就是一種簡單矢量數據處理操作。

一般,我們會使用一個代表研究區域或者感興趣的區域(AOI,Area of Interest)的多邊形數據去裁剪一個比較大的全區域的數據,得到的結果就是感興趣區域中包含的數據。矢量數據的裁剪在平時工作中用得不是特別多。

案例介紹

本文使用一個AOI區域(黃河流域區)區裁剪中國的縣界(線要素),從而得到黃河流域區中的縣界。

在上篇《GIS空間分析之Buffer》中我們是使用了Geometry類的Buffer()方法建立緩衝區的,而本篇中我們需要使用Layer圖層類的Clip()方法進行矢量數據裁切。

對於矢量數據的操作,有的是通過Geometry類的方法實現的,有的是通過Layer類的方法實現的。

下面來看一下我們的數據,紅色區塊是黃河流域,紅色的線表示的是各個縣的邊界。

在這裏插入圖片描述

代碼展示

from pathlib import Path
import ogr

ogr.UseExceptions()

# 讀取被裁剪的數據
in_ds: ogr.DataSource = ogr.Open('../data/County.shp')
in_lyr: ogr.Layer = in_ds.GetLayer()

# 讀取裁剪範圍數據
method_ds: ogr.DataSource = ogr.Open('../data/YellowRiver.shp')
method_lyr: ogr.Layer = method_ds.GetLayer()

fname: str = 'Clipped.shp'
# 創建被裁剪以後的輸出文件
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(),
                                        in_lyr.GetGeomType())
# 開始進行裁剪
in_lyr.Clip(method_lyr, out_lyr)
out_ds.FlushCache()
del in_ds, method_ds, out_ds

裁剪的結果如下:

在這裏插入圖片描述

方法總結

  1. 首先我們使用ogr.Open()函數分別讀取被裁剪的數據以及裁剪範圍數據;使用GetLayer()方法獲取數據的圖層。裁剪範圍數據在GDAL中被稱爲Method Layer。
  2. 使用Driver類的CreateDataSource()方法創建裁剪輸出結果;使用CreateLayer()函數創建輸出圖層。CreateLayer()函數傳入三個參數,分別是圖層名,空間參考以及空間要素類型。後兩個參數可以通過讀取被裁剪數據獲取。
  3. 使用讀取被裁剪數據圖層的Clip()函數進行裁剪,改函數傳入兩個參數,分別是方法圖層(Method Layer)以及輸出結果圖層(Result Layer)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章