本页面介绍 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) **常用几何特性**: | 特性名称 | 说明 | 常用操作符 | |---------|------|----------| | `` | 重叠 | "==" | | `` | 封闭 | "==" | 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("", "==", "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) 通过这些相关章节的学习,可以完整掌握选择集查询和处理的全套流程。