Python+OGR库学习(五):要素筛选

本文介绍了使用Python结合OGR库进行要素筛选的操作,具体任务是根据name字段筛选出cache_towns.shp中name为'Nibley'的多边形,创建1500单位的缓冲区,然后筛选出sites.shp中位于该缓冲区内的点,打印这些点的id。通过设置AttributeFilter和SpatialFilter实现属性与空间筛选。此外,还提到可通过SQL语句完成筛选,且该方法适用于对DataSource的操作。文章最后提及了对文件夹中所有shp文件批量投影的后续内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码任务

多边形是矢量cache_towns.shp,有一个字段name,及点矢量sites.shp,python实现:拿出name为Nibley的要素,并建立1500的缓冲区,用新的要素筛选sites文件,找到在这个缓冲区内的所有点,并打印其id

代码思路

1、打开两个文件,获取到图层(不管是属性筛选还是空间范围筛选,操作对象那个都是图层)
2、layer.SetAttributeFilter("name = ‘Nibley’ ")筛选出符合的要素,获取个数
3、要素中读取几何求缓冲区得到新的几何体
4、layer.SetSpatialFilter(geombuffer)筛选sites,并打印id

代码

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import ogr,os
driver = ogr.GetDriverByName('ESRI Shapefile')
os.chdir(r
<think>好的,用户之前问过如何用GDAL的ogr2ogr命令行工具提取土地利用图中的林地部分,现在他想知道如何用OGR来实现同样的操作。我需要确保我的回答能帮助他理解具体的代码步骤,同时考虑到他可能对OGR不太熟悉。 首先,用户可能已经了解ogr2ogr的命令行用法,现在想深入编程实现,可能是为了集成到更大的项目中或者自动化处理。所以需要提供一个Python脚本示例,使用GDAL/OGRPython绑定。 接下来,我需要确定用户的操作系统,但GDALPython中通常是跨平台的,所以代码示例应该通用。用户可能需要安装gdal包,比如通过pip安装,但有时可能需要从特定源安装,比如conda或者系统包管理器,这点需要提及。 然后,代码的结构应该包括导入、打开数据源、获取图层、设置属性过滤器、创建输数据源、复制图层等步骤。需要处理中文字符的问题,比如设置locale,避免乱码,但用户可能已经配置好了环境,不过还是应该提到。 另外,字段名和字段值的准确性很重要,用户需要确认自己的数据中的实际字段名和值,可能和示例中的不同。需要提醒用户根据实际情况修改代码中的字段名和值。 还要注意驱动程序的名称,比如ESRI Shapefile对应的驱动名是'ESRI Shapefile',需要正确指定输格式。另外,输文件路径的处理,比如是否覆盖现有文件,可能需要设置选项,但示例中可能为了简洁省略。 最后,需要验证输是否正确,可以建议用户用ogrinfo或者QGIS查看结果。另外,异常处理也是必要的,比如数据源无法打开的情况,但示例可能为了简洁省略try-except块,但最好提到这一点。 总结下来,我需要提供一个简洁但完整的Python脚本,解释每一步的作用,注意事项,以及可能的安装和验证步骤。同时,要确保用户知道根据实际情况调整字段名和值,并处理文件路径等问题。</think>以下是使用Python的`ogr`实现**提取林地并另存为独立Shapefile**的完整代码示例: ```python from osgeo import ogr import locale # 设置系统区域(防止中文路径/字段乱码) locale.setlocale(locale.LC_ALL, '') # 输入文件 input_shp = 'input.shp' # 输文件 output_shp = 'forest.shp' # 打开原始数据源 in_ds = ogr.Open(input_shp) in_layer = in_ds.GetLayer() # 设置过滤条件(假设字段名为"land_type",过滤值为"Forest") in_layer.SetAttributeFilter("land_type = 'Forest'") # 创建输文件 driver = ogr.GetDriverByName('ESRI Shapefile') if driver is None: raise RuntimeError("ESRI Shapefile驱动不可用") # 删除已存在的同名文件(避免报错) if os.path.exists(output_shp): driver.DeleteDataSource(output_shp) # 创建新数据源并复制要素 out_ds = driver.CreateDataSource(output_shp) out_layer = out_ds.CopyLayer(in_layer, 'forest_layer') # 释放资源 out_ds = in_ds = None ``` --- ### 关键点解析 1. **属性过滤**:通过`SetAttributeFilter()`实现SQL条件筛选,语法与SQL WHERE子句一致 - 字符串值需用单引号包裹(`'Forest'`) - 数值型直接写数字(`population > 1000`) 2. **驱动选择**:`GetDriverByName('ESRI Shapefile')`指定输格式为Shapefile 3. **文件处理**: - 必须删除已存在的同名文件(GDAL不会自动覆盖) - `CopyLayer()`完整复制图层结构+数据 --- ### 常见问题处理 1. **中文路径问题**:通过`locale.setlocale(locale.LC_ALL, '')`设置系统区域配置 2. **字段名验证**:建议先用`for field in in_layer.schema: print(field.name)`查看实际字段名 3. **复杂条件**:支持`AND/OR`组合条件,如`"land_type='Forest' AND area > 5000"` --- ### 扩展功能建议 ```python # 查看图层字段结构(调试用) print("字段列表:") for i in range(in_layer_defn.GetFieldCount()): field_defn = in_layer_defn.GetFieldDefn(i) print(f"{i}. {field_defn.GetName()} ({field_defn.GetTypeName()})") # 统计提取结果 print(f"提取到 {out_layer.GetFeatureCount()} 个林地要素") ``` --- ### 环境准备 1. 安装GDAL Python绑定: ```bash conda install -c conda-forge gdal # 推荐Anaconda方式 # 或 pip install GDAL==$(gdal-config --version).0 # 需先安装GDAL ``` 2. 验证安装: ```python from osgeo import ogr print(ogr.__version__) # 应输3.x.x ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值