百度地图、高德地图、google地图等坐标系相关梳理

yizhihongxing

以下是详细讲解“百度地图、高德地图、Google地图等坐标系相关梳理的完整攻略”:

百度地图、高德地图、Google地图等坐标系相关梳理

在使用地图相关的应用程序时,经常需要涉及到坐标系的转换。不同的地图服务提供商使用不同的坐标系,因此需要进行坐标系的转换。本攻略将介绍百度地图、高德地图、Google地图等常用地图服务提供的坐标系,并提供坐标系转换的示例。

坐标概述

坐标系是用于描述地球表面位置的一种数学模型。常用的坐标系包括经纬度坐标系和平面坐标系。经纬度坐标系是用经度和纬度来描述地球表面位置的坐标系,常用于全球范围内的位置描述。平面坐标系是用平面坐标来描述地球表面位置的坐标系,常用于局部范围内的位置描述。

百度地图坐标系

百地图使用的是BD-09坐标系,也称为百度坐标系。BD-09坐标系是在GCJ-02坐标系的基础上进行了加密和偏移处理得到的。因此,如果需要将其他坐标系的坐标转换为百度坐标系,需要先将其转换为GCJ-02坐标系,然后再进行加密和偏移处理。

高德地图坐标系

高德地图使用的是GCJ-02坐标系,也称为火星坐标系。GCJ-02坐标系是在WGS-84坐标系的基础上进行了加密和偏移处理得到的。因此,如果需要将其他坐标系的坐标转换为高德坐标系,需要先将其转换为WGS-84坐标系,然后再进行加密和偏移处理。

Google地图坐标系

Google地图使用的是WGS-84坐标系,也称为全球卫星定位系统坐标系。WGS-84坐标系是一种全球通用的坐标系,常用于全球范围内的位置描述。

坐标系转换示例

下面是将经纬度坐标转换为百度坐标系和高德坐标系的示例:

将纬度坐标转换为百度坐标系

from math import pi, cos, sin, sqrt, atan2

def bd_encrypt(lng, lat):
    x_pi = pi * 3000.0 / 180.0
    x = lng
    y = lat
    z = sqrt(x * x + y * y) + 0.00002 * sin(y x_pi)
    theta = atan2(y, x) + 0.000003 * cos(x * x_pi)
    bd_lng = z * cos(theta) + 0.0065
    bd_lat = z * sin(theta) + 0.006
    return bd_lng, bd_lat

将经纬度标转换为高德坐标系

from math import pi, cos, sin, sqrt, atan2

def gcj_encrypt(lng, lat):
    x_pi = pi * 3000.0 / 180.0
    a = 6378245.0
    ee = 0.00669342162296594323
    d_lat = transform_lat(lng - 105.0, lat - 35.0)
    d_lng = transform_lng(lng - 105.0, lat - 35.0)
    rad = lat / 180.0 * pi
    magic = sin(rad_lat)
    magic = 1 - ee * magic * magic
    sqrt_magic = sqrt(magic)
    d_lat = (d_lat * 180.0) / ((a * (1 - ee)) / (magic * sqrt_magic) * pi)
    d_lng = (d_lng * 180.0) / (a / sqrt_magic * cos(rad_lat) * pi)
    mg_lat = lat + d_lat
    mg_lng = lng + d_lng
    return mg_lng, mg_lat

def transform_lat(lng, lat):
    x_pi = pi * 3000.0 / 180.0
    a = 6378245.0
    ee = 0.00669342162296594323
    d_lat = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * sqrt(abs(lng))
    d_lat += (20.0 * sin(6.0 * lng * pi) + 20.0 * sin(2.0 * lng * pi)) * 2.0 / 3.0
    d_lat += (20.0 * sin(lat * pi) + 40.0 * sin(lat / 3.0 * pi)) * 2.0 / 3.0
    d_lat += (160.0 * sin(lat / 12.0 * pi) + 320 * sin(lat * pi / 30.0)) * 2.0 / 3.0
    return d_lat

def transform_lng(lng, lat):
    x_pi = pi * 3000.0 / 180.0
    a = 6378245.0
    ee = 0.00669342162296594323    d_lng = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * sqrt(abs(lng))
    d_lng += (20.0 * sin(6.0 * lng * pi) + 20.0 sin(2.0 * lng * pi)) * 2.0 / 3.0
    d_lng += (20.0 * sin(lng * pi) + 40.0 * sin(lng / 3.0 * pi)) * .0 / 3.0
    d_lng += (150.0 * sin(lng / 12.0 * pi) + 300.0 * sin(lng / 30.0 * pi)) * 2.0 / 3.0
    return d_lng

示例一:将百度坐标系转换为WGS-84坐标系

from math import pi, cos, sin, sqrt, atan2

def bd_decrypt(bd_lng, bd_lat):
    x_pi = pi * 3000.0 / 180.0
    x = bd_lng - 0.0065
    y = bd_lat - 0.006
    z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi)
    theta = atan2(y, x) - 0.000003 * cos(x * x_pi)
    lng = z * cos(theta)
    lat = z * sin(theta)
    return lng, lat

示例二:将高德坐标系转换为WGS-84坐标系

from math import pi, cos, sin, sqrt, atan2

def gcj_decrypt(gcj_lng, gcj_lat):
    x_pi = pi * 3000.0 / 180.0
    a = 6378245.0
    ee = 0.00669342162296594323
    d_lat = transform_lat(gcj_lng - 105.0, gcj_lat - 35.0)
    d_lng = transform_lng(gcj_lng - 105.0, gcj_lat - 35.0)
    rad_lat = gcj_lat / 180.0 * pi
    magic = sin(rad_lat)
    magic = 1 - ee * magic * magic
    sqrt_magic = sqrt(magic)
    d_lat = (d_lat * 180.0) / ((a * (1 - ee)) / (magic * sqrt_magic) * pi)
    d_lng = (d_lng * 180.0) / (a / sqrt_magic * cos(rad_lat) * pi)
    mg_lat = gcj_lat + d_lat
    mg_lng = gcj_lng + d_lng
    return mg_lng, mg_lat

总结

以上是百度地图、高德地图、Google地图等常用地图服务提商的坐标系相关梳理,以及坐标系转换的示例。在使用地图相关的应用程序时,需要根据具体的求选择合适的坐标系,并进行坐标系的转换。同时,需要注意坐标系转换的精度和稳定性,以确保转换的准确无误。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:百度地图、高德地图、google地图等坐标系相关梳理 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • windows 8 开发之开发平台与开发框架的应用

    Windows 8 开发平台及开发框架 开发平台 在 Windows 8 中,可以使用 Visual Studio 2012 或者更高版本的 Visual Studio 进行开发。同时, Windows 8 还提供了很多 windows 应用程序设计接口 (API) 来支持开发者编写 Windows 应用程序。 Visual Studio 2012 及以上版…

    other 2023年6月26日
    00
  • VS2019属性配置详解

    VS2019属性配置详解 Visual Studio是开发者常用的集成开发环境,而在Visual Studio中,属性配置是一个非常重要的内容。本文将详细讲解Visual Studio 2019中属性配置的相关内容。 什么是属性配置? 属性配置是Visual Studio中用于配置项目属性的窗口,通过修改属性配置,我们可以对项目进行特定的设置,例如: 编译选…

    other 2023年6月26日
    00
  • pycharm打开命令行或Terminal的方法

    打开命令行或Terminal通常是程序员日常开发中必须要掌握的技能之一,下面我将介绍如何在PyCharm中打开命令行或Terminal。 PyCharm打开命令行 打开PyCharm,选择需要运行Python文件的项目。 在PyCharm窗口的底部工具栏中找到“Terminal”按钮,点击它。 会弹出一个命令行窗口,此时可以在其中输入需要执行的命令。 示例:…

    other 2023年6月26日
    00
  • 在python中解决死锁的问题

    在Python中解决死锁的问题需要使用线程同步机制,如Lock、RLock、Semaphore等,这些锁可以帮助我们管理并发访问共享资源的问题。下面是解决死锁的完整攻略,包括两个示例说明: 步骤1:理解死锁 死锁指的是两个或多个线程互相等待对方释放资源,从而导致程序无法继续执行的一种情况。这种情况在多线程编程中经常出现,因此需要采取措施来预防和解决。 步骤2…

    other 2023年6月27日
    00
  • 迅雷9.1.23正式版(9.1.23.556)发布 附下载地址

    迅雷9.1.23正式版(9.1.23.556)发布 附下载地址攻略 迅雷是一款常用的下载工具,最新版本为9.1.23正式版(9.1.23.556)。本攻略将详细介绍如何下载和安装迅雷9.1.23正式版,并提供下载地址。 下载迅雷9.1.23正式版 你可以通过以下步骤下载迅雷9.1.23正式版: 打开你的浏览器,访问迅雷官方网站。 在官方网站的首页或下载页面上…

    other 2023年8月4日
    00
  • Java数组的特性_动力节点Java学院整理

    Java数组的特性-动力节点Java学院整理 什么是Java数组? Java数组是一种容器,可以存储多个相同类型的元素。 数组在内存中是连续的,由于其特殊的数据结构,它们可以在O(1)时间内访问特定元素。 如何声明和初始化Java数组? 声明一个数组的语法: dataType[] arrayName; 初始化一个数组的语法: dataType[] array…

    other 2023年6月25日
    00
  • Android调用微信登陆、分享、支付

    Android调用微信登陆、分享、支付的完整攻略 1. 集成微信SDK 首先,需要在Android项目中集成微信SDK。可以从微信开放平台官网下载最新的SDK,并将其添加到项目的依赖中。 2. 微信登陆 要实现微信登陆功能,需要进行以下步骤: 在微信开放平台注册应用,并获取到AppID。 在AndroidManifest.xml文件中添加微信登陆的相关配置,…

    other 2023年10月13日
    00
  • 游戏内存如何炼成的 厂商工程师手记曝光

    游戏内存如何炼成的 厂商工程师手记曝光 简介 在这篇攻略中,我们将详细讲解游戏内存的制造过程。这些信息来自一位厂商工程师的手记,揭示了游戏内存的制造过程和一些关键细节。我们将介绍游戏内存的基本原理、制造流程以及两个示例说明。 游戏内存基本原理 游戏内存是计算机系统中的一种关键组件,用于存储正在运行的游戏程序和相关数据。它是一种易失性存储器,意味着在断电或重启…

    other 2023年8月1日
    00
合作推广
合作推广
分享本页
返回顶部