zoukankan      html  css  js  c++  java
  • 小程序地图指定经纬度有偏移的问题

    小程序读取照片 EXIF 元信息

    为了更直观地查看照片的 GPS 位置,加了个 map 标签,传入 EXIF 中的经纬度。

    结果偏成这个样子:

    还以为腾讯地图有毛病,然后掏出 Google 一番云雨之后,发现原来是因为不同的地图用的坐标系不一样,苹果地图用的坐标系是 WGS84,腾讯地图用的 GCJ02。
    所以才有这个偏移。

    找到问题了,那就转换呗:

    // https://gist.github.com/jp1017/71bd0976287ce163c11a7cb963b04dd8
    // const x_pi = 3.14159265358979324 * 3000.0 / 180.0
    // π
    const pi = 3.1415926535897932384626
    // 长半轴
    const a = 6378245.0
    // 扁率
    const ee = 0.00669342162296594323
    const transformlat = (lng, lat) => {
      let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng))
      ret += (20.0 * Math.sin(6.0 * lng * pi) + 20.0 * Math.sin(2.0 * lng * pi)) * 2.0 / 3.0
      ret += (20.0 * Math.sin(lat * pi) + 40.0 * Math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
      ret += (160.0 * Math.sin(lat / 12.0 * pi) + 320 * Math.sin(lat * pi / 30.0)) * 2.0 / 3.0
      return ret
    }
    const transformlng = (lng, lat) => {
      let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng))
      ret += (20.0 * Math.sin(6.0 * lng * pi) + 20.0 * Math.sin(2.0 * lng * pi)) * 2.0 / 3.0
      ret += (20.0 * Math.sin(lng * pi) + 40.0 * Math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
      ret += (150.0 * Math.sin(lng / 12.0 * pi) + 300.0 * Math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
      return ret
    }
    // 地图坐标系转换 苹果/高德是 wgs84 坐标系,腾讯是 gcj02 坐标系
    const wgs84togcj02 = (lng, lat) => {
      let dlat = transformlat(lng - 105.0, lat - 35.0)
      let dlng = transformlng(lng - 105.0, lat - 35.0)
      let radlat = lat / 180.0 * pi
      let magic = Math.sin(radlat)
      magic = 1 - ee * magic * magic
      let sqrtmagic = Math.sqrt(magic)
      dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
      dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * pi)
      const mglat = lat + dlat
      const mglng = lng + dlng
      return { mglng, mglat }
    }
    
    const gcj02towgs84 = (lng, lat) => {
      let dlat = transformlat(lng - 105.0, lat - 35.0)
      let dlng = transformlng(lng - 105.0, lat - 35.0)
      let radlat = lat / 180.0 * pi
      let magic = Math.sin(radlat)
      magic = 1 - ee * magic * magic
      let sqrtmagic = Math.sqrt(magic)
      dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
      dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * pi)
      let mglat = lat - dlat
      let mglng = lng - dlng
      return { mglng, mglat }
    }
    

    最终效果,iPhone 扫一下这个码看看:

    Android相机用的啥坐标系,又是另一个话题了

    A Short Guide To The Chinese Coordinate System

  • 相关阅读:
    Codeforces 1105
    Codeforces 1138
    Codeforces 1111
    【Linux远程连接工具】Xshell、Xftp家庭/学生版(免费使用)
    使用ssh localhost命令,发生异常ssh: connect to host localhost port 22: Connection refused
    【终端使用】拷贝和移动文件
    【终端使用】文件、目录的创建和删除
    【终端使用】切换目录
    【终端使用】"ls"命令,查看目录内容
    【终端使用】终端命令的格式
  • 原文地址:https://www.cnblogs.com/hangj/p/11913976.html
Copyright © 2011-2022 走看看