本文档详细介绍如何在 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)**：掌握高效的数据持久化策略