Files
frontend-miniapp/docs/GET_BUILDING_POLYGON.md

6.4 KiB
Raw Blame History

获取建筑围栏坐标指南

方法概览

方法 准确度 难度 推荐度
腾讯地图坐标拾取器 简单
卫星图手动标注 简单
建筑平面图转换 中等
估算矩形围栏 简单

方法 1腾讯地图坐标拾取器推荐

步骤

  1. 打开坐标拾取器

  2. 定位到博物馆

    • 搜索框输入:深圳自然博物馆
    • 或直接输入坐标22.692763, 114.363487
  3. 切换卫星图

    • 点击右上角地图类型切换按钮
    • 选择"卫星图"模式
    • 放大到最大级别(可以看清建筑轮廓)
  4. 标注建筑角点

    • 沿着建筑外围,从西北角开始
    • 顺时针或逆时针依次点击每个角点
    • 记录每个点的坐标(纬度, 经度)
  5. 复制坐标

    • 将所有角点坐标记录下来
    • 按顺序排列(形成闭合多边形)

示例

假设标注了6个角点

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 脚本获取

运行脚本

cd museum-guide-v4.0
node scripts/get-building-polygon.js

脚本功能

  1. 调用腾讯地图 WebService API
  2. 搜索博物馆 POI 信息
  3. 尝试获取建筑轮廓数据
  4. 如果没有轮廓数据,计算估算的矩形围栏

调整建筑尺寸

如果使用估算方法,需要知道建筑的实际尺寸:

// 修改脚本中的参数
calculateRectangle(
  22.692763,  // 中心纬度
  114.363487, // 中心经度
  150,        // 宽度(米)- 根据实际调整
  100         // 高度(米)- 根据实际调整
)

方法 4从建筑平面图转换

如果有建筑平面图或 CAD 图纸:

步骤

  1. 确定参考点

    • 在平面图上标注一个已知坐标的点(如主入口)
    • 确定平面图的方向(正北方向)
  2. 测量相对位置

    • 测量每个角点相对于参考点的距离和方向
    • 单位:米
  3. 计算坐标

    // 纬度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 TestAndroid

步骤

  1. 到博物馆现场
  2. 打开 GPS APP
  3. 走到建筑每个角点
  4. 记录 GPS 坐标
  5. 确保使用 GCJ-02 坐标系(火星坐标)

坐标系转换

常见坐标系

  • WGS-84GPS 原始坐标,国际标准
  • GCJ-02:火星坐标,中国加密坐标(腾讯地图使用)
  • BD-09:百度坐标,百度地图专用

转换工具

npm install coordtransform
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. 调整不准确的点

计算围栏面积

// 使用 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: 增加更多角点,多边形支持任意数量的点:

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. 完成!

这是最快速、最准确的方法。