文章目录
- 实现效果
- 实现功能
- 实现代码
实现效果
一个渔网数据,一个多边形要素数据:
完全包含多边形要素数据效果:
输出结果:
网格完全位于多边形要素空间范围内:
实现功能
应用两个空间矢量数据进行GIS空间分析–Contains(包含)操作
备注:两个数据坐标系保持相同。
说明:
除了 Contains
空间关系,还有许多其他空间关系,这些关系用于描述几何对象之间的相互位置和包含关系。一些常见的空间关系包括:
Intersects(相交): 一个几何对象与另一个几何对象至少有一个公共点,但不一定完全包含对方。
Touches(相邻): 一个几何对象的边界与另一个几何对象的边界相接触,但没有内部交叉。
Overlaps(重叠): 两个几何对象在二维平面上有部分重叠,但不完全包含对方。
Crosses(相交但不包含): 一个几何对象穿越另一个几何对象,但不包含对方。
Within(在内部): 一个几何对象完全包含在另一个几何对象的内部,包含是严格的。
Equals(相等): 两个几何对象在几何形状和空间位置上完全相同。
Disjoint(不相交): 两个几何对象没有任何交集,彼此独立。
这些空间关系在地理信息系统 (GIS) 和几何计算中非常重要,用于执行空间关系查询。
实现代码
# -*- coding: utf-8 -*-
"""
@time: 2023-8-28 15:30
@author: RSer_gis
"""from osgeo import ogr, gdalfirst_shapefile = r"D:\Desktop\test\first_shapefile.shp"
second_shapefile =r"D:\Desktop\test\fishnet_shapefile.shp"
output_shapefile = r"D:\Desktop\test\fishnet—contain.shp"# 设置Shapefile UTF-8编码
gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")
# 打开第一个SHP数据
source_ds = ogr.Open(first_shapefile, 0) # 0 表示只读方式打开
layer1 = source_ds.GetLayer()# 打开第二个SHP数据
target_ds = ogr.Open(second_shapefile, 0)
layer2 = target_ds.GetLayer()
spatialRef = layer2.GetSpatialRef()# 创建新的SHP数据源
output_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(output_shapefile)
output_layer = output_ds.CreateLayer('output_layer', spatialRef, geom_type=ogr.wkbPolygon)# 复制第一个SHP数据的字段到新数据源
layer_def = layer2.GetLayerDefn()
for i in range(layer_def.GetFieldCount()):output_layer.CreateField(layer_def.GetFieldDefn(i))# 遍历第二个SHP中的每个要素
for feat2 in layer2:geometry2 = feat2.geometry()# 遍历第一个SHP中的每个要素,检查是否包含第二个SHP要素for feat1 in layer1:geometry1 = feat1.geometry()if geometry1.Contains(geometry2): # Contains方法output_feat = ogr.Feature(output_layer.GetLayerDefn())output_feat.SetGeometry(geometry2.Clone())for i in range(output_feat.GetFieldCount()):output_feat.SetField(i, feat2.GetField(i)) # i为字段索引output_layer.CreateFeature(output_feat)output_feat = Nonesource_ds = None
target_ds = None
output_ds = None