Vector intersection based on gdal (python)

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
Insert picture description here
input vector B
Insert picture description here
output result
Insert picture description here

reference

https://www.osgeo.cn/python_gdal_utah_tutorial/ch04.html#id1

Guess you like

Origin blog.csdn.net/weixin_42990464/article/details/111352919