实现面矢量与点矢量之间选择(与Arcgis中Select By Location功能相同)
效果如图所示
具体实现代码如下:
1.导入用到的库
import glob
import os
import geopandas as gpd
import osgeo.ogr , osgeo.gdal
from osgeo import ogr,gdal,osr
2.实现函数:
def select_point(inpath , outpath , fanwei_shp ):
"""
@param inpath:点矢量所在路径
@param outpath:输出路径
@param fanwei_shp:面矢量
"""
for i, txt_filename in enumerate(glob.glob(os.path.join(inpath, '*.shp'))):
if os.path.basename(txt_filename) == "PREus.shp":
print(f"跳过 {txt_filename},因为文件名为\"PREus.shp\"。")
continue
##上述条件判断为实现跳过特定名称文件,可以自定义设置;
print('processing:Selecting points:', i + 1)
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
shpdriver = ogr.GetDriverByName('ESRI Shapefile') # 获取驱动
fanwei_shp1 = shpdriver.Open(fanwei_shp) # 获取数据集
point_shp = shpdriver.Open(txt_filename)
fanwei_layer = fanwei_shp1.GetLayer(0) # 获取图层
point_layer = point_shp.GetLayer(0)
fanwei_feat = fanwei_layer.GetNextFeature() # 获取要素
poly = fanwei_feat.GetGeometryRef() # 获取几何
point_layer.SetSpatialFilter(poly) # 空间滤波获取fanwei内的点
### 条件判断,输出路径不存在时,创建输出路径
try:
os.makedirs(outpath)
except:
pass
### 输出文件名在原先点矢量文件名后加 "_select.shp"
out_shp = outpath + os.path.basename(txt_filename).split('.')[0] + "_select.shp" # 定义输出shp
### 判断输出文件名是否存在,存在的情况先删除,后重新新建
if os.access(out_shp, os.F_OK): # 判断该文件是否已经存在
shpdriver.DeleteDataSource(out_shp) # 文件若存在,则删除文件
newds = shpdriver.CreateDataSource(out_shp) # 创建数据集
pt_layer = newds.CopyLayer(point_layer, "") # 通过图层拷贝方法获取图层
newds.Destroy() # 销毁数据源
3.调用函数:
if __name__ == "__main__":
inpath = r"your path\\shp\\" # 设置原始数据输入路径
fanwei_shp = r"your path\\BeiJing.shp" # 区域选择范围矢量
outpath_select = r"your path\\\\1_Select\\" # 设置按区域选择点的输出路径
select_point(inpath , outpath_select , fanwei_shp) ##调用函数,输出结果