python 使用GDAL 面积相交查询

1、先试用GDAL导入shp 文件,

2、有A,B两个SHP范围 A shp相当于市的范围,B shp 相当于县的范围

,以B的shp的范围选取Ashp的范围 选取出A的geometry

3,GDAL使用 Intersects进行相交查询 

from osgeo import ogr
import os
from server.app.Common import CACHE_DIR
from osgeo import gdal
import json

#根据自己的python换将引入GDAL
os.environ['PROJ_LIB'] = r'C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Lib\site-packages\osgeo\data\proj'
# 开启异常
gdal.UseExceptions()
shp_path = os.path.join(CACHE_DIR, 'tmp')
def duibiShp(multipolygons_json):
 

    # 打开 A 和 B 的 Shapefile 文件
    driver = ogr.GetDriverByName('ESRI Shapefile')
    A = driver.Open(os.getcwd()+'/lyshp/ly.shp', 0)
    B = driver.Open(multipolygons_json+'/out.shp', 0)



    # 获取 A 和 B 的 Layer
    A_layer = A.GetLayer()
    B_layer = B.GetLayer()

    # 创建一个空的输出图层
    driver = ogr.GetDriverByName('GeoJSON')
    fileOut = driver.CreateDataSource(os.getcwd()+'/geojsonOut/result.json')
    outLayer = fileOut.CreateLayer('result', B_layer.GetSpatialRef(), ogr.wkbMultiPolygon)
    for field in B_layer.schema:
        outLayer.CreateField(field)

    # 创建一个空间过滤器,用于查询 A 和 B 中相交大于 50% 的数据
    extent = B_layer.GetExtent()
    wktaa = 'POLYGON ((%f %f,%f %f,%f %f,%f %f,%f %f))' % (extent[0], extent[3],
                                                           extent[1], extent[3], extent[1], extent[2],
                                                           extent[0], extent[2], extent[0], extent[3])
    # spatial_filter = ogr.Geometry(ogr.wkbPolygon)
    spatial_filter=ogr.CreateGeometryFromWkt(wktaa)

    # 遍历 B 中的每个 Feature,查询与 A 中相交大于 50% 的 Feature,并打印查询结果
    for B_feature in B_layer:
        B_geometry = B_feature.GetGeometryRef()
        spatial_filter.Intersects(B_geometry)
        A_layer.SetSpatialFilter(spatial_filter)
        for A_feature in A_layer:
            A_geometry = A_feature.GetGeometryRef()
            intersection = A_geometry.Intersection(B_geometry)
            intersection_area = intersection.Area()
            # A_area = A_geometry.Area()
            A_area = B_geometry.Area()

            if intersection_area / A_area > 0.1:
                # print('B Feature ID: {}, A Feature ID: {}'.format(B_feature.GetFID(), A_feature.GetFID()))
                # print(intersection_area, '----------', A_area, intersection_area / A_area)
                # 添加 B 的几何到输出图层
                # 添加 B 的几何到输出图层
                outFeature = ogr.Feature(outLayer.GetLayerDefn())
                outFeature.SetGeometry(B_geometry)
                for i in range(B_feature.GetFieldCount()):
                    outFeature.SetField(outLayer.GetLayerDefn().GetFieldDefn(i).GetNameRef(),
                                        B_feature.GetField(i))
                # 添加输出图层
                outLayer.CreateFeature(outFeature)
    # result ={}
    # 读取输出的 GeoJSON 文件为 Python 对象
    # with open(os.getcwd()+'/geojsonOut/result.json') as f:
    #     result = json.load(f)
    # 保存输出文件
    outLayer = None
    fileOut.FlushCache()
    fileOut = None
    try:
        with open(os.getcwd()+'/geojsonOut/result.json') as f:
            data = json.load(f)
    except Exception as e:
        print('Error:', e)
    finally:
        f.close()
    # 删除输出的 GeoJSON 文件
    driver.DeleteDataSource(os.getcwd()+'/geojsonOut/result.json')
    print(data)

    # 关闭 Shapefile 文件
    A = None
    B = None
    return data

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值