273 lines
6.4 KiB
Markdown
273 lines
6.4 KiB
Markdown
# 获取建筑围栏坐标指南
|
||
|
||
## 方法概览
|
||
|
||
| 方法 | 准确度 | 难度 | 推荐度 |
|
||
|------|--------|------|--------|
|
||
| 腾讯地图坐标拾取器 | ⭐⭐⭐⭐⭐ | 简单 | ⭐⭐⭐⭐⭐ |
|
||
| 卫星图手动标注 | ⭐⭐⭐⭐ | 简单 | ⭐⭐⭐⭐ |
|
||
| 建筑平面图转换 | ⭐⭐⭐⭐⭐ | 中等 | ⭐⭐⭐⭐ |
|
||
| 估算矩形围栏 | ⭐⭐ | 简单 | ⭐⭐ |
|
||
|
||
---
|
||
|
||
## 方法 1:腾讯地图坐标拾取器(推荐)
|
||
|
||
### 步骤
|
||
|
||
1. **打开坐标拾取器**
|
||
- 访问:https://lbs.qq.com/getPoint/
|
||
- 或使用:https://lbs.qq.com/tool/getpoint/
|
||
|
||
2. **定位到博物馆**
|
||
- 搜索框输入:深圳自然博物馆
|
||
- 或直接输入坐标:22.692763, 114.363487
|
||
|
||
3. **切换卫星图**
|
||
- 点击右上角地图类型切换按钮
|
||
- 选择"卫星图"模式
|
||
- 放大到最大级别(可以看清建筑轮廓)
|
||
|
||
4. **标注建筑角点**
|
||
- 沿着建筑外围,从西北角开始
|
||
- 顺时针或逆时针依次点击每个角点
|
||
- 记录每个点的坐标(纬度, 经度)
|
||
|
||
5. **复制坐标**
|
||
- 将所有角点坐标记录下来
|
||
- 按顺序排列(形成闭合多边形)
|
||
|
||
### 示例
|
||
|
||
假设标注了6个角点:
|
||
|
||
```javascript
|
||
const polygons = ref([
|
||
{
|
||
points: [
|
||
{ latitude: 22.693100, longitude: 114.363100 }, // 西北角
|
||
{ latitude: 22.693100, longitude: 114.363500 }, // 北侧转角
|
||
{ latitude: 22.693100, longitude: 114.363900 }, // 东北角
|
||
{ latitude: 22.692400, longitude: 114.363900 }, // 东南角
|
||
{ latitude: 22.692400, longitude: 114.363500 }, // 南侧转角
|
||
{ latitude: 22.692400, longitude: 114.363100 }, // 西南角
|
||
],
|
||
strokeWidth: 3,
|
||
strokeColor: '#E0E100',
|
||
fillColor: '#E0E10020',
|
||
zIndex: 1
|
||
}
|
||
])
|
||
```
|
||
|
||
---
|
||
|
||
## 方法 2:使用 Google Earth / 百度地图
|
||
|
||
### Google Earth Pro(桌面版)
|
||
|
||
1. 下载安装 Google Earth Pro
|
||
2. 搜索"深圳自然博物馆"
|
||
3. 使用"添加多边形"工具
|
||
4. 沿建筑外围绘制多边形
|
||
5. 右键 → 属性 → 查看坐标
|
||
6. 导出为 KML 文件,提取坐标
|
||
|
||
### 百度地图拾取坐标
|
||
|
||
1. 访问:https://api.map.baidu.com/lbsapi/getpoint/
|
||
2. 搜索定位到博物馆
|
||
3. 切换卫星图
|
||
4. 依次点击建筑角点
|
||
5. **注意**:百度地图使用 BD-09 坐标系,需要转换为 GCJ-02
|
||
|
||
---
|
||
|
||
## 方法 3:使用 API 脚本获取
|
||
|
||
### 运行脚本
|
||
|
||
```bash
|
||
cd museum-guide-v4.0
|
||
node scripts/get-building-polygon.js
|
||
```
|
||
|
||
### 脚本功能
|
||
|
||
1. 调用腾讯地图 WebService API
|
||
2. 搜索博物馆 POI 信息
|
||
3. 尝试获取建筑轮廓数据
|
||
4. 如果没有轮廓数据,计算估算的矩形围栏
|
||
|
||
### 调整建筑尺寸
|
||
|
||
如果使用估算方法,需要知道建筑的实际尺寸:
|
||
|
||
```javascript
|
||
// 修改脚本中的参数
|
||
calculateRectangle(
|
||
22.692763, // 中心纬度
|
||
114.363487, // 中心经度
|
||
150, // 宽度(米)- 根据实际调整
|
||
100 // 高度(米)- 根据实际调整
|
||
)
|
||
```
|
||
|
||
---
|
||
|
||
## 方法 4:从建筑平面图转换
|
||
|
||
如果有建筑平面图或 CAD 图纸:
|
||
|
||
### 步骤
|
||
|
||
1. **确定参考点**
|
||
- 在平面图上标注一个已知坐标的点(如主入口)
|
||
- 确定平面图的方向(正北方向)
|
||
|
||
2. **测量相对位置**
|
||
- 测量每个角点相对于参考点的距离和方向
|
||
- 单位:米
|
||
|
||
3. **计算坐标**
|
||
```javascript
|
||
// 纬度1度 ≈ 111km
|
||
// 经度1度 ≈ 111km × cos(纬度)
|
||
|
||
const latPerMeter = 1 / 111000
|
||
const lngPerMeter = 1 / (111000 * Math.cos(22.692763 * Math.PI / 180))
|
||
|
||
// 从参考点向北50米,向东30米
|
||
const newLat = refLat + 50 * latPerMeter
|
||
const newLng = refLng + 30 * lngPerMeter
|
||
```
|
||
|
||
4. **验证坐标**
|
||
- 在地图上标注计算出的坐标
|
||
- 对比卫星图验证准确性
|
||
|
||
---
|
||
|
||
## 方法 5:实地测量(最准确)
|
||
|
||
使用 GPS 设备或手机 APP:
|
||
|
||
### 推荐 APP
|
||
|
||
- **奥维互动地图**(支持多种坐标系)
|
||
- **两步路户外助手**
|
||
- **GPS Test**(Android)
|
||
|
||
### 步骤
|
||
|
||
1. 到博物馆现场
|
||
2. 打开 GPS APP
|
||
3. 走到建筑每个角点
|
||
4. 记录 GPS 坐标
|
||
5. 确保使用 GCJ-02 坐标系(火星坐标)
|
||
|
||
---
|
||
|
||
## 坐标系转换
|
||
|
||
### 常见坐标系
|
||
|
||
- **WGS-84**:GPS 原始坐标,国际标准
|
||
- **GCJ-02**:火星坐标,中国加密坐标(腾讯地图使用)
|
||
- **BD-09**:百度坐标,百度地图专用
|
||
|
||
### 转换工具
|
||
|
||
- 在线转换:https://tool.lu/coordinate/
|
||
- npm 包:`coordtransform`
|
||
|
||
```bash
|
||
npm install coordtransform
|
||
```
|
||
|
||
```javascript
|
||
const coordtransform = require('coordtransform')
|
||
|
||
// WGS-84 转 GCJ-02
|
||
const [lng, lat] = coordtransform.wgs84togcj02(114.363487, 22.692763)
|
||
|
||
// BD-09 转 GCJ-02
|
||
const [lng2, lat2] = coordtransform.bd09togcj02(114.369487, 22.698763)
|
||
```
|
||
|
||
---
|
||
|
||
## 验证围栏准确性
|
||
|
||
### 在地图上检查
|
||
|
||
1. 将坐标添加到 `TencentMap.vue`
|
||
2. 运行项目查看地图
|
||
3. 对比卫星图底图
|
||
4. 调整不准确的点
|
||
|
||
### 计算围栏面积
|
||
|
||
```javascript
|
||
// 使用 Shoelace 公式计算多边形面积
|
||
function calculateArea(points) {
|
||
let area = 0
|
||
for (let i = 0; i < points.length; i++) {
|
||
const j = (i + 1) % points.length
|
||
area += points[i].longitude * points[j].latitude
|
||
area -= points[j].longitude * points[i].latitude
|
||
}
|
||
area = Math.abs(area) / 2
|
||
|
||
// 转换为平方米(近似)
|
||
const latPerMeter = 1 / 111000
|
||
const lngPerMeter = 1 / (111000 * Math.cos(points[0].latitude * Math.PI / 180))
|
||
const areaInSquareMeters = area / (latPerMeter * lngPerMeter)
|
||
|
||
return areaInSquareMeters
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 常见问题
|
||
|
||
### Q: 为什么我的围栏位置偏移?
|
||
|
||
A: 可能的原因:
|
||
1. 坐标系不匹配(检查是否为 GCJ-02)
|
||
2. 纬度经度顺序错误(应为 latitude, longitude)
|
||
3. 地图缩放级别太低,看不清细节
|
||
|
||
### Q: 如何绘制不规则建筑?
|
||
|
||
A: 增加更多角点,多边形支持任意数量的点:
|
||
|
||
```javascript
|
||
points: [
|
||
{ latitude: 22.693100, longitude: 114.363100 },
|
||
{ latitude: 22.693100, longitude: 114.363300 },
|
||
{ latitude: 22.693050, longitude: 114.363500 }, // 斜角
|
||
{ latitude: 22.692900, longitude: 114.363700 }, // 弧形可用多个点近似
|
||
// ... 更多点
|
||
]
|
||
```
|
||
|
||
### Q: 围栏太大或太小?
|
||
|
||
A: 检查坐标单位:
|
||
- 纬度/经度差 0.0001 ≈ 11米/9米
|
||
- 纬度/经度差 0.001 ≈ 110米/90米
|
||
|
||
---
|
||
|
||
## 推荐流程
|
||
|
||
1. ✅ **使用腾讯地图坐标拾取器**手动标注(5-10分钟)
|
||
2. ✅ 将坐标复制到代码中
|
||
3. ✅ 运行项目验证
|
||
4. ✅ 微调不准确的点
|
||
5. ✅ 完成!
|
||
|
||
这是最快速、最准确的方法。
|