# Transbigdata Coordinates

> 使用 TransBigData 进行坐标系转换和距离计算。适用于 WGS84、GCJ02、BD09 坐标系互转，以及两点间距离计算。

- Skill: `ni1o1/transbigdata-coordinates` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ni1o1/transbigdata-coordinates`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ni1o1/transbigdata-coordinates/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ni1o1 (https://skillmd.com/u/ni1o1)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/ni1o1/transbigdata-coordinates

---


# TransBigData 坐标转换指南

## 安装

```bash
pip install transbigdata
```

## 中国常用坐标系说明

| 坐标系 | 说明 | 常见来源 |
|--------|------|----------|
| **WGS84** | GPS原始坐标，国际标准 | GPS设备、OpenStreetMap |
| **GCJ02** | 国测局坐标（火星坐标） | 高德地图、腾讯地图 |
| **BD09** | 百度坐标 | 百度地图 |
| **BD09MC** | 百度墨卡托坐标 | 百度地图API |

## 坐标转换函数

### WGS84 转换

```python
import transbigdata as tbd

# WGS84 → GCJ02
data['Lng_gcj'], data['Lat_gcj'] = tbd.wgs84togcj02(data['Lng'], data['Lat'])

# WGS84 → BD09
data['Lng_bd'], data['Lat_bd'] = tbd.wgs84tobd09(data['Lng'], data['Lat'])
```

### GCJ02 转换

```python
# GCJ02 → WGS84
data['Lng_wgs'], data['Lat_wgs'] = tbd.gcj02towgs84(data['Lng'], data['Lat'])

# GCJ02 → BD09
data['Lng_bd'], data['Lat_bd'] = tbd.gcj02tobd09(data['Lng'], data['Lat'])
```

### BD09 转换

```python
# BD09 → WGS84
data['Lng_wgs'], data['Lat_wgs'] = tbd.bd09towgs84(data['Lng'], data['Lat'])

# BD09 → GCJ02
data['Lng_gcj'], data['Lat_gcj'] = tbd.bd09togcj02(data['Lng'], data['Lat'])

# BD09MC → BD09
data['Lng_bd'], data['Lat_bd'] = tbd.bd09mctobd09(data['x'], data['y'])
```

## GeoDataFrame 坐标转换

### `transform_shape()` - 批量转换几何对象

```python
import geopandas as gpd

# 加载 GCJ02 坐标的数据
gdf = gpd.read_file('data_gcj02.shp')

# 转换为 WGS84
gdf_wgs84 = tbd.transform_shape(gdf, method=tbd.gcj02towgs84)
```

## 距离计算

### `getdistance()` - 两点间距离

计算 WGS84 坐标系下两点间的球面距离。

```python
# 单点距离
distance = tbd.getdistance(lon1, lat1, lon2, lat2)  # 返回米

# 向量化计算
data['distance'] = tbd.getdistance(
    data['slon'], data['slat'],
    data['elon'], data['elat']
)
```

## 完整示例

### 示例 1：高德数据转 WGS84

```python
import pandas as pd
import transbigdata as tbd

# 加载高德地图采集的数据（GCJ02坐标）
data = pd.read_csv('amap_data.csv')

# 转换为 WGS84
data['Lng_wgs'], data['Lat_wgs'] = tbd.gcj02towgs84(data['Lng'], data['Lat'])

# 保存
data.to_csv('data_wgs84.csv', index=False)
```

### 示例 2：百度数据转 WGS84

```python
import pandas as pd
import transbigdata as tbd

# 加载百度地图数据（BD09坐标）
data = pd.read_csv('baidu_data.csv')

# 转换为 WGS84
data['Lng_wgs'], data['Lat_wgs'] = tbd.bd09towgs84(data['Lng'], data['Lat'])
```

### 示例 3：计算 OD 距离

```python
import pandas as pd
import transbigdata as tbd

# OD 数据
od_data = pd.DataFrame({
    'slon': [114.0, 114.1],
    'slat': [22.5, 22.6],
    'elon': [114.2, 114.3],
    'elat': [22.7, 22.8]
})

# 计算直线距离
od_data['distance_m'] = tbd.getdistance(
    od_data['slon'], od_data['slat'],
    od_data['elon'], od_data['elat']
)
od_data['distance_km'] = od_data['distance_m'] / 1000

print(od_data)
```

### 示例 4：转换 Shapefile

```python
import geopandas as gpd
import transbigdata as tbd

# 加载 GCJ02 坐标的行政区划
districts = gpd.read_file('districts_gcj02.shp')

# 转换为 WGS84
districts_wgs84 = tbd.transform_shape(districts, method=tbd.gcj02towgs84)

# 保存
districts_wgs84.to_file('districts_wgs84.shp')
```

## 坐标系识别技巧

不确定数据坐标系时，可以：

1. 将点叠加到不同底图上查看偏移
2. 与已知坐标系的边界数据对比
3. 查询数据来源的文档说明

**常见偏移特征**:
- WGS84 在国内地图上会偏移 100-700 米
- BD09 相对 GCJ02 还会有额外偏移

## 参考文档

完整文档: https://transbigdata.readthedocs.io/en/latest/CoordinatesConverter.html

