Article Directory
Code
from pathlib import Path
import ogr
import gdal
import os
import glob
import shutil
def get_outside(inShp, outputShp, field, fieldValue):
driver = ogr.GetDriverByName("ESRI Shapefile")
dataSource = driver.Open(inShp, 1)
layer = dataSource.GetLayer()
# 新建DataSource,Layer
out_ds = driver.CreateDataSource(outputShp)
out_lyr = out_ds.CreateLayer(outputShp, layer.GetSpatialRef(), ogr.wkbPolygon)
def_feature = out_lyr.GetLayerDefn()
for feature in layer:
geom = feature.GetGeometryRef()
value = feature.GetField(field)
if value == fieldValue:
out_feature = ogr.Feature(def_feature)
out_feature.SetGeometry(geom)
out_lyr.CreateFeature(out_feature)
out_feature = None
out_ds.FlushCache()
del dataSource, out_ds
def intersection(borderShp, roadShp, fname):
driver = ogr.GetDriverByName("ESRI Shapefile")
dataSource = driver.Open(borderShp, 1)
layer = dataSource.GetLayer()
RdataSource = driver.Open(roadShp, 1)
Rlayer = RdataSource.GetLayer()
# 新建DataSource,Layer
out_ds = driver.CreateDataSource(fname)
out_lyr = out_ds.CreateLayer(fname, layer.GetSpatialRef(), ogr.wkbPolygon)
def_feature = out_lyr.GetLayerDefn()
# 遍历原始的Shapefile文件给每个Geometry做Buffer操作
# current_union = layer[0].Clone()
print('the length of layer:', len(layer))
if len(layer) == 0:
return
for feature in layer:
geometry = feature.GetGeometryRef()
for Rfeature in Rlayer:
Rgeometry = Rfeature.GetGeometryRef()
inter = Rgeometry.Intersection(geometry).Clone()
out_feature = ogr.Feature(def_feature)
out_feature.SetGeometry(inter)
out_lyr.ResetReading()
out_lyr.CreateFeature(out_feature)
del dataSource, RdataSource, out_ds
def mkdir(path):
if not os.path.exists(path):
os.mkdir(path)
if __name__ == '__main__':
f = open('config_order.txt')
data = f.readlines()
inShp = data[0].replace('\n', '')
roadshp = data[1].replace('\n', '')
outshp = data[2].replace('\n', '')
field = 'gj'
fieldValue = 0
mkdir('temp')
tempShp = './temp/temp.shp'
get_outside(inShp, tempShp, field, fieldValue)
intersection(tempShp, roadshp, outshp)
if os.path.exists('temp'):
shutil.rmtree('temp')
Data visualization
Input vector A
input vector B
output result
reference
https://www.osgeo.cn/python_gdal_utah_tutorial/ch04.html#id1