21 KiB
本页面介绍 SunvStation Python 脚本中设置选择条件的方法。选择条件是过滤地理对象的查询规则,通过组合不同条件可以精确筛选出符合特定要求的地物对象。掌握条件设置的语法和技巧,能够显著提升数据处理脚本的效率和准确性。
Sources: ssprocess_mixins/selection_mixin.py
核心方法概述
setSelectCondition() 方法是设置选择条件的主要接口。该方法将指定的条件添加到脚本选择集的查询规则中,可以多次调用以构建复合查询条件。条件由三个部分组成:条件名称、操作模式和条件值,三者组合形成一个完整的查询表达式。
SSProcess.setSelectCondition(conditionName, operateMode, conditionValue)
Sources: ssprocess_mixins/selection_mixin.py
方法的底层实现通过调用 searchHelper.addCondition() 将条件添加到内部维护的条件列表中。这些条件在调用 selectFilter() 时被实际执行,从而过滤出符合所有条件的地理对象。
Sources: ssprocess_mixins/selection_mixin.py
条件名称类型
选择条件的名称(conditionName)决定了查询的目标属性。系统支持三种类型的条件名称:基本属性、几何特性和扩展属性,每种类型有不同的前缀标识规则。
Sources: ssprocess_mixins/selection_mixin.py
基本属性
以 SSObj_ 开头的属性称为基本属性,这些是地理对象的内置属性,涵盖对象的标识、外观、几何信息等。基本属性是最常用的查询条件,覆盖了大多数常规筛选需求。
Sources: ssprocess_mixins/selection_mixin.py
常用基本属性列表:
| 属性名称 | 说明 | 示例值 |
|---|---|---|
SSObj_ID |
对象唯一标识 | "1001" |
SSObj_Code |
编码 | "3103013" |
SSObj_LayerName |
层名 | "Default_A" |
SSObj_Type |
对象类型 | "POINT", "LINE", "AREA", "NOTE" |
SSObj_Color |
颜色 | "RGB(255,0,0)", "16777215" |
SSObj_Name |
对象名称 | "建筑物1" |
SSObj_Area |
面积 | "150.5" |
SSObj_Length |
长度 | "230.8" |
SSObj_PointCount |
点数 | "1", "1,2,4" |
SSObj_X / SSObj_Y / SSObj_Z |
坐标 | "12345.67", "2345.89", "0" |
SSObj_CreateTime |
创建时间 | "2023-07-01 12:00:00" |
SSObj_ModifyTime |
修改时间 | "2023-08-15 09:30:00" |
Sources: ssprocess_mixins/selection_mixin.py
注记对象特有属性:
| 属性名称 | 说明 |
|---|---|
SSObj_FontWidth |
字宽 |
SSObj_FontHeight |
字高 |
SSObj_FontName |
字体名 |
SSObj_FontClass |
注记分类号 |
SSObj_FontAlignment |
对齐方式 |
SSObj_FontString |
注记内容 |
Sources: ssprocess_mixins/selection_mixin.py
几何特性
使用尖括号 <> 括住的属性称为几何特性,用于查询对象的拓扑或几何状态特征。这些条件不直接比较属性值,而是判断对象是否满足特定的几何条件。
Sources: ssprocess_mixins/selection_mixin.py
常用几何特性:
| 特性名称 | 说明 | 常用操作符 |
|---|---|---|
<Overlap> |
重叠 | "==" |
<Close> |
封闭 | "==" |
Sources: ssprocess_mixins/selection_mixin.py
几何特性通常使用 "==" 操作符,条件值为 "True" 或 "False",用于筛选出具有特定拓扑状态的对象。
Sources: ssprocess_mixins/selection_mixin.py
扩展属性
使用方括号 [] 括住的属性称为扩展属性,这些是用户自定义的属性字段,存储在对象的扩展属性表中。扩展属性允许根据业务需求灵活定义查询条件,是数据查询的强大工具。
Sources: ssprocess_mixins/selection_mixin.py
扩展属性示例:
# 查询扩展属性名为"建筑结构"的对象
SSProcess.setSelectCondition("[建筑结构]", "==", "砖混")
# 查询扩展属性为"层数"大于10的对象
SSProcess.setSelectCondition("[层数]", ">", "10")
# 多个扩展属性组合查询(支持逗号分隔)
SSProcess.setSelectCondition("[结构],[层数]", "LIKE", "砖混,6")
Sources: ssprocess_mixins/selection_mixin.py
操作模式
操作模式(operateMode)定义了条件名称与条件值之间的比较方式。系统支持多种比较操作符,可以满足从精确匹配到模糊查询的各种需求。
Sources: ssprocess_mixins/selection_mixin.py
基本比较操作符
| 操作符 | 说明 | 适用数据类型 | 示例 |
|---|---|---|---|
== |
等于 | 所有类型 | "SSObj_Code", "==", "A1" |
> |
大于 | 数值 | "SSObj_Length", ">", "100" |
< |
小于 | 数值 | "SSObj_Area", "<", "50" |
<> |
不等于 | 所有类型 | "SSObj_Type", "<>", "NOTE" |
Sources: ssprocess_mixins/selection_mixin.py
字符串匹配操作符
| 操作符 | 说明 | 使用场景 |
|---|---|---|
LIKE |
模糊匹配 | 部分匹配字符串,支持通配符 |
NOT LIKE |
不匹配 | 排除特定模式的字符串 |
CompareNoCase |
不区分大小写比较 | 忽略大小写的精确匹配 |
Sources: ssprocess_mixins/selection_mixin.py
模糊匹配示例:
# 查询名称包含"建筑"的对象
SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑")
# 查询不包含"临时"的对象
SSProcess.setSelectCondition("SSObj_Name", "NOT LIKE", "临时")
# 不区分大小写匹配编码
SSProcess.setSelectCondition("SSObj_Code", "CompareNoCase", "a1")
Sources: ssprocess_mixins/selection_mixin.py
特殊操作符
| 操作符 | 说明 | 使用场景 |
|---|---|---|
Dec |
小数位控制 | 精确指定数值的小数位数 |
Sources: ssprocess_mixins/selection_mixin.py
Dec 操作符用于控制数值比较的小数位数,确保浮点数比较的精确性。例如,"Dec(2)" 表示比较时保留两位小数。
Sources: ssprocess_mixins/selection_mixin.py
条件值方式
条件值(conditionValue)支持三种格式:单值、多值和区间。不同的值格式对应不同的查询需求,提供灵活的筛选能力。
Sources: ssprocess_mixins/selection_mixin.py
单值方式
单值是最常用的条件值格式,直接指定一个具体的值进行比较。适用于精确匹配或数值范围查询。
Sources: ssprocess_mixins/selection_mixin.py
# 精确匹配编码
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013")
# 面积大于100
SSProcess.setSelectCondition("SSObj_Area", ">", "100")
Sources: ssprocess_mixins/selection_mixin.py
多值方式
多值格式使用逗号分隔多个值,用于匹配任意一个值的场景。这种方式相当于多个相等条件的"或"逻辑组合。
Sources: ssprocess_mixins/selection_mixin.py
# 查询编码为A1或A2或A3的对象
SSProcess.setSelectCondition("SSObj_Code", "==", "A1,A2,A3")
# 查询多个点类型的对象
SSProcess.setSelectCondition("SSObj_PointCount", "==", "1,2,4")
Sources: ssprocess_mixins/selection_mixin.py
多值方式大大简化了重复查询条件的编写,当需要匹配多个可能值时特别有用。
Sources: ssprocess_mixins/selection_mixin.py
区间方式
区间格式使用 -> 分隔起始值和结束值,表示一个数值范围。适用于连续数值的区间查询。
Sources: ssprocess_mixins/selection_mixin.py
# 查询面积在100到500之间的对象
SSProcess.setSelectCondition("SSObj_Area", "==", "100->500")
# 查询长度大于0小于等于1000的对象
SSProcess.setSelectCondition("SSObj_Length", "==", "0->1000")
Sources: ssprocess_mixins/selection_mixin.py
区间方式是数值范围查询的简洁表达方式,等同于 ">=" 和 "<=" 两个条件的组合。
Sources: ssprocess_mixins/selection_mixin.py
条件设置流程
设置选择条件并执行查询的完整流程包括清除旧条件、设置新条件、执行过滤和遍历结果四个步骤。
flowchart LR
A[开始查询流程] --> B{是否需要清除旧条件?}
B -->|是| C[clearSelectCondition]
B -->|否| D[设置选择条件]
C --> D
D --> E{是否需要多个条件?}
E -->|是| D
E -->|否| F[selectFilter 执行过滤]
F --> G[查询完成]
G --> H[获取选择集数量]
H --> I[遍历选择集对象]
Sources: PySSProcess.py
基础使用示例
示例一:精确匹配查询
查询编码为指定值的对象,这是最常见的查询场景。
# 清除之前的条件
SSProcess.clearSelectCondition()
# 设置查询条件:编码等于3103013
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013")
# 执行查询
SSProcess.selectFilter()
# 获取结果数量
count = SSProcess.getSelGeoCount()
print(f"查询到 {count} 个对象")
Sources: PySSProcess.py
示例二:组合条件查询
通过多次调用 setSelectCondition() 可以组合多个查询条件,系统将使用"与"逻辑匹配所有条件。
# 清除旧条件
SSProcess.clearSelectCondition()
# 设置组合条件:位于Default_A层且为面积类型且面积大于100
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A")
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.setSelectCondition("SSObj_Area", ">", "100")
# 执行查询
SSProcess.selectFilter()
# 遍历结果
count = SSProcess.getSelGeoCount()
for i in range(min(5, count)): # 只显示前5个
code = SSProcess.getSelGeoValue(i, "SSObj_Code")
name = SSProcess.getSelGeoValue(i, "SSObj_Name")
area = SSProcess.getSelGeoValue(i, "SSObj_Area")
print(f"对象{i}: 编码={code}, 名称={name}, 面积={area}")
Sources: PySSProcess.py
高级使用示例
示例三:模糊匹配与扩展属性
结合模糊匹配和扩展属性,实现业务相关的复杂查询。
# 清除旧条件
SSProcess.clearSelectCondition()
# 查询名称包含"建筑"且结构为"砖混"的对象
SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑")
SSProcess.setSelectCondition("[建筑结构]", "==", "砖混")
# 执行查询
SSProcess.selectFilter()
# 显示查询结果
count = SSProcess.getSelGeoCount()
print(f"找到 {count} 个符合条件的建筑物")
Sources: ssprocess_mixins/selection_mixin.py
示例四:几何特性查询
利用几何特性筛选特定拓扑状态的对象。
# 清除旧条件
SSProcess.clearSelectCondition()
# 查询重叠的面对象
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.setSelectCondition("<Overlap>", "==", "True")
# 执行查询
SSProcess.selectFilter()
# 检查重叠对象
count = SSProcess.getSelGeoCount()
print(f"发现 {count} 个重叠的面对象")
Sources: ssprocess_mixins/selection_mixin.py
示例五:区间数值查询
使用区间方式查询数值范围。
# 清除旧条件
SSProcess.clearSelectCondition()
# 查询面积在100到500之间的面对象
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.setSelectCondition("SSObj_Area", "==", "100->500")
# 执行查询
SSProcess.selectFilter()
# 统计结果
count = SSProcess.getSelGeoCount()
print(f"面积在100-500范围内的面对象数量: {count}")
Sources: ssprocess_mixins/selection_mixin.py
示例六:多值匹配查询
使用多值方式一次性匹配多个可能值。
# 清除旧条件
SSProcess.clearSelectCondition()
# 查询编码为A1、A2或A3中的任意一个
SSProcess.setSelectCondition("SSObj_Code", "==", "A1,A2,A3")
# 执行查询
SSProcess.selectFilter()
# 显示结果
count = SSProcess.getSelGeoCount()
print(f"编码为A1/A2/A3的对象数量: {count}")
Sources: ssprocess_mixins/selection_mixin.py
条件设置的注意事项
条件的累积特性
多次调用 setSelectCondition() 会累积条件,新的条件不会覆盖旧条件。如果需要重新开始查询,必须先调用 clearSelectCondition() 清除所有旧条件。
Sources: ssprocess_mixins/selection_mixin.py
# 错误示例:未清除旧条件
SSProcess.setSelectCondition("SSObj_Type", "==", "LINE")
SSProcess.setSelectCondition("SSObj_Code", "==", "A1")
# 此时查询的是类型为LINE且编码为A1的对象,而不是仅编码为A1的对象
# 正确示例:先清除再设置
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_Code", "==", "A1")
Sources: ssprocess_mixins/selection_mixin.py
条件与查询的分离
设置条件本身不会触发查询,必须显式调用 selectFilter() 方法才会执行过滤操作。这种分离设计允许在执行前组合多个条件。
Sources: ssprocess_mixins/selection_mixin.py
# 设置多个条件
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A")
SSProcess.setSelectCondition("SSObj_Area", ">", "50")
# 此时选择集仍然是旧的,查询尚未执行
# 执行查询
SSProcess.selectFilter()
# 此时选择集才被更新为查询结果
Sources: ssprocess_mixins/selection_mixin.py
值格式的正确使用
正确使用单值、多值和区间格式,避免语法错误导致查询失败。
Sources: ssprocess_mixins/selection_mixin.py
| 值格式 | 正确示例 | 错误示例 |
|---|---|---|
| 单值 | "A1" |
A1(缺少引号) |
| 多值 | "A1,A2,A3" |
"A1;A2;A3"(使用错误分隔符) |
| 区间 | "100->500" |
"100-500"(使用错误符号) |
Sources: ssprocess_mixins/selection_mixin.py
扩展属性的大小写敏感性
扩展属性的名称和值通常区分大小写,需要确保使用与数据库中完全一致的大小写格式。
Sources: ssprocess_mixins/selection_mixin.py
# 如果扩展属性名称为"建筑结构",不能使用"[建筑结构]"以外的格式
SSProcess.setSelectCondition("[建筑结构]", "==", "砖混") # 正确
SSProcess.setSelectCondition("[建筑结构]", "CompareNoCase", "砖混") # 不区分大小写匹配值
Sources: ssprocess_mixins/selection_mixin.py
典型应用场景
场景一:按图层批量处理
对特定图层中的所有对象执行批量操作。
# 清除选择集和条件
SSProcess.clearSelection()
SSProcess.clearSelectCondition()
# 设置条件:选中Default_A层的所有对象
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A")
# 执行查询
SSProcess.selectFilter()
# 批量修改属性
count = SSProcess.getSelGeoCount()
for i in range(count):
SSProcess.setSelGeoValue(i, "SSObj_Color", "16777215")
SSProcess.setSelGeoValue(i, "SSObj_DataMark", "1")
Sources: PySSProcess.py
场景二:数据质量检查
查询可能存在问题的对象,如面积过小或长度异常。
# 清除条件
SSProcess.clearSelectCondition()
# 查询面积小于5的面对象(可能为错误数据)
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.setSelectCondition("SSObj_Area", "<", "5")
# 执行查询
SSProcess.selectFilter()
# 输出问题对象
count = SSProcess.getSelGeoCount()
print(f"发现 {count} 个面积过小的对象")
for i in range(count):
code = SSProcess.getSelGeoValue(i, "SSObj_Code")
area = SSProcess.getSelGeoValue(i, "SSObj_Area")
print(f" 编码 {code}, 面积 {area}")
Sources: ssprocess_mixins/selection_mixin.py
场景三:按时间范围查询
查询特定时间段内创建或修改的对象。
# 清除条件
SSProcess.clearSelectCondition()
# 查询2023年7月创建的对象
SSProcess.setSelectCondition("SSObj_CreateTime", ">=", "2023-07-01 00:00:00")
SSProcess.setSelectCondition("SSObj_CreateTime", "<", "2023-08-01 00:00:00")
# 执行查询
SSProcess.selectFilter()
# 统计结果
count = SSProcess.getSelGeoCount()
print(f"2023年7月创建的对象数量: {count}")
Sources: ssprocess_mixins/selection_mixin.py
场景四:按类型批量查询
分别查询不同类型的对象并分别处理。
# 查询线对象
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_Type", "==", "LINE")
SSProcess.selectFilter()
line_count = SSProcess.getSelGeoCount()
print(f"线对象: {line_count}")
# 查询面对象
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("SSObj_Type", "==", "AREA")
SSProcess.selectFilter()
area_count = SSProcess.getSelGeoCount()
print(f"面对象: {area_count}")
Sources: ssprocess_mixins/selection_mixin.py
条件设置的性能考虑
多条件的查询效率
设置多个条件时,查询引擎会按照"与"逻辑执行,即对象必须同时满足所有条件才会被选中。合理设置条件的顺序可以提高查询效率,建议将选择性强的条件(如唯一编码)放在前面。
Sources: ssprocess_mixins/selection_mixin.py
# 优化前:选择性弱的条件在前
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") # 该层可能包含大量对象
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") # 编码唯一,选择性极强
# 优化后:选择性强的条件在前
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013") # 快速定位唯一对象
SSProcess.setSelectCondition("SSObj_LayerName", "==", "Default_A") # 进一步验证
Sources: ssprocess_mixins/selection_mixin.py
避免过度复杂的条件
过于复杂的条件组合可能导致查询性能下降,建议将复杂查询拆分为多个简单查询。
Sources: ssprocess_mixins/selection_mixin.py
# 复杂查询:多个模糊匹配组合
SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑")
SSProcess.setSelectCondition("SSObj_Name", "LIKE", "住宅")
SSProcess.setSelectCondition("[结构]", "==", "砖混")
SSProcess.setSelectCondition("SSObj_Area", ">", "50")
SSProcess.setSelectCondition("SSObj_Area", "<", "500")
# 这样的查询可能较慢
# 拆分为两步:先按结构筛选,再进一步过滤
SSProcess.clearSelectCondition()
SSProcess.setSelectCondition("[结构]", "==", "砖混")
SSProcess.selectFilter()
# 对选择集结果再进行进一步处理...
Sources: ssprocess_mixins/selection_mixin.py
下一步学习
掌握设置选择条件后,建议继续学习以下相关内容:
-
执行过滤查询:了解如何调用
selectFilter()方法执行查询,并查看更多查询示例,详见执行过滤查询 -
遍历选择集对象:学习如何高效遍历和访问选择集中的对象属性,详见遍历选择集对象
-
获取地物属性值:深入了解各种基本属性和扩展属性的获取方法,详见获取地物属性值
通过这些相关章节的学习,可以完整掌握选择集查询和处理的全套流程。