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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python使用GDAL库进行地理数据处理是非常常见的。GDAL是Geospatial Data Abstraction Library的缩写,它是一个开源的地理数据处理库,支持读取、写入和处理各种栅格和矢量地理数据格式。 要在Python使用GDAL,首先需要安装GDAL库和相关的Python绑定。你可以通过以下命令使用pip安装: ``` pip install GDAL ``` 安装完成后,你可以在Python脚本中导入GDAL模块,并开始使用它的功能。下面是一个使用GDAL读取栅格数据的简单示例: ```python from osgeo import gdal # 打开栅格数据集 dataset = gdal.Open('path/to/your/raster.tif') # 获取地理变换信息 geotransform = dataset.GetGeoTransform() print('地理变换信息:', geotransform) # 获取栅格数据集的行列数 rows = dataset.RasterYSize cols = dataset.RasterXSize print('行数:', rows) print('列数:', cols) # 读取栅格数据 band = dataset.GetRasterBand(1) data = band.ReadAsArray(0, 0, cols, rows) print('栅格数据:', data) # 关闭数据集 dataset = None ``` 上述代码中,我们首先使用`gdal.Open()`函数打开一个栅格数据集。然后,我们可以使用`GetGeoTransform()`方法获取地理变换信息,包括起始点的坐标、像素的大小和旋转信息。通过`RasterYSize`和`RasterXSize`属性获取数据集的行数和列数。接下来,我们使用`GetRasterBand()`方法获取特定波段的对象,并使用`ReadAsArray()`方法读取栅格数据。最后,我们使用`None`来关闭数据集。 除了读取栅格数据,GDAL还提供了许多其他的功能,比如写入栅格数据、矢量数据的读写、投影转换等。你可以参考GDAL的官方文档以了解更多详细信息和示例代码。 希望这能帮助到你!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值