Files
sunvpy-docs/docs/content/17-di-wu-ji-ben-shu-xing-xiang-jie.md
2026-04-10 13:47:53 +08:00

427 lines
29 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
本文档深入解析 SunvStation 地物基本属性体系,阐述各类属性的物理含义、存储机制、应用场景以及底层实现原理。通过系统地理解这些属性,开发者可以更高效地进行地理数据管理和空间分析。
## 属性体系概览
地物基本属性体系是一个层次化的概念架构,将地理对象的各种特征抽象为可管理和可查询的属性集合。这个体系遵循从抽象到具体的分层原则,覆盖了对象的标识、几何、外观、时间等完整维度的信息。
```mermaid
flowchart TB
A[地物基本属性体系] --> B[标识属性组]
A --> C[几何属性组]
A --> D[外观属性组]
A --> E[时间属性组]
A --> F[注记属性组]
B --> B1[SSObj_ID<br/>系统唯一标识]
B --> B2[SSObj_Code<br/>业务编码]
B --> B3[SSObj_Name<br/>对象名称]
B --> B4[SSObj_Byname<br/>对象别名]
B --> B5[SSObj_LayerName<br/>图层归属]
B --> B6[SSObj_GroupID<br/>分组标识]
C --> C1[坐标点<br/>X, Y, Z, PointName, PointType]
C --> C2[几何尺寸<br/>Area, Length, 3DLength]
C --> C3[边界框<br/>minX, minY, maxX, maxY]
C --> C4[变换参数<br/>Angle, ScaleX, ScaleY]
D --> D1[颜色属性<br/>Color, HatchStyle]
D --> D2[线条属性<br/>LineType, LineWidth]
D --> D3[状态属性<br/>Status, DataMark]
E --> E1[CreateTime<br/>创建时间戳]
E --> E2[ModifyTime<br/>修改时间戳]
F --> F1[字体属性<br/>FontName, FontWidth, FontHeight]
F --> F2[内容属性<br/>FontString, FontStringCount]
F --> F3[样式属性<br/>FontAlignment, FontDirection, FontWeight]
```
这个属性体系通过 `ObjBaseAttr` 类进行统一管理。该类在初始化时会注册所有预定义的属性名称,并分配唯一的索引值,用于高效的属性访问和查找。属性索引化的设计使得属性访问从字符串匹配转换为整数索引查找,显著提升了性能,特别是在批量处理大量地物对象时。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L4-L90)
## 标识属性详解
标识属性是地物对象的身份特征,用于唯一确定和组织地理对象。理解这些属性的含义和作用,是构建有效数据管理策略的基础。
### SSObj_ID系统唯一标识
`SSObj_ID` 是系统分配的地物对象全局唯一标识符,通常为长整型数值。该属性具有以下关键特性:**不可变性**(对象创建后不会改变)、**全局唯一性**(在整个工作空间范围内唯一)、**自动分配**(由系统自动生成,无需手动指定)。该属性主要用于对象间引用关系管理、数据关联操作以及撤销操作的对象定位。
在实际应用中,当对象间需要建立关联时,通过 `SSObj_ID` 进行引用是最可靠的方式。例如,对象 A 需要引用对象 B应存储对象 B 的 `SSObj_ID` 而非 `SSObj_Code`,因为编码可能在业务流程中被修改,而 ID 保持不变。
### SSObj_Code业务编码
`SSObj_Code` 是地物对象的业务分类编码,通常对应国家或行业标准中的要素代码。该属性反映了地物的**语义分类**,如 100 代表控制点、200 代表道路等。与 `SSObj_ID` 不同,`SSObj_Code` 是业务概念层面的标识,可以在一定规则下修改。
在数据交换和跨系统集成场景中,`SSObj_Code` 扮演着关键角色。它使得不同系统间的数据映射成为可能,同时保证了数据语义的一致性。开发者在设计业务逻辑时,应优先基于 `SSObj_Code` 进行对象分类和功能分发,而不是硬编码具体的对象类型。
### SSObj_Name 与 SSObj_Byname
`SSObj_Name` 是地物对象的正式名称,通常用于地图标注、报表输出等展示场景。`SSObj_Byname` 则是对象的别名,用于存储对象的俗称、缩写或其他非正式名称。两者的区别在于**正式性**和**应用场景**Name 用于正式场合和对外展示Byname 用于内部管理和灵活查询。
一个典型的应用场景是道路管理:`SSObj_Name` 可能存储"中山北路",而 `SSObj_Byname` 可能存储"中山路"、"北环路"等历史名称或俗称,这为模糊查询和多名称检索提供了便利。
### SSObj_LayerName 与 SSObj_GroupID
`SSObj_LayerName` 表示地物对象所属的图层名称,体现了地图的**层次化管理**思想。图层是逻辑上的对象集合,同一图层中的对象通常具有相似的性质或用途。通过 `SSObj_LayerName`,可以快速筛选特定类型的对象,实现分层显示和符号化控制。
`SSObj_GroupID` 则提供了更灵活的对象分组机制。不同于图层的固定层级,分组是临时的、动态的、可自定义的。在批量操作中,可以将需要一起处理的对象分配到同一个组,然后通过 `SSObj_GroupID` 进行统一访问。这种设计减少了选择集操作的复杂度,提高了批量处理的效率。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L24-L43)
## 几何属性详解
几何属性描述了地物对象的空间形态和位置特征,是地理信息系统的核心数据类型。这些属性包括坐标点、尺寸参数、边界范围以及变换参数等。
### 坐标点属性体系
地物对象的几何形状由一系列坐标点构成每个坐标点包含空间位置X, Y, Z和附加属性名称、类型
| 属性名称 | 含义 | 数据类型 | 适用场景 |
|---------|------|---------|---------|
| `SSObj_PointCount` | 坐标点总数 | 整数 | 判断几何复杂度 |
| `SSObj_X(n)` | 第 n 个点的 X 坐标 | 浮点数 | 精确定位 |
| `SSObj_Y(n)` | 第 n 个点的 Y 坐标 | 浮点数 | 精确定位 |
| `SSObj_Z(n)` | 第 n 个点的 Z 坐标(高程) | 浮点数 | 三维分析 |
| `SSObj_PointName(n)` | 第 n 个点的名称 | 字符串 | 节点标识 |
| `SSObj_PointType(n)` | 第 n 个点的类型 | 整数 | 拓扑特征 |
坐标点属性的访问采用**参数化语法**:通过在属性名后添加括号和索引号来访问特定点,如 `SSObj_X(0)` 表示第一个点的 X 坐标。这种设计使得线对象和面对象的任意坐标点都可以精确访问,为精细化编辑和坐标分析提供了基础。
对于点对象Point坐标点属性直接访问其唯一坐标对于线对象Line和面对象Area则需要指定索引。`SSObj_PointType` 属性尤其重要,它表示坐标点的拓扑类型,如是否为圆弧点、是否为拟合点、是否为曲线控制点等,这些信息决定了对象的绘制方式和几何特性。
### 几何尺寸属性
几何尺寸属性量化了地物对象的空间范围和长度特征,是空间分析的基础数据。
```mermaid
flowchart LR
A[几何尺寸计算] --> B[对象类型判断]
B --> C[AREA]
B --> D[LINE]
B --> E[POINT]
C --> C1[Area<br/>多边形面积]
C --> C2[Length<br/>多边形周长]
D --> D1[Length<br/>线条长度]
D --> D2[3DLength<br/>三维线长度]
E --> E1[无几何尺寸<br/>点对象]
C1 --> F[空间分析应用]
C2 --> F
D1 --> F
D2 --> F
```
**SSObj_Area** 属性表示面对象的平面面积,单位通常为平方米。该属性通过几何算法实时计算,支持凸多边形、凹多边形、带洞多边形等各种复杂形状。面积的精确度取决于坐标系统的投影参数和计算方法,在高精度测量场景中需要特别注意。
**SSObj_Length****SSObj_3DLength** 分别表示对象的二维长度和三维长度。对于线对象Length 是投影到 XY 平面的长度3DLength 则考虑了高程变化是三维空间中的实际长度。对于面对象Length 表示其周长。这两个属性的区别在山区地形等高程变化显著的场景中尤为重要。
### 边界框属性
边界框Bounding Box是地物对象的最小外接矩形由四个属性描述`SSObj_minX``SSObj_minY``SSObj_maxX``SSObj_maxY`。边界框虽然丢失了对象的精确几何细节,但提供了极其高效的**空间过滤**能力。
在空间索引和查询优化中,边界框扮演着核心角色。系统可以先通过边界框快速排除不可能相交的对象,再对候选对象进行精确的几何相交测试。这种两阶段过滤策略大幅提升了空间查询性能,特别是在处理海量数据时效果显著。
### 几何变换属性
几何变换属性控制对象的平移、旋转和缩放,用于实现对象的动态调整和符号化表现。
**SSObj_Angle** 属性表示对象的旋转角度以度为单位逆时针为正方向。旋转中心通常为对象的几何中心或指定锚点。对于线对象和面对象Angle 属性影响其整体方向对于注记对象Angle 属性影响文本的旋转方向。在地图符号化中Angle 属性常用于符号的方向自适应,如道路注记沿线方向旋转。
**SSObj_ScaleX****SSObj_ScaleY** 属性分别控制对象在 X 和 Y 方向的缩放比例。这两个属性支持**非等比缩放**,可以实现拉伸、压缩等变形效果。**SSObj_ScaleXY** 则是等比缩放的便捷方式,同时设置 X 和 Y 方向的缩放系数。
缩放属性的一个重要应用场景是符号大小的自适应。在不同地图比例尺下,符号的视觉大小需要保持一致,这时可以通过 ScaleX 和 ScaleY 动态调整符号的显示比例。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L12-L23), [ObjBaseAttr.py](ObjBaseAttr.py#L300-L380)
## 外观属性详解
外观属性控制地物对象的视觉表现形式,是地图符号化的重要组成部分。理解这些属性的含义和取值范围,对于设计美观、专业的地图至关重要。
### 颜色属性SSObj_Color
`SSObj_Color` 属性控制对象的填充色或线条色,支持三种表示方式:
1. **颜色号方式**:直接使用系统预定义的颜色索引,如 `1` 表示红色、`2` 表示黄色。这种方式简单直观,但灵活性有限。
2. **RGB 方式**:使用 `RGB(R,G,B)` 语法指定红绿蓝三个分量,每个分量的取值范围为 0-255。例如 `RGB(255,0,0)` 表示纯红色。RGB 方式提供了完整的颜色空间表达能力,但需要手动计算颜色值。
3. **颜色值方式**:将 RGB 三个分量组合为一个 24 位整数值,计算公式为 `R × 65536 + G × 256 + B`。例如红色对应值 `16711680`。这种方式程序处理最方便,但人工难以理解和输入。
在实际开发中,推荐使用 `getColorValue()` 工具函数进行颜色值的统一解析和转换,该函数可以自动识别上述三种格式并返回统一的颜色值。
### 线型属性SSObj_LineType
`SSObj_LineType` 属性定义对象的线条样式如实线、虚线、点划线等。不同的线型通过不同的划线模式dash pattern实现系统预定义了一系列常用线型索引。
线型属性对面对象也同样有效,控制其边界线的绘制样式。在地质图、道路网等专业地图中,线型是表达对象性质的重要视觉线索,如实线表示主干道、虚线表示规划道路等。
线型的视觉效果还受线宽(`SSObj_LineWidth`)属性的影响。较粗的线条适合表达重要的地物,较细的线条用于表达次要地物或背景要素。线宽通常以屏幕像素为单位,需要根据地图比例尺动态调整以保持视觉一致性。
### 填充样式属性
**SSObj_HatchStyle** 属性控制对象的填充模式,包括纯色填充、图案填充、渐变填充等多种方式。不同的填充样式通过不同的索引值指定,系统内置了标准制图中常用的填充图案,如斜线、网格、点阵等。
**SSObj_HatchDensityScale** 属性调整填充图案的密度比例。增加该值会使图案更稀疏,减少该值则使图案更密集。这个属性为视觉表达提供了额外的灵活性,可以根据地图的负载和重点调整填充的视觉强度。
对于 L 型符号(如建筑符号),**SSObj_LShapeOffset** 属性控制符号的偏移距离,影响符号的相对位置和对齐方式。这个属性在精确制图中非常重要,可以微调符号的摆放位置以达到最佳视觉效果。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L52-L56), [ObjBaseAttr.py](ObjBaseAttr.py#L405-L420)
## 时间属性详解
时间属性记录地物对象的生命周期关键节点,包括创建时间和修改时间。这些属性对于数据审计、版本管理和变更追踪具有不可替代的作用。
### SSObj_CreateTime创建时间戳
`SSObj_CreateTime` 记录对象首次创建的时间,格式为 `YYYY-MM-DD HH:MM:SS`。这个属性在对象创建时由系统自动设置,之后不会自动更新,确保了创建时间的**永久性和不变性**。
创建时间是数据溯源的关键信息。在数据质量检查和争议处理中,通过创建时间可以确定对象的创建者、创建顺序和创建环境。对于历史数据分析,创建时间也是构建时间序列的基础数据。
### SSObj_ModifyTime修改时间戳
`SSObj_ModifyTime` 记录对象最后一次被修改的时间。与创建时间不同,修改时间会在对象属性或几何形状发生变化时自动更新,始终反映对象的**最新变更状态**。
修改时间的自动更新机制确保了时间戳的准确性,但也带来了性能考虑。在高频修改场景下,频繁的时间戳更新可能产生性能开销。系统通常通过延迟写入或批量更新的方式优化这一过程。
在实际应用中,修改时间常用于增量数据同步。通过比较修改时间,可以快速识别自上次同步以来发生变化的对象,只传输变更部分而非全部数据,大幅提升了数据同步效率。
时间属性还支持自定义解析和格式化。`ObjBaseAttr.getGeoValue()` 方法使用 `DateTime.parse()``DateTime.format()` 方法进行时间值的读写,确保了时间格式的一致性和可解析性。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L44-L46), [ObjBaseAttr.py](ObjBaseAttr.py#L230-L245)
## 注记属性详解
注记属性专用于控制文本标注的外观和内容是地图中信息传递的重要媒介。注记对象Note虽然在地物类型上独立于点、线、面但其属性体系同样丰富。
### 字体属性组
字体属性组控制文本的视觉表现,包括字体名称、字宽、字高、字重等多个维度。
| 属性名称 | 含义 | 数据类型 | 典型应用 |
|---------|------|---------|---------|
| `SSObj_FontName` | 字体名称 | 字符串 | "SimSun"、"Arial" |
| `SSObj_FontWidth` | 字宽 | 浮点数 | 100单位地图单位 |
| `SSObj_FontHeight` | 字高 | 浮点数 | 300单位地图单位 |
| `SSObj_FontWeight` | 字重(粗细) | 整数 | 400正常、700粗体 |
| `SSObj_FontItalicAngle` | 倾斜角度 | 浮点数 | 0正常、15倾斜 |
| `SSObj_FontUnderLine` | 下划线 | 整数 | 0、1 |
字宽和字高的相对比例决定了字体的形状。通常情况下,字高大于字宽,形成正常的矩形字体;若字宽大于字高,则形成横向拉伸的扁平字体。字宽和字高的绝对值则控制注记的总体大小,需要根据地图比例尺和注记重要性进行设计。
**SSObj_FontRealHeight****SSObj_FontRealLength** 是两个动态计算属性,分别表示注记在实际地图上的显示高度和长度。这两个属性考虑了地图比例尺的影响,提供了屏幕像素尺寸而非地图单位尺寸,适合用于注记碰撞检测和布局优化。
### 内容属性组
内容属性组定义了注记的文本内容及其元信息。
**SSObj_FontString** 是注记的核心内容属性,存储要显示的文本字符串。该属性支持多行文本和富文本格式,可以包含换行符、制表符等特殊字符。
**SSObj_FontStringCount** 是只读属性,返回注记文本的字符数量。该属性通过 `len(note.getStringText())` 实时计算,用于快速评估注记的文本长度,在自动注记布局中非常有用。
**SSObj_FontClass** 表示注记的分类号,通常对应业务标准中的注记类型。通过分类号可以批量管理同类注记的样式,实现统一的符号化控制。
### 布局属性组
布局属性组控制注记的位置、方向和对齐方式,影响注记的视觉平衡和可读性。
| 属性名称 | 含义 | 数据类型 | 取值说明 |
|---------|------|---------|---------|
| `SSObj_FontAlignment` | 对齐方式 | 整数 | 0左对齐、1居中、2右对齐 |
| `SSObj_FontPosType` | 位置类型 | 整数 | 相对于参考点的位置关系 |
| `SSObj_FontDirection` | 字方向 | 整数 | 横向、纵向等 |
| `SSObj_FontWordAngle` | 字角度 | 浮点数 | 单个字符的旋转角度 |
| `SSObj_FontStringAngle` | 串角度 | 浮点数 | 整个文本串的旋转角度 |
| `SSObj_FontInterval` | 字间隔 | 浮点数 | 字符之间的间距 |
| `SSObj_FontDownAngle` | 下沉角度 | 浮点数 | 文本的下沉效果 |
字角度和串角度的区别在于作用范围:字角度控制单个字符的旋转,适合用于特殊效果(如弧形文字);串角度控制整个文本串的统一旋转,适合用于沿线标注等场景。
对齐方式属性决定了文本相对于锚点的分布方式。左对齐时,文本的起始位置在锚点;居中对齐时,文本的中心在锚点;右对齐时,文本的结束位置在锚点。选择合适的对齐方式可以确保注记与被标注地物的视觉关联性。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L63-L84), [ObjBaseAttr.py](ObjBaseAttr.py#L150-L210), [ObjBaseAttr.py](ObjBaseAttr.py#L500-L580)
## 属性访问机制深入
理解地物属性的底层访问机制,有助于开发者编写高效的代码并进行性能优化。`ObjBaseAttr` 类通过索引化查找和参数解析实现了高效的属性访问。
### 属性名称注册与索引映射
`ObjBaseAttr` 类在初始化时会调用 `registerObjBaseAttrName()` 方法注册所有预定义属性。该方法执行以下操作:去除属性名的 `SSObj_` 前缀,转换为小写,按升序插入到 `valueNames` 列表中,并返回该属性在列表中的索引。
这种设计具有两个重要优点:**查找效率**从 O(n) 的线性搜索提升到 O(1) 的数组访问;**内存优化**避免了重复存储大量字符串属性名。
属性索引是全局唯一的常量,在对象生命周期内不会改变。因此,`ObjBaseAttr` 在构造函数中会将常用属性的索引缓存为实例变量,如 `self.code``self.color``self.area` 等,进一步减少了运行时的查找开销。
### 参数化属性解析
对于坐标点等需要参数的属性,系统使用 `get_value_index_param()` 方法进行解析。该方法支持 `SSObj_X(0)``SSObj_Y(pointIndex)` 等带参数的语法,能够提取属性索引和括号内的参数字符串。
参数解析的步骤如下:首先检查字段名是否以 `)` 结尾,如果是则提取括号内容作为参数;然后去除 `SSObj_` 前缀并转换为小写;最后在 `valueNames` 列表中查找属性名并返回索引。若属性名未找到或参数格式错误,则返回 -1 表示无效。
这种灵活的参数化语法使得单个属性名可以访问一组相关的数据,大大简化了 API 设计。例如,线对象可能有数百个坐标点,但只需要定义一个 `SSObj_X` 属性配合参数索引即可访问所有点的 X 坐标。
### 属性值获取流程
`getGeoValue()` 方法实现了属性值的统一获取接口,其内部逻辑体现了类型判断和适配器模式的应用。
方法首先调用 `get_value_index_param()` 获取属性索引和参数;然后根据索引匹配对应的属性类型,执行相应的取值操作。取值操作的实现方式因属性类型而异:简单属性(如 ID、Code直接调用对象的 getter 方法;复合属性(如坐标点)需要先解析参数再访问指定点;只读属性(如面积)通过几何计算实时生成;动态属性(如实际高度)结合地图比例尺进行转换。
对于注记对象,方法会先判断对象类型是否为 `e_Note_Obj`,如果是则调用 `castToMarkNote()` 进行类型转换,然后访问注记专用的字体属性。这种类型检查和转换确保了类型安全,避免了访问不存在属性引发的异常。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L90-L140), [ObjBaseAttr.py](ObjBaseAttr.py#L145-L290)
## 属性修改机制深入
属性修改涉及值设置、类型转换、批量操作等多个环节,理解这些机制有助于避免常见的陷阱和错误。
### 扩展属性的特殊处理
`setGeoValue()` 方法对扩展属性(以 `[` 开头的属性)采用特殊处理机制。扩展属性不存储在对象的基本属性中,而是存储在 `MemoData` 字段中作为键值对集合。
修改扩展属性时,系统会先调用 `getMemoData()` 获取当前对象的所有扩展属性,返回两个字符串数组:字段名数组和值数组。然后查找目标属性名在字段名数组中的索引,若存在则更新对应的值,若不存在则追加新的字段名和值对。
扩展属性支持批量设置,语法为 `[属性名1,属性名2]``值1,值2`。系统会先分割逗号分隔的属性名列表和值列表,然后逐个设置。这种批量设置机制减少了多次调用的开销,提高了性能。
设置完成后,系统调用 `setMemoData()` 将更新后的字段名和值数组写回对象,完成扩展属性的持久化。整个过程中,扩展属性的存储格式对开发者透明,简化了 API 使用。
### 基本属性的值转换
不同属性类型需要不同的值转换逻辑。`setGeoValue()` 方法内置了多种类型的转换处理:
**整数类型**:通过 `int(value)` 转换,适用于 ID、编码、颜色号、线型等属性。若字符串无法转换为整数系统会抛出异常。
**浮点数类型**:通过 `float(value)` 转换,适用于角度、缩放、坐标、面积等属性。支持科学计数法和小数点表示。
**字符串类型**:直接使用原始字符串值,适用于名称、别名、图层名等属性。系统会自动处理字符串长度限制和特殊字符转义。
**颜色类型**:调用 `getColorValue()` 工具函数进行统一解析支持颜色号、RGB 和颜色值三种格式。该函数的调用位置在 [ObjBaseAttr.py](ObjBaseAttr.py#L405)。
**时间类型**:通过 `DateTime.parse()` 方法解析时间字符串,支持多种时间格式。解析后的 DateTime 对象通过 `setDateTime(dateTime, 0)` 写入对象,参数 `0` 表示写入创建时间,`1` 表示写入修改时间。
### 批量操作与循环优化
`setGeoValue()` 方法支持批量设置多个对象的属性,通过循环遍历 `GeoBaseList` 实现批量操作。这种设计避免了外层循环调用,减少了方法调用的开销。
对于每个对象,系统会根据属性类型执行相应的设置操作。某些属性对所有对象类型都适用(如颜色、名称),而某些属性只对特定类型有效(如线型只对线对象和面对象有效)。系统会在设置操作中进行类型检查,确保只有支持该属性的对象才会被修改。
批量操作的一个重要优化是**提前退出**:若属性索引无效或参数格式错误,方法会立即返回,避免执行无意义的循环。这种设计在处理大规模数据集时能够显著节省时间。
### 只读属性保护
某些属性是只读的,不能通过 `setGeoValue()` 修改。典型的只读属性包括:`SSObj_ID`(对象 ID`SSObj_PointCount`(点数量)、`SSObj_Area`(面积)、`SSObj_Length`(长度)、`SSObj_FontStringCount`(注记字符数)等。
这些属性要么由系统自动管理(如 ID要么由几何计算生成如面积和长度人为修改会导致数据不一致。`setGeoValue()` 方法中对 `SSObj_ID` 的处理被明确注释掉并直接返回,防止了意外修改。
只读属性保护机制确保了数据的完整性和一致性。开发者需要通过改变对象的几何形状来间接更新面积和长度,而不是直接修改这些属性。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L305-L350), [ObjBaseAttr.py](ObjBaseAttr.py#L355-L500)
## 应用场景与最佳实践
深入理解地物基本属性后,开发者在实际项目中可以应用这些知识解决复杂的业务问题。以下是一些典型应用场景和最佳实践建议。
### 数据质量检查与验证
利用地物属性可以构建自动化的数据质量检查规则。例如,检查所有道路对象的 `SSObj_Length` 是否超过最小长度阈值,或检查所有建筑的 `SSObj_Area` 是否在合理范围内。通过遍历选择集并读取属性,可以快速识别异常数据。
```python
# 检查面积异常的建筑物
ssp.clearSelection()
ssp.setSelectCondition("SSObj_Code", "==", "330500") # 建筑物编码
ssp.selectFilter()
for i in range(ssp.getSelGeoCount()):
area = float(ssp.getSelGeoValue(i, "SSObj_Area"))
if area < 10 or area > 100000:
name = ssp.getSelGeoValue(i, "SSObj_Name")
print(f"警告:对象 {name} 的面积 {area} 可能异常")
```
### 批量属性更新
批量属性更新是地物属性管理的高频场景,如批量统一线宽、批量更新施工状态等。使用 `setSelGeoValue(-1, ...)` 语法可以一次性修改所有选择集对象的属性,大幅简化代码。
```python
# 批量更新道路线宽和颜色
ssp.clearSelection()
ssp.setSelectCondition("SSObj_Code", "==", "210100") # 道路编码
ssp.selectFilter()
ssp.setSelGeoValue(-1, "SSObj_LineWidth", "3")
ssp.setSelGeoValue(-1, "SSObj_Color", "255")
# 批量添加到保存列表
for i in range(ssp.getSelGeoCount()):
ssp.addSelGeoToSaveGeoList(i)
ssp.saveBufferObjToDatabase()
```
### 空间分析与统计
利用几何属性可以进行复杂的空间分析,如计算某一区域内的所有建筑的平均面积、统计道路的总长度等。这些分析为城市规划、资源评估等决策提供数据支持。
```python
# 统计某图层中建筑的平均面积
ssp.clearSelection()
ssp.setSelectCondition("SSObj_LayerName", "==", "建筑物")
ssp.selectFilter()
total_area = 0
count = ssp.getSelGeoCount()
for i in range(count):
area = float(ssp.getSelGeoValue(i, "SSObj_Area"))
total_area += area
avg_area = total_area / count if count > 0 else 0
print(f"建筑总数:{count},总面积:{total_area:.2f},平均面积:{avg_area:.2f}")
```
### 注记符号化与布局
注记属性的应用直接影响地图的可读性和美观性。通过调整字体、对齐、角度等属性,可以优化注记的布局效果,减少遮挡和重叠。
```python
# 优化道路注记的显示效果
ssp.clearSelection()
ssp.setSelectCondition("SSObj_Type", "==", "NOTE")
ssp.setSelectCondition("[注记分类]", "==", "道路")
ssp.selectFilter()
ssp.setSelNoteValue(-1, "SSObj_FontHeight", "200")
ssp.setSelNoteValue(-1, "SSObj_FontWeight", "400")
ssp.setSelNoteValue(-1, "SSObj_FontInterval", "1.2")
for i in range(ssp.getSelNoteCount()):
ssp.addSelNoteToSaveNoteList(i)
ssp.saveBufferNoteToDatabase()
```
### 最佳实践建议
1. **优先使用属性索引**:在循环中频繁访问同一属性时,可以先获取属性索引(如 `attr_id = ssp.objBaseAttr.code`),然后在循环中使用索引而非属性名字符串,提升性能。
2. **避免频繁修改只读属性**:某些属性如 ID、编码、图层名等修改后需要特殊的同步操作。在批量修改时应仔细评估这些属性的影响范围。
3. **合理使用批量操作**:批量设置属性比逐个设置更高效,但批量操作会影响所有选择集对象,需要确保选择集的准确性。
4. **时间格式统一**:在处理时间属性时,应使用标准的时间格式(`YYYY-MM-DD HH:MM:SS`),避免因格式不一致导致的解析错误。
5. **颜色值转换**:使用 `getColorValue()` 函数进行颜色值的统一解析,避免硬编码颜色值,提高代码的可维护性。
Sources: [ObjBaseAttr.py](ObjBaseAttr.py#L140-L145), [ObjBaseAttr.py](ObjBaseAttr.py#L230-L250)
## 总结
地物基本属性体系是 SunvStation 地理数据管理的基础,涵盖了从标识到几何、从外观到时间的全方位信息。通过 `ObjBaseAttr` 类的统一管理,这些属性形成了层次清晰、功能完整的架构。
理解属性体系的设计原理和实现机制,能够帮助开发者更高效地编写代码,避免常见的性能陷阱和逻辑错误。在实际应用中,应根据业务需求选择合适的属性类型和访问方式,充分利用批量操作和索引优化等技术手段。
下一页 [扩展属性与自定义属性](18-kuo-zhan-shu-xing-yu-zi-ding-yi-shu-xing) 将深入探讨扩展属性的管理机制和自定义属性的创建方法,为地物属性管理提供更灵活的解决方案。