Files
sunvpy-docs/docs/content/21-tian-jia-dui-xiang-zuo-biao-dian.md
2026-04-10 13:47:53 +08:00

239 lines
8.7 KiB
Markdown
Raw Permalink 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.
本文档详细说明如何为新建的地理对象添加坐标点,这是地理对象编辑流程中的核心步骤。通过坐标点的添加,可以构建点、线、面等不同类型的几何对象,为后续的保存和数据库存储奠定基础。
## 方法概述
`addNewObjPoint` 方法用于向当前新建的地理对象添加一个空间坐标点。该方法属于 `GeoEditMixin` 混合类,通过 `SSProcessManager` 实例调用。它支持三维坐标输入,并可设置点的类型和名称属性。
**方法签名**:
```python
addNewObjPoint(x: float, y: float, z: float, type: int, name: str) -> bool
```
**参数说明**:
| 参数名 | 类型 | 说明 |
|--------|------|------|
| x | float | 点的 X 坐标值 |
| y | float | 点的 Y 坐标值 |
| z | float | 点的 Z 坐标值(高程) |
| type | int | 点的类型,使用 PointInfoEnum 点信息枚举的二进制位存储 |
| name | str | 点的名称标识 |
**返回值**:
- `True`: 添加成功
- `False`: 添加失败(通常是因为当前没有新建对象)
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L434)
## 工作流程
添加坐标点的操作必须建立在已创建地理对象的基础上。完整的工作流程包括对象创建、坐标点添加、对象保存等步骤。
```mermaid
flowchart TD
A[开始] --> B[创建地理对象<br/>createNewObjByCode]
B --> C[是否创建成功?]
C -->|否| D[返回错误]
C -->|是| E[添加第一个坐标点<br/>addNewObjPoint]
E --> F[需要添加更多点?]
F -->|是| G[添加后续坐标点<br/>addNewObjPoint]
G --> F
F -->|否| H[添加到选择集<br/>addNewObjToSelObjList]
H --> I[添加到保存列表<br/>addNewObjToSaveObjList]
I --> J[保存到数据库<br/>saveBufferObjToDatabase]
J --> K[结束]
```
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L464)
## 使用场景
根据几何对象类型的不同,添加坐标点的行为有所差异:
| 对象类型 | 所需点数 | 点的顺序要求 | 典型应用 |
|----------|---------|-------------|---------|
| 点对象 | 1个 | 无 | 地标点、测量控制点 |
| 线对象 | ≥2个 | 需按路径顺序 | 道路中心线、管线 |
| 面对象 | ≥3个 | 按顺时针或逆时针闭合 | 建筑物轮廓、地块边界 |
| 注记对象 | 1个定位点 | 无 | 文字标注位置 |
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L35-L51)
## 代码示例
### 示例 1: 创建点对象并添加坐标
```python
# 创建点对象(代码 1001 表示某种特定类型的点)
obj, geo = SSProcess.createNewObjByCode(1001)
if obj and geo:
# 添加唯一坐标点
success = SSProcess.addNewObjPoint(
x=123456.789,
y=3456789.012,
z=45.5,
type=ATTR_NORMAL_POINT,
name="控制点P1"
)
if success:
# 添加到选择集和保存列表
SSProcess.addNewObjToSelObjList()
SSProcess.addNewObjToSaveObjList()
SSProcess.saveBufferObjToDatabase()
```
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L434)
### 示例 2: 创建线对象并添加多个坐标点
```python
# 创建线对象(代码 2001 表示道路中心线)
obj, geo = SSProcess.createNewObjByCode(2001)
if obj and geo:
# 添加路径上的坐标点
points = [
(123456.789, 3456789.012, 45.5, "起点"),
(123460.789, 3456793.012, 45.3, "中间点1"),
(123470.789, 3456803.012, 45.1, "中间点2"),
(123480.789, 3456813.012, 45.0, "终点")
]
for x, y, z, name in points:
SSProcess.addNewObjPoint(x, y, z, ATTR_NORMAL_LINE, name)
# 保存对象
SSProcess.addNewObjToSelObjList()
SSProcess.addNewObjToSaveObjList()
SSProcess.saveBufferObjToDatabase()
```
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L434)
### 示例 3: 创建面对象并形成闭合多边形
```python
# 创建面对象(代码 3001 表示建筑物)
obj, geo = SSProcess.createNewObjByCode(3001)
if obj and geo:
# 按顺时针顺序添加顶点形成闭合多边形
corners = [
(123456.789, 3456789.012, 45.5, "西北角"),
(123466.789, 3456789.012, 45.5, "东北角"),
(123466.789, 3456799.012, 45.5, "东南角"),
(123456.789, 3456799.012, 45.5, "西南角")
]
for x, y, z, name in corners:
SSProcess.addNewObjPoint(x, y, z, ATTR_NORMAL_POLY, name)
# 保存对象
SSProcess.addNewObjToSelObjList()
SSProcess.addNewObjToSaveObjList()
SSProcess.saveBufferObjToDatabase()
```
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L434)
## 点类型枚举
`type` 参数使用二进制位存储的点信息枚举值,常用的枚举常量包括:
| 枚举常量 | 值 | 说明 |
|---------|---|------|
| ATTR_NORMAL_POINT | 普通点类型 | 一般点对象 |
| ATTR_CTR_POINT | 控制点类型 | 测量控制点 |
| ATTR_LAND_HEIGHT | 陆地高程点 | 高程注记点 |
| ATTR_WATER_HEIGHT | 水位高程点 | 水位注记点 |
| ATTR_FORMULA_HEIGHT | 计算高程点 | 通过计算得到的高程点 |
| ATTR_NAME_POINT | 名称点 | 地名标识点 |
| ATTR_NORMAL_LINE | 普通线型 | 一般线段 |
| ATTR_PHYSI_LINE | 自然界线 | 自然地理界线 |
| ATTR_EQUAL_VALUE_LINE | 等值线 | 等高线、等深线 |
| ATTR_NORMAL_POLY | 普通面 | 一般多边形 |
| ATTR_AUTO_POLY | 自动生成面 | 程序自动生成的面 |
Sources: [PySSMath.py](PySSMath.py#L630-L660)
## 注意事项
### 前置条件检查
在调用 `addNewObjPoint` 之前,必须确保已经成功创建了地理对象:
```python
# 检查当前新建对象是否存在
if SSProcess.curNewObj[0] is not None and SSProcess.curNewObj[1] is not None:
# 可以安全添加坐标点
success = SSProcess.addNewObjPoint(x, y, z, type, name)
else:
print("错误:请先创建地理对象!")
```
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L424)
### 坐标系统
- 坐标值应与当前地图的坐标系统一致
- X 和 Y 坐标通常表示平面位置
- Z 坐标表示高程,对于二维数据可设置为 0 或默认值
### 对象类型适配
添加坐标点的数量和顺序必须与对象类型匹配:
- **点对象**:只添加一个点
- **线对象**:至少添加两个点,按路径顺序
- **面对象**:至少添加三个点,形成闭合多边形
- **注记对象**:只添加一个定位点
### 保存机制
添加的坐标点暂存在内存中,必须通过以下步骤才能持久化到数据库:
```python
# 1. 添加到脚本选择集(可选,用于后续查询)
SSProcess.addNewObjToSelObjList()
# 2. 添加到保存列表(必需)
SSProcess.addNewObjToSaveObjList()
# 3. 批量保存到数据库(必需)
SSProcess.saveBufferObjToDatabase()
```
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L436-L464)
## 错误处理
常见错误及处理方法:
| 错误现象 | 可能原因 | 解决方法 |
|---------|---------|---------|
| 返回 False | 当前没有新建对象 | 先调用 `createNewObjByCode` 创建对象 |
| 对象不显示 | 未保存到数据库 | 调用 `saveBufferObjToDatabase` 保存 |
| 点顺序错误 | 线或面对象点序混乱 | 按正确的路径顺序添加点 |
| 坐标超出范围 | 坐标值不在地图范围内 | 检查并修正坐标值 |
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L424)
## 相关功能
添加坐标点操作与以下功能紧密相关:
- **[通过编码创建对象](20-tong-guo-bian-ma-chuang-jian-dui-xiang)**: 创建地理对象的前提步骤
- **[对象缓存机制](23-dui-xiang-huan-cun-ji-zhi)**: 了解坐标点的缓存和保存机制
- **[批量保存到数据库](24-pi-liang-bao-cun-dao-shu-ju-ku)**: 将坐标点持久化的详细说明
- **[删除对象操作](22-shan-chu-dui-xiang-cao-zuo)**: 对象管理的补充操作
Sources: [ssprocess_mixins/geo_edit_mixin.py](ssprocess_mixins/geo_edit_mixin.py#L417-L530)
## 最佳实践
1. **批量操作**: 对于需要创建大量对象的场景,建议先创建所有对象并添加坐标点,最后统一调用 `saveBufferObjToDatabase` 批量保存,以提高性能。
2. **坐标精度**: 根据地图比例尺和测量精度要求,设置适当的坐标精度。建议使用浮点数保持高精度。
3. **点序管理**: 对于线、面对象,建议在添加点之前规划好点的顺序,避免交叉或自相交。
4. **错误检查**: 在每次添加坐标点后检查返回值,及时发现并处理错误。
5. **命名规范**: 为坐标点设置有意义的名称,便于后续的查询和管理。