在做影象資料處理時,經常會有柵格資料轉向量資料的操作,轉換後的向量檔案會存在鋸齒狀邊緣,不太美觀,因此常常需要對向量(shp)檔案做平滑處理。

1 利用arcgis實現shp的平滑和簡化

  ArcToolbox / Cartography Tool / Generalization / Smooth Polygon,或者,製圖工具 / 製圖綜合 / 平滑面。

2 基於GDAL向量檔案邊界平滑

import sys
from osgeo import ogr, gdal, osr #平滑函式
def smooth(shp,out,name,smooth_size):
driver = ogr.GetDriverByName('ESRI Shapefile')
dataSource = driver.Open(shp, 0) # 0是隻讀,1可寫
if dataSource is None:
print('could not open')
sys.exit(1)
# 獲取圖層
layer = dataSource.GetLayer(0)
t = int(layer.GetFeatureCount())
drv = ogr.GetDriverByName('ESRI Shapefile')
Polygon = drv.CreateDataSource(out)
# oLayer = Polygon.CreateLayer(name, srs=prj, geom_type=ogr.wkbMultiPolygon)
oLayer = Polygon.CreateLayer(name, layer.GetSpatialRef(), geom_type=ogr.wkbPolygon)
oFieldID = ogr.FieldDefn("ID", ogr.OFTInteger) # 建立一個叫ID的整型屬性
oLayer.CreateField(oFieldID, 1)
feature = ogr.Feature(oLayer.GetLayerDefn())
ID=0
for i in range(0, t):
feat = layer.GetFeature(i)
geom = feat.GetGeometryRef()
ID = ID+1
buffer = geom.Buffer(smooth_size).Buffer(-smooth_size)
feature.SetGeometry(buffer) ## 設定面
feature.SetField(0, ID)
oLayer.CreateFeature(feature) if __name__ == '__main__':
# shp路徑
shp=r"E:\成果\landsat8成果\LC08_L2SP_141039_20170214_20200905_02_T1.shp"
# 輸出路徑
out=r"E:\成果\修復"
# 輸出名稱
name=r"20170214"
# 平滑尺度,投影為經緯度選擇0.001為宜,投影為座標選擇100為宜。
smooth_size = 0.001
smooth(shp, out, name, smooth_size)