本文档详细说明如何为新建的地理对象添加坐标点，这是地理对象编辑流程中的核心步骤。通过坐标点的添加，可以构建点、线、面等不同类型的几何对象，为后续的保存和数据库存储奠定基础。

## 方法概述

`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. **命名规范**: 为坐标点设置有意义的名称，便于后续的查询和管理。