384 lines
14 KiB
Markdown
384 lines
14 KiB
Markdown
|
|
本文档详细介绍如何在 SunvStation 系统中创建默认地物对象。地物对象是地理信息系统中的核心数据单元,包括点、线、面和注记四种基本类型。创建默认地物对象是进行地理数据编辑和管理的第一步,为后续的属性设置、坐标添加和数据持久化奠定基础。
|
|||
|
|
|
|||
|
|
建议在学习本页面之前,先了解 [SSProcess 基础概念](4-shi-yong-ssprocess-guan-li-xuan-ze-ji) 和 [地物基本属性](17-di-wu-ji-ben-shu-xing-xiang-jie)。完成本页面学习后,可以继续学习 [通过编码创建对象](20-tong-guo-bian-ma-chuang-jian-dui-xiang) 和 [添加对象坐标点](21-tian-jia-dui-xiang-zuo-biao-dian)。
|
|||
|
|
|
|||
|
|
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L1-L60)
|
|||
|
|
|
|||
|
|
## 地物对象类型概述
|
|||
|
|
|
|||
|
|
SunvStation 系统支持四种基本的地物对象类型,每种类型对应不同的几何形态和应用场景。理解这些类型的差异是正确使用创建方法的前提。
|
|||
|
|
|
|||
|
|
| 对象类型 | 类型标识 | 几何类 | 典型应用场景 |
|
|||
|
|
|---------|---------|--------|------------|
|
|||
|
|
| 点对象 | 0 | PointObject | 控制点、界碑、建筑物中心点 |
|
|||
|
|
| 线对象 | 1 | LineObject | 道路、管线、河流中心线 |
|
|||
|
|
| 面对象 | 2 | AreaObject | 建筑物轮廓、湖泊、行政区划 |
|
|||
|
|
| 注记对象 | 3 | MarkNote | 文字标注、地名说明 |
|
|||
|
|
|
|||
|
|
地物对象由两个核心组件构成:`GeoObject` 容器对象和具体的几何对象(`PointObject`、`LineObject`、`AreaObject`、`MarkNote`)。`GeoObject` 负责管理对象的数据集关联和唯一标识,而几何对象负责存储具体的几何数据和图形属性。
|
|||
|
|
|
|||
|
|
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L93-L120)
|
|||
|
|
|
|||
|
|
## createDefaultGeoBase 方法详解
|
|||
|
|
|
|||
|
|
`createDefaultGeoBase` 是创建默认地物对象的核心方法,属于 `GeoEditMixin` 混入类。该方法接受对象类型和数据集两个参数,返回包含 `GeoObject` 和几何对象的元组。
|
|||
|
|
|
|||
|
|
### 方法签名
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
def createDefaultGeoBase(self, obj_type: int, dataset) -> tuple:
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 参数说明
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 必需 | 说明 |
|
|||
|
|
|--------|------|------|------|
|
|||
|
|
| obj_type | int | 是 | 地物对象类型(0-点,1-线,2-面,3-注记) |
|
|||
|
|
| dataset | Dataset | 是 | 目标数据集实例,用于存储对象 |
|
|||
|
|
|
|||
|
|
### 返回值
|
|||
|
|
|
|||
|
|
返回一个包含两个元素的元组:
|
|||
|
|
- 第一个元素:`GeoObject` 实例,作为地物对象的容器
|
|||
|
|
- 第二个元素:具体的几何对象实例(`PointObject`/`LineObject`/`AreaObject`/`MarkNote`)
|
|||
|
|
|
|||
|
|
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L93-L120)
|
|||
|
|
|
|||
|
|
## 创建地物对象的工作流程
|
|||
|
|
|
|||
|
|
创建默认地物对象涉及多个步骤,从获取数据集到最终保存到数据库。理解完整的流程有助于正确地组织代码和处理异常情况。
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
flowchart TD
|
|||
|
|
A[开始] --> B[获取当前数据源EPS]
|
|||
|
|
B --> C{EPS是否有效?}
|
|||
|
|
C -->|否| D[记录错误并返回]
|
|||
|
|
C -->|是| E[获取目标数据集]
|
|||
|
|
E --> F{数据集是否有效?}
|
|||
|
|
F -->|否| G[记录错误并返回]
|
|||
|
|
F -->|是| H[调用createDefaultGeoBase]
|
|||
|
|
H --> I[创建GeoObject容器]
|
|||
|
|
I --> J{对象类型?}
|
|||
|
|
J -->|0| K[创建PointObject]
|
|||
|
|
J -->|1| L[创建LineObject]
|
|||
|
|
J -->|2| M[创建AreaObject]
|
|||
|
|
J -->|3| N[创建MarkNote]
|
|||
|
|
K --> O[设置几何对象]
|
|||
|
|
L --> O
|
|||
|
|
M --> O
|
|||
|
|
N --> O
|
|||
|
|
O --> P[返回对象元组]
|
|||
|
|
P --> Q[设置对象属性]
|
|||
|
|
Q --> R[添加坐标点]
|
|||
|
|
R --> S[添加到保存列表]
|
|||
|
|
S --> T[保存到数据库]
|
|||
|
|
T --> U[结束]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L140-L250)
|
|||
|
|
|
|||
|
|
## 基础创建示例
|
|||
|
|
|
|||
|
|
以下示例展示了如何使用 `createDefaultGeoBase` 方法创建不同类型的默认地物对象。
|
|||
|
|
|
|||
|
|
### 创建点对象
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 获取当前地图的数据源
|
|||
|
|
ds_eps = SSProcess.map.getCurrentDataSourceEPS()
|
|||
|
|
if ds_eps is None:
|
|||
|
|
print("无法获取数据源")
|
|||
|
|
exit()
|
|||
|
|
|
|||
|
|
# 获取点图层对应的数据集(假设代码为100)
|
|||
|
|
fea = ds_eps.getFeature(100)
|
|||
|
|
dataset = getDatasetByFeaCode(ds_eps, fea)
|
|||
|
|
|
|||
|
|
# 创建默认点对象
|
|||
|
|
obj, geo = SSProcess.createDefaultGeoBase(0, dataset)
|
|||
|
|
if obj is not None and geo is not None:
|
|||
|
|
print(f"成功创建点对象,ID: {geo.getId()}")
|
|||
|
|
print(f"对象类型: {geo.getObjectType()}") # 输出: 0
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 创建线对象
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 创建默认线对象
|
|||
|
|
obj, geo = SSProcess.createDefaultGeoBase(1, dataset)
|
|||
|
|
if geo is not None and geo.getObjectType() == 1:
|
|||
|
|
print("成功创建线对象")
|
|||
|
|
# 设置线对象的基本属性
|
|||
|
|
geo.setLineColor(0xFF0000) # 红色
|
|||
|
|
geo.setLineWidth(2)
|
|||
|
|
geo.setLineType(1) # 实线
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 创建面对象
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 创建默认面对象
|
|||
|
|
obj, geo = SSProcess.createDefaultGeoBase(2, dataset)
|
|||
|
|
if geo is not None and geo.getObjectType() == 2:
|
|||
|
|
print("成功创建面对象")
|
|||
|
|
# 设置面对象的基本属性
|
|||
|
|
geo.setColor(0x00FF00) # 绿色
|
|||
|
|
geo.setLineWidth(1)
|
|||
|
|
geo.setFillColor(0x00FF00) # 填充色
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 创建注记对象
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 创建默认注记对象
|
|||
|
|
obj, geo = SSProcess.createDefaultGeoBase(3, dataset)
|
|||
|
|
if geo is not None and geo.getObjectType() == 3:
|
|||
|
|
print("成功创建注记对象")
|
|||
|
|
note = castToMarkNote(geo)
|
|||
|
|
if note is not None:
|
|||
|
|
note.setNote("示例注记")
|
|||
|
|
note.setFontHeight(100) # 字体高度
|
|||
|
|
note.setAlignment(1) # 居中对齐
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L93-L120)
|
|||
|
|
|
|||
|
|
## 完整创建流程示例
|
|||
|
|
|
|||
|
|
以下示例展示了从对象创建到保存到数据库的完整流程,包括属性设置、坐标点添加和数据持久化。
|
|||
|
|
|
|||
|
|
### 创建并保存点对象
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 1. 创建点对象
|
|||
|
|
ds_eps = SSProcess.map.getCurrentDataSourceEPS()
|
|||
|
|
fea = ds_eps.getFeature(100) # 获取点地物编码
|
|||
|
|
dataset = getDatasetByFeaCode(ds_eps, fea)
|
|||
|
|
obj, geo = SSProcess.createDefaultGeoBase(0, dataset)
|
|||
|
|
|
|||
|
|
# 2. 设置点对象属性
|
|||
|
|
geo.setCode(100)
|
|||
|
|
geo.setColor(0xFF0000)
|
|||
|
|
geo.setObjName("控制点A")
|
|||
|
|
|
|||
|
|
# 3. 添加坐标点(点对象至少需要一个点)
|
|||
|
|
SSProcess.addNewObjPoint(100.0, 200.0, 0.0, 0, "PT1")
|
|||
|
|
|
|||
|
|
# 4. 添加到保存列表
|
|||
|
|
SSProcess.addNewObjToSaveObjList()
|
|||
|
|
|
|||
|
|
# 5. 保存到数据库
|
|||
|
|
SSProcess.saveBufferObjToDatabase()
|
|||
|
|
print("点对象已成功保存到数据库")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 创建并保存线对象
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 1. 创建线对象
|
|||
|
|
ds_eps = SSProcess.map.getCurrentDataSourceEPS()
|
|||
|
|
fea = ds_eps.getFeature(200) # 获取线地物编码
|
|||
|
|
dataset = getDatasetByFeaCode(ds_eps, fea)
|
|||
|
|
obj, geo = SSProcess.createDefaultGeoBase(1, dataset)
|
|||
|
|
|
|||
|
|
# 2. 设置线对象属性
|
|||
|
|
geo.setCode(200)
|
|||
|
|
geo.setColor(0x0000FF)
|
|||
|
|
geo.setLineWidth(3)
|
|||
|
|
geo.setLineType(1)
|
|||
|
|
|
|||
|
|
# 3. 添加多个坐标点构成线段
|
|||
|
|
SSProcess.addNewObjPoint(100.0, 100.0, 0.0, 0, "起点")
|
|||
|
|
SSProcess.addNewObjPoint(200.0, 150.0, 0.0, 0, "中间点1")
|
|||
|
|
SSProcess.addNewObjPoint(300.0, 200.0, 0.0, 0, "终点")
|
|||
|
|
|
|||
|
|
# 4. 添加到保存列表并保存
|
|||
|
|
SSProcess.addNewObjToSaveObjList()
|
|||
|
|
SSProcess.saveBufferObjToDatabase()
|
|||
|
|
print("线对象已成功保存到数据库")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L450-L520)
|
|||
|
|
|
|||
|
|
## 错误处理与验证
|
|||
|
|
|
|||
|
|
在创建地物对象时,需要进行适当的错误处理以确保程序的健壮性。
|
|||
|
|
|
|||
|
|
### 常见错误及处理方式
|
|||
|
|
|
|||
|
|
| 错误场景 | 错误表现 | 处理方式 |
|
|||
|
|
|---------|---------|---------|
|
|||
|
|
| 数据源为空 | `ds_eps is None` | 检查数据源是否正确加载 |
|
|||
|
|
| 数据集无效 | `dataset is None` | 验证地物编码是否存在 |
|
|||
|
|
| 对象类型错误 | `geo is None` | 确保类型参数在 0-3 范围内 |
|
|||
|
|
| 属性设置失败 | 返回值 `False` | 检查属性值格式是否正确 |
|
|||
|
|
|
|||
|
|
### 错误处理示例
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
def createPointSafely(code: int, x: float, y: float, z: float):
|
|||
|
|
"""安全创建点对象,包含完整错误处理"""
|
|||
|
|
try:
|
|||
|
|
# 1. 验证数据源
|
|||
|
|
ds_eps = SSProcess.map.getCurrentDataSourceEPS()
|
|||
|
|
if ds_eps is None:
|
|||
|
|
SSProcess.log_error_msg("无法获取当前数据源")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
# 2. 验证地物编码
|
|||
|
|
fea = ds_eps.getFeature(code)
|
|||
|
|
if fea is None:
|
|||
|
|
SSProcess.log_error_msg(f"地物编码 {code} 不存在")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
# 3. 获取数据集
|
|||
|
|
dataset = getDatasetByFeaCode(ds_eps, fea)
|
|||
|
|
if dataset is None:
|
|||
|
|
SSProcess.log_error_msg(f"无法获取编码 {code} 对应的数据集")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
# 4. 创建对象
|
|||
|
|
obj, geo = SSProcess.createDefaultGeoBase(fea.nObjectType, dataset)
|
|||
|
|
if obj is None or geo is None:
|
|||
|
|
SSProcess.log_error_msg("创建地物对象失败")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
# 5. 设置属性和坐标
|
|||
|
|
geo.setCode(code)
|
|||
|
|
geo.setColor(fea.uLineColor)
|
|||
|
|
if not SSProcess.addNewObjPoint(x, y, z, 0, "PT"):
|
|||
|
|
SSProcess.log_error_msg("添加坐标点失败")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
# 6. 保存对象
|
|||
|
|
SSProcess.addNewObjToSaveObjList()
|
|||
|
|
SSProcess.saveBufferObjToDatabase()
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
SSProcess.log_error_msg(f"创建点对象时发生异常: {str(e)}")
|
|||
|
|
return False
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L140-L250)
|
|||
|
|
|
|||
|
|
## 与其他创建方法的对比
|
|||
|
|
|
|||
|
|
`createDefaultGeoBase` 是创建地物对象的基础方法,系统还提供了其他便捷方法用于特定场景。
|
|||
|
|
|
|||
|
|
| 方法 | 适用场景 | 特点 | 相比createDefaultGeoBase的优势 |
|
|||
|
|
|------|---------|------|---------------------------|
|
|||
|
|
| createDefaultGeoBase | 需要精确控制类型和属性 | 最底层,最灵活 | 无,是其他方法的基础 |
|
|||
|
|
| createNewObjByCode | 已知地物编码 | 自动从编码获取属性和类型 | 自动设置编码、颜色、线型等 |
|
|||
|
|
| createNewObjByClass | 创建注记对象 | 基于注记类模板创建 | 自动加载注记模板属性 |
|
|||
|
|
|
|||
|
|
### 使用场景对比示例
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 方式1:使用 createDefaultGeoBase(需要手动设置所有属性)
|
|||
|
|
obj, geo = SSProcess.createDefaultGeoBase(0, dataset)
|
|||
|
|
geo.setCode(100)
|
|||
|
|
geo.setColor(0xFF0000)
|
|||
|
|
geo.setLineWidth(2)
|
|||
|
|
|
|||
|
|
# 方式2:使用 createNewObjByCode(自动从编码获取属性)
|
|||
|
|
obj, geo = SSProcess.createNewObjByCode(100) # 自动设置颜色、线型等
|
|||
|
|
# 内部调用 createDefaultGeoBase,但额外设置了从编码获取的属性
|
|||
|
|
|
|||
|
|
# 方式3:使用 createNewObjByClass(专用于注记)
|
|||
|
|
obj, geo = SSProcess.createNewObjByClass("注记类A") # 自动加载注记模板
|
|||
|
|
# 内部调用 createDefaultGeoBase(3, dataset),并应用模板属性
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L200-L280)
|
|||
|
|
|
|||
|
|
## 属性设置与扩展
|
|||
|
|
|
|||
|
|
创建地物对象后,需要设置各种属性以满足业务需求。属性分为基本属性和扩展属性两类。
|
|||
|
|
|
|||
|
|
### 基本属性设置
|
|||
|
|
|
|||
|
|
基本属性是系统预定义的标准属性,直接通过几何对象的 setter 方法设置。
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 设置基本属性示例
|
|||
|
|
geo.setCode(100) # 设置地物编码
|
|||
|
|
geo.setColor(0xFF0000) # 设置颜色(红色)
|
|||
|
|
geo.setLineWidth(2) # 设置线宽
|
|||
|
|
geo.setLineType(1) # 设置线型(实线)
|
|||
|
|
geo.setFillColor(0x00FF00) # 设置填充色
|
|||
|
|
geo.setObjName("示例对象") # 设置对象名称
|
|||
|
|
geo.setGroupId(1) # 设置分组ID
|
|||
|
|
geo.setObjStatus(1) # 设置对象状态
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 扩展属性设置
|
|||
|
|
|
|||
|
|
扩展属性是自定义的属性字段,存储在对象的备忘数据中。
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 设置单个扩展属性
|
|||
|
|
SSProcess.setNewObjValue("[自定义属性A]", "属性值")
|
|||
|
|
|
|||
|
|
# 设置多个扩展属性(逗号分隔)
|
|||
|
|
SSProcess.setNewObjValue("[属性1],[属性2],[属性3]", "值1,值2,值3")
|
|||
|
|
|
|||
|
|
# 基本属性使用 SSObj_ 前缀
|
|||
|
|
SSProcess.setNewObjValue("SSObj_Code", "100")
|
|||
|
|
SSProcess.setNewObjValue("SSObj_Color", "0xFF0000")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L280-L380)
|
|||
|
|
|
|||
|
|
## 批量创建与性能优化
|
|||
|
|
|
|||
|
|
当需要创建大量地物对象时,合理的批量处理策略可以显著提高性能。
|
|||
|
|
|
|||
|
|
### 批量创建流程
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
def批量创建点对象(点坐标列表: list, 代码: int):
|
|||
|
|
"""批量创建点对象并一次性保存"""
|
|||
|
|
ds_eps = SSProcess.map.getCurrentDataSourceEPS()
|
|||
|
|
fea = ds_eps.getFeature(代码)
|
|||
|
|
dataset = getDatasetByFeaCode(ds_eps, fea)
|
|||
|
|
|
|||
|
|
for i, (x, y, z) in enumerate(点坐标列表):
|
|||
|
|
# 1. 创建对象
|
|||
|
|
obj, geo = SSProcess.createDefaultGeoBase(0, dataset)
|
|||
|
|
|
|||
|
|
# 2. 设置属性
|
|||
|
|
geo.setCode(代码)
|
|||
|
|
geo.setColor(fea.uLineColor)
|
|||
|
|
geo.setObjName(f"点{i+1}")
|
|||
|
|
|
|||
|
|
# 3. 添加坐标
|
|||
|
|
SSProcess.addNewObjPoint(x, y, z, 0, f"PT{i+1}")
|
|||
|
|
|
|||
|
|
# 4. 添加到保存列表(不立即保存)
|
|||
|
|
SSProcess.addNewObjToSaveObjList()
|
|||
|
|
|
|||
|
|
# 5. 批量保存到数据库(一次性提交)
|
|||
|
|
SSProcess.saveBufferObjToDatabase()
|
|||
|
|
print(f"成功保存 {len(点坐标列表)} 个点对象")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 性能优化建议
|
|||
|
|
|
|||
|
|
| 优化措施 | 说明 | 预期效果 |
|
|||
|
|
|---------|------|---------|
|
|||
|
|
| 批量保存 | 累积对象后一次性保存 | 减少数据库事务次数 |
|
|||
|
|
| 延迟属性设置 | 在创建后统一设置属性 | 避免重复的对象遍历 |
|
|||
|
|
| 使用缓存 | 利用对象缓存机制 | 减少内存分配开销 |
|
|||
|
|
| 进度显示 | 对大批量操作显示进度 | 提升用户体验 |
|
|||
|
|
|
|||
|
|
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L520-L580)
|
|||
|
|
|
|||
|
|
## 下一步学习
|
|||
|
|
|
|||
|
|
完成默认地物对象的创建后,建议继续学习以下内容:
|
|||
|
|
|
|||
|
|
1. **[通过编码创建对象](20-tong-guo-bian-ma-chuang-jian-dui-xiang)**:学习如何根据地物编码自动创建对象并应用编码预设的属性
|
|||
|
|
2. **[添加对象坐标点](21-tian-jia-dui-xiang-zuo-biao-dian)**:深入了解如何为不同类型的对象添加坐标点
|
|||
|
|
3. **[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)**:理解系统如何通过缓存机制提升创建和保存效率
|
|||
|
|
4. **[批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)**:掌握高效的数据持久化策略
|