Files
sunvpy-docs/docs/content/12-she-zhi-xuan-ze-tiao-jian.md

598 lines
21 KiB
Markdown
Raw Normal View History

2026-04-10 13:47:53 +08:00
本页面介绍 SunvStation Python 脚本中设置选择条件的方法。选择条件是过滤地理对象的查询规则,通过组合不同条件可以精确筛选出符合特定要求的地物对象。掌握条件设置的语法和技巧,能够显著提升数据处理脚本的效率和准确性。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137)
## 核心方法概述
`setSelectCondition()` 方法是设置选择条件的主要接口。该方法将指定的条件添加到脚本选择集的查询规则中,可以多次调用以构建复合查询条件。条件由三个部分组成:条件名称、操作模式和条件值,三者组合形成一个完整的查询表达式。
```python
SSProcess.setSelectCondition(conditionName, operateMode, conditionValue)
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137)
**方法的底层实现**通过调用 `searchHelper.addCondition()` 将条件添加到内部维护的条件列表中。这些条件在调用 `selectFilter()` 时被实际执行,从而过滤出符合所有条件的地理对象。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137)
## 条件名称类型
选择条件的名称conditionName决定了查询的目标属性。系统支持三种类型的条件名称基本属性、几何特性和扩展属性每种类型有不同的前缀标识规则。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L56-L115)
### 基本属性
`SSObj_` 开头的属性称为基本属性,这些是地理对象的内置属性,涵盖对象的标识、外观、几何信息等。基本属性是最常用的查询条件,覆盖了大多数常规筛选需求。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L56-L107)
**常用基本属性列表**
| 属性名称 | 说明 | 示例值 |
|---------|------|--------|
| `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](ssprocess_mixins/selection_mixin.py#L60-L103)
**注记对象特有属性**
| 属性名称 | 说明 |
|---------|------|
| `SSObj_FontWidth` | 字宽 |
| `SSObj_FontHeight` | 字高 |
| `SSObj_FontName` | 字体名 |
| `SSObj_FontClass` | 注记分类号 |
| `SSObj_FontAlignment` | 对齐方式 |
| `SSObj_FontString` | 注记内容 |
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L88-L98)
### 几何特性
使用尖括号 `<>` 括住的属性称为几何特性,用于查询对象的拓扑或几何状态特征。这些条件不直接比较属性值,而是判断对象是否满足特定的几何条件。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106)
**常用几何特性**
| 特性名称 | 说明 | 常用操作符 |
|---------|------|----------|
| `<Overlap>` | 重叠 | "==" |
| `<Close>` | 封闭 | "==" |
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106)
几何特性通常使用 `"=="` 操作符,条件值为 `"True"``"False"`,用于筛选出具有特定拓扑状态的对象。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L104-L106)
### 扩展属性
使用方括号 `[]` 括住的属性称为扩展属性,这些是用户自定义的属性字段,存储在对象的扩展属性表中。扩展属性允许根据业务需求灵活定义查询条件,是数据查询的强大工具。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L107-L108)
**扩展属性示例**
```python
# 查询扩展属性名为"建筑结构"的对象
SSProcess.setSelectCondition("[建筑结构]", "==", "砖混")
# 查询扩展属性为"层数"大于10的对象
SSProcess.setSelectCondition("[层数]", ">", "10")
# 多个扩展属性组合查询(支持逗号分隔)
SSProcess.setSelectCondition("[结构],[层数]", "LIKE", "砖混,6")
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L253-L274)
## 操作模式
操作模式operateMode定义了条件名称与条件值之间的比较方式。系统支持多种比较操作符可以满足从精确匹配到模糊查询的各种需求。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L110-L117)
### 基本比较操作符
| 操作符 | 说明 | 适用数据类型 | 示例 |
|-------|------|------------|------|
| `==` | 等于 | 所有类型 | `"SSObj_Code", "==", "A1"` |
| `>` | 大于 | 数值 | `"SSObj_Length", ">", "100"` |
| `<` | 小于 | 数值 | `"SSObj_Area", "<", "50"` |
| `<>` | 不等于 | 所有类型 | `"SSObj_Type", "<>", "NOTE"` |
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L110-L114)
### 字符串匹配操作符
| 操作符 | 说明 | 使用场景 |
|-------|------|---------|
| `LIKE` | 模糊匹配 | 部分匹配字符串,支持通配符 |
| `NOT LIKE` | 不匹配 | 排除特定模式的字符串 |
| `CompareNoCase` | 不区分大小写比较 | 忽略大小写的精确匹配 |
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L115-L116)
**模糊匹配示例**
```python
# 查询名称包含"建筑"的对象
SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑")
# 查询不包含"临时"的对象
SSProcess.setSelectCondition("SSObj_Name", "NOT LIKE", "临时")
# 不区分大小写匹配编码
SSProcess.setSelectCondition("SSObj_Code", "CompareNoCase", "a1")
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L115-L116)
### 特殊操作符
| 操作符 | 说明 | 使用场景 |
|-------|------|---------|
| `Dec` | 小数位控制 | 精确指定数值的小数位数 |
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L117)
`Dec` 操作符用于控制数值比较的小数位数,确保浮点数比较的精确性。例如,`"Dec(2)"` 表示比较时保留两位小数。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L117)
## 条件值方式
条件值conditionValue支持三种格式单值、多值和区间。不同的值格式对应不同的查询需求提供灵活的筛选能力。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L134)
### 单值方式
单值是最常用的条件值格式,直接指定一个具体的值进行比较。适用于精确匹配或数值范围查询。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L120)
```python
# 精确匹配编码
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013")
# 面积大于100
SSProcess.setSelectCondition("SSObj_Area", ">", "100")
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L120)
### 多值方式
多值格式使用逗号分隔多个值,用于匹配任意一个值的场景。这种方式相当于多个相等条件的"或"逻辑组合。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123)
```python
# 查询编码为A1或A2或A3的对象
SSProcess.setSelectCondition("SSObj_Code", "==", "A1,A2,A3")
# 查询多个点类型的对象
SSProcess.setSelectCondition("SSObj_PointCount", "==", "1,2,4")
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123)
多值方式大大简化了重复查询条件的编写,当需要匹配多个可能值时特别有用。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L122-L123)
### 区间方式
区间格式使用 `->` 分隔起始值和结束值,表示一个数值范围。适用于连续数值的区间查询。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126)
```python
# 查询面积在100到500之间的对象
SSProcess.setSelectCondition("SSObj_Area", "==", "100->500")
# 查询长度大于0小于等于1000的对象
SSProcess.setSelectCondition("SSObj_Length", "==", "0->1000")
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126)
区间方式是数值范围查询的简洁表达方式,等同于 `">="``"<="` 两个条件的组合。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L125-L126)
## 条件设置流程
设置选择条件并执行查询的完整流程包括清除旧条件、设置新条件、执行过滤和遍历结果四个步骤。
```mermaid
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](PySSProcess.py#L98-L108)
## 基础使用示例
### 示例一:精确匹配查询
查询编码为指定值的对象,这是最常见的查询场景。
```python
# 清除之前的条件
SSProcess.clearSelectCondition()
# 设置查询条件编码等于3103013
SSProcess.setSelectCondition("SSObj_Code", "==", "3103013")
# 执行查询
SSProcess.selectFilter()
# 获取结果数量
count = SSProcess.getSelGeoCount()
print(f"查询到 {count} 个对象")
```
Sources: [PySSProcess.py](PySSProcess.py#L98-L108)
### 示例二:组合条件查询
通过多次调用 `setSelectCondition()` 可以组合多个查询条件,系统将使用"与"逻辑匹配所有条件。
```python
# 清除旧条件
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](PySSProcess.py#L110-L130)
## 高级使用示例
### 示例三:模糊匹配与扩展属性
结合模糊匹配和扩展属性,实现业务相关的复杂查询。
```python
# 清除旧条件
SSProcess.clearSelectCondition()
# 查询名称包含"建筑"且结构为"砖混"的对象
SSProcess.setSelectCondition("SSObj_Name", "LIKE", "建筑")
SSProcess.setSelectCondition("[建筑结构]", "==", "砖混")
# 执行查询
SSProcess.selectFilter()
# 显示查询结果
count = SSProcess.getSelGeoCount()
print(f"找到 {count} 个符合条件的建筑物")
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L128-L134)
### 示例四:几何特性查询
利用几何特性筛选特定拓扑状态的对象。
```python
# 清除旧条件
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_mixins/selection_mixin.py#L104-L106)
### 示例五:区间数值查询
使用区间方式查询数值范围。
```python
# 清除旧条件
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_mixins/selection_mixin.py#L125-L126)
### 示例六:多值匹配查询
使用多值方式一次性匹配多个可能值。
```python
# 清除旧条件
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](ssprocess_mixins/selection_mixin.py#L122-L123)
## 条件设置的注意事项
### 条件的累积特性
多次调用 `setSelectCondition()` 会累积条件,新的条件不会覆盖旧条件。如果需要重新开始查询,必须先调用 `clearSelectCondition()` 清除所有旧条件。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L45-L49)
```python
# 错误示例:未清除旧条件
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](ssprocess_mixins/selection_mixin.py#L45-L49)
### 条件与查询的分离
设置条件本身不会触发查询,必须显式调用 `selectFilter()` 方法才会执行过滤操作。这种分离设计允许在执行前组合多个条件。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L154)
```python
# 设置多个条件
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](ssprocess_mixins/selection_mixin.py#L137-L154)
### 值格式的正确使用
正确使用单值、多值和区间格式,避免语法错误导致查询失败。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L126)
| 值格式 | 正确示例 | 错误示例 |
|-------|---------|---------|
| 单值 | `"A1"` | `A1`(缺少引号) |
| 多值 | `"A1,A2,A3"` | `"A1;A2;A3"`(使用错误分隔符) |
| 区间 | `"100->500"` | `"100-500"`(使用错误符号) |
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L119-L126)
### 扩展属性的大小写敏感性
扩展属性的名称和值通常区分大小写,需要确保使用与数据库中完全一致的大小写格式。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L253-L274)
```python
# 如果扩展属性名称为"建筑结构",不能使用"[建筑结构]"以外的格式
SSProcess.setSelectCondition("[建筑结构]", "==", "砖混") # 正确
SSProcess.setSelectCondition("[建筑结构]", "CompareNoCase", "砖混") # 不区分大小写匹配值
```
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L253-L274)
## 典型应用场景
### 场景一:按图层批量处理
对特定图层中的所有对象执行批量操作。
```python
# 清除选择集和条件
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](PySSProcess.py#L130-L150)
### 场景二:数据质量检查
查询可能存在问题的对象,如面积过小或长度异常。
```python
# 清除条件
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_mixins/selection_mixin.py#L56-L107)
### 场景三:按时间范围查询
查询特定时间段内创建或修改的对象。
```python
# 清除条件
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_mixins/selection_mixin.py#L94-L96)
### 场景四:按类型批量查询
分别查询不同类型的对象并分别处理。
```python
# 查询线对象
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](ssprocess_mixins/selection_mixin.py#L64-L66)
## 条件设置的性能考虑
### 多条件的查询效率
设置多个条件时,查询引擎会按照"与"逻辑执行,即对象必须同时满足所有条件才会被选中。合理设置条件的顺序可以提高查询效率,建议将选择性强的条件(如唯一编码)放在前面。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L51-L137)
```python
# 优化前:选择性弱的条件在前
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](ssprocess_mixins/selection_mixin.py#L51-L137)
### 避免过度复杂的条件
过于复杂的条件组合可能导致查询性能下降,建议将复杂查询拆分为多个简单查询。
Sources: [ssprocess_mixins/selection_mixin.py](ssprocess_mixins/selection_mixin.py#L137-L154)
```python
# 复杂查询:多个模糊匹配组合
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](ssprocess_mixins/selection_mixin.py#L137-L154)
## 下一步学习
掌握设置选择条件后,建议继续学习以下相关内容:
- **执行过滤查询**:了解如何调用 `selectFilter()` 方法执行查询,并查看更多查询示例,详见[执行过滤查询](13-zhi-xing-guo-lv-cha-xun)
- **遍历选择集对象**:学习如何高效遍历和访问选择集中的对象属性,详见[遍历选择集对象](14-bian-li-xuan-ze-ji-dui-xiang)
- **获取地物属性值**:深入了解各种基本属性和扩展属性的获取方法,详见[获取地物属性值](15-huo-qu-di-wu-shu-xing-zhi)
通过这些相关章节的学习,可以完整掌握选择集查询和处理的全套流程。