Python实现常见的4种坐标互相转换

目录
  • 一、简介
  • 二、代码及说明

一、简介

主流被使用的地理坐标系并不统一,常用的有WGS84、GCJ02(火星坐标系)、BD09(百度坐标系)以及百度地图中保存矢量信息的web墨卡托,本文利用Python编写相关类以实现4种坐标系统之间的互相转换。

二、代码及说明

import math

class LngLatTransfer():

    def __init__(self):
        self.x_pi = 3.14159265358979324 * 3000.0 / 180.0
        self.pi = math.pi  # π
        self.a = 6378245.0  # 长半轴
        self.es = 0.00669342162296594323  # 偏心率平方
        pass

    def GCJ02_to_BD09(self, gcj_lng, gcj_lat):
        """
        实现GCJ02向BD09坐标系的转换
        :param lng: GCJ02坐标系下的经度
        :param lat: GCJ02坐标系下的纬度
        :return: 转换后的BD09下经纬度
        """
        z = math.sqrt(gcj_lng * gcj_lng + gcj_lat * gcj_lat) + 0.00002 * math.sin(gcj_lat * self.x_pi)
        theta = math.atan2(gcj_lat, gcj_lng) + 0.000003 * math.cos(gcj_lng * self.x_pi)
        bd_lng = z * math.cos(theta) + 0.0065
        bd_lat = z * math.sin(theta) + 0.006
        return bd_lng, bd_lat

    def BD09_to_GCJ02(self, bd_lng, bd_lat):
        '''
        实现BD09坐标系向GCJ02坐标系的转换
        :param bd_lng: BD09坐标系下的经度
        :param bd_lat: BD09坐标系下的纬度
        :return: 转换后的GCJ02下经纬度
        '''
        x = bd_lng - 0.0065
        y = bd_lat - 0.006
        z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * self.x_pi)
        theta = math.atan2(y, x) - 0.000003 * math.cos(x * self.x_pi)
        gcj_lng = z * math.cos(theta)
        gcj_lat = z * math.sin(theta)
        return gcj_lng, gcj_lat

    def WGS84_to_GCJ02(self, lng, lat):
        '''
        实现WGS84坐标系向GCJ02坐标系的转换
        :param lng: WGS84坐标系下的经度
        :param lat: WGS84坐标系下的纬度
        :return: 转换后的GCJ02下经纬度
        '''
        dlat = self._transformlat(lng - 105.0, lat - 35.0)
        dlng = self._transformlng(lng - 105.0, lat - 35.0)
        radlat = lat / 180.0 * self.pi
        magic = math.sin(radlat)
        magic = 1 - self.es * magic * magic
        sqrtmagic = math.sqrt(magic)
        dlat = (dlat * 180.0) / ((self.a * (1 - self.es)) / (magic * sqrtmagic) * self.pi)
        dlng = (dlng * 180.0) / (self.a / sqrtmagic * math.cos(radlat) * self.pi)
        gcj_lng = lat + dlat
        gcj_lat = lng + dlng
        return gcj_lng, gcj_lat

    def GCJ02_to_WGS84(self, gcj_lng, gcj_lat):
        '''
        实现GCJ02坐标系向WGS84坐标系的转换
        :param gcj_lng: GCJ02坐标系下的经度
        :param gcj_lat: GCJ02坐标系下的纬度
        :return: 转换后的WGS84下经纬度
        '''
        dlat = self._transformlat(gcj_lng - 105.0, gcj_lat - 35.0)
        dlng = self._transformlng(gcj_lng - 105.0, gcj_lat - 35.0)
        radlat = gcj_lat / 180.0 * self.pi
        magic = math.sin(radlat)
        magic = 1 - self.es * magic * magic
        sqrtmagic = math.sqrt(magic)
        dlat = (dlat * 180.0) / ((self.a * (1 - self.es)) / (magic * sqrtmagic) * self.pi)
        dlng = (dlng * 180.0) / (self.a / sqrtmagic * math.cos(radlat) * self.pi)
        mglat = gcj_lat + dlat
        mglng = gcj_lng + dlng
        lng = gcj_lng * 2 - mglng
        lat = gcj_lat * 2 - mglat
        return lng, lat

    def BD09_to_WGS84(self, bd_lng, bd_lat):
        '''
        实现BD09坐标系向WGS84坐标系的转换
        :param bd_lng: BD09坐标系下的经度
        :param bd_lat: BD09坐标系下的纬度
        :return: 转换后的WGS84下经纬度
        '''
        lng, lat = self.BD09_to_GCJ02(bd_lng, bd_lat)
        return self.GCJ02_to_WGS84(lng, lat)

    def WGS84_to_BD09(self, lng, lat):
        '''
        实现WGS84坐标系向BD09坐标系的转换
        :param lng: WGS84坐标系下的经度
        :param lat: WGS84坐标系下的纬度
        :return: 转换后的BD09下经纬度
        '''
        lng, lat = self.WGS84_to_GCJ02(lng, lat)
        return self.GCJ02_to_BD09(lng, lat)

    def _transformlat(self, lng, lat):
        ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \
              0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
        ret += (20.0 * math.sin(6.0 * lng * self.pi) + 20.0 *
                math.sin(2.0 * lng * self.pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lat * self.pi) + 40.0 *
                math.sin(lat / 3.0 * self.pi)) * 2.0 / 3.0
        ret += (160.0 * math.sin(lat / 12.0 * self.pi) + 320 *
                math.sin(lat * self.pi / 30.0)) * 2.0 / 3.0
        return ret

    def _transformlng(self, lng, lat):
        ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
              0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
        ret += (20.0 * math.sin(6.0 * lng * self.pi) + 20.0 *
                math.sin(2.0 * lng * self.pi)) * 2.0 / 3.0
        ret += (20.0 * math.sin(lng * self.pi) + 40.0 *
                math.sin(lng / 3.0 * self.pi)) * 2.0 / 3.0
        ret += (150.0 * math.sin(lng / 12.0 * self.pi) + 300.0 *
                math.sin(lng / 30.0 * self.pi)) * 2.0 / 3.0
        return ret

    def WGS84_to_WebMercator(self, lng, lat):
        '''
        实现WGS84向web墨卡托的转换
        :param lng: WGS84经度
        :param lat: WGS84纬度
        :return: 转换后的web墨卡托坐标
        '''
        x = lng * 20037508.342789 / 180
        y = math.log(math.tan((90 + lat) * self.pi / 360)) / (self.pi / 180)
        y = y * 20037508.34789 / 180
        return x, y

    def WebMercator_to_WGS84(self, x, y):
        '''
        实现web墨卡托向WGS84的转换
        :param x: web墨卡托x坐标
        :param y: web墨卡托y坐标
        :return: 转换后的WGS84经纬度
        '''
        lng = x / 20037508.34 * 180
        lat = y / 20037508.34 * 180
        lat = 180 / self.pi * (2 * math.atan(math.exp(lat * self.pi / 180)) - self.pi / 2)
        return lng, lat

整个模块的使用方式可用下面的导图概括,其中每个函数都只需要传入经纬度坐标信息:

到此这篇关于Python实现常见的4种坐标互相转换的文章就介绍到这了,更多相关Python坐标转换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python经纬度坐标转换为距离及角度的实现

    最近项目上有这样的需求,需要依据设备的经纬度坐标计算距离及角度.经验证后效果较好,并分享. 1 经纬度转换距离代码 #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'Seven' import math # 计算距离 def getDistance(latA, lonA, latB, lonB): ra = 6378140 # 赤道半径 rb = 6356755 # 极半径 flatten = (ra - rb) / ra #

  • 解决python gdal投影坐标系转换的问题

    要将xian80地理坐标系转换成投影坐标系: xian1980 = """ GEOGCS["GCS_Xian_1980", DATUM["Xian_1980", SPHEROID["Xian_1980",6378140.0,298.257]], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433]]"&q

  • 代码分析Python地图坐标转换

    最近做项目正好需要坐标的转换 各地图API坐标系统比较与转换; WGS84坐标系:即地球坐标系,国际上通用的坐标系.设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系, 谷歌地图采用的是WGS84地理坐标系(中国范围除外); GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统.由WGS84坐标系经加密后的坐标系. 谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系; BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系; 搜狗坐标系.图

  • Python编程调用百度API实现地理位置经纬度坐标转换示例

    目录 1.1,用百度账号登陆百度地图控制台 1.2,创建一个应用,获取 AK 参数 1.3,地理编码.逆地理编码 1.3.1 地理编码 1.3.2 逆地理编码 经纬度坐标转换最常见办法就是调用第三方 API,例如百度.高德地图等服务平台,提供了相应的功能接口,它们的这类技术已经非常成熟啦,准确稳定,关键还是免费的 ~ 本期教程以百度为例(高德的用方类似),介绍一下其用法 1.1,用百度账号登陆百度地图控制台 百度地图开放平台 1.2,创建一个应用,获取 AK 参数 登录控制台之后,选择左侧 应用

  • 使用Python和GDAL给图片加坐标系的实现思路(坐标投影转换)

    ** 使用Python和GDAL给图片加坐标系 ** 假设你已经知道arcgis地理配准(如下图内容),懂一点python. ** -目的和背景 1.从地图网站获得一张PNG格式的截图,已知坐标系为WGS84和左上角坐标.arcgis地理配准再定义投影即可给它加上原图的坐标系. 2.假设有上千张图片,可用Python和GDAL给图片加坐标系. -实现思路 1.使用GDAL需要知道待投影图片的地理坐标信息.仿射矩阵参数. 仿射矩阵参数是干什么的?见:https://zhuanlan.zhihu.c

  • Python实现常见的4种坐标互相转换

    目录 一.简介 二.代码及说明 一.简介 主流被使用的地理坐标系并不统一,常用的有WGS84.GCJ02(火星坐标系).BD09(百度坐标系)以及百度地图中保存矢量信息的web墨卡托,本文利用Python编写相关类以实现4种坐标系统之间的互相转换. 二.代码及说明 import math class LngLatTransfer(): def __init__(self): self.x_pi = 3.14159265358979324 * 3000.0 / 180.0 self.pi = ma

  • Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)

    生活中我们经常会遇到一些加密算法,今天我们就聊聊这些加密算法的Python实现.部分常用的加密方法基本都有对应的Python库,基本不再需要我们用代码实现具体算法. MD5加密 全称:MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致.md5加密算法是不可逆的,所以解密一般都是通过暴力穷举方法,通过网站的接口实现解密.Python代码: i

  • Python单体模式的几种常见实现方法详解

    本文实例讲述了Python单体模式的几种常见实现方法.分享给大家供大家参考,具体如下: 这里python实现的单体模式,参考了:https://stackoverflow.com/questions/1363839/python-singleton-object-instantiation/1363852#1363852 一.修改父类的 __dict__ class Borg: _shared_state = {} def __init__(self): self.__dict__ = self

  • 用Python解析XML的几种常见方法的介绍

    一.简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web发展到一定阶段的必然产物,既具有SGML的核心特征,又有着HTML的简单特性,还具有明确和结构良好等许多新的特性.         python解析XML常见的有三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合,注意xml.dom包里面有许多模块

  • python通过Matplotlib绘制常见的几种图形(推荐)

    目录 python通过Matplotlib绘制常见的几种图形 一.使用matplotlib对几种常见的图形进行绘制 1.柱状图 2.水平绘制柱状图 3.多个柱状图 4.叠加型柱状图 5.散点图 6.气泡图 7.直方图 8.箱线图 二.添加文字描述 1.文字描述一 2.文字描述二 三.多个图形描绘 subplots 四.使用Pandas 绘图 1.散点图 2.绘制柱状图 3.堆积的柱状图 4.水平的柱状图 5.直方图 6.箱线图 python通过Matplotlib绘制常见的几种图形 一.使用ma

  • Python常见的几种数据加密方式

    目录 md5加密 解密 增加破解成本的方法 SHA1安全哈希算法 Base64伪加密 DES/AES AES和DES的区别 破解方法 RSA 非对称加密算法 使用流程和场景介绍 公钥私钥生成方式 前言: 常见的加密算法基本分为这几类: 线性散列算法(签名算法)MD5,sha1 对称性加密算法 AES DES 非对称性加密算法 RSA md5加密 MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整的一致性.且MD5加密之后

  • python列表去重的5种常见方法实例

    目录 前言 一.使用for循环实现列表去重 二.使用列表推导式去重 三.使用集合转换函数set()实现列表去重 四.使用新建字典方式实现列表去重 五.删除列表中存在重复的数据 附:Python 二维数组元素去重 np.unique()函数的使用 总结 前言 列表去重在python实际运用中,十分常见,也是最基础的重点知识. 以下总结了5种常见的列表去重方法 一.使用for循环实现列表去重 此方法去重后,原顺序保持不变. # for循环实现列表去重 list1 = ['a', 'b', 1, 3,

  • Python实现排序方法常见的四种

    1.冒泡排序,相邻位置比较大小,将比较大的(或小的)交换位置 def maopao(a): for i in range(0,len(a)): for j in range(0,len(a)-i-1): if a[j]>a[j+1]: temp = a[j+1] a[j+1] = a[j] a[j] = temp #print(a) #print(a) print(a) 2.选择排序,遍历选择一个最小的数与当前循环的第一个数交换 def xuanze(a): for i in range(0,l

  • Python实现常见坐标系的相互转换

    目录 一.背景 二.代码 一.背景 主流被使用的地理坐标系并不统一,导致我们从不同平台下载的数据由于坐标系的差异往往对不齐.这个现象在多源数据处理的时候往往很常见,因此需要进行坐标转换. 简单介绍一下几种常见的坐标系: WGS84坐标系:即地球坐标系(World Geodetic System),国际上通用的坐标系.设备包含的GPS芯片或者北斗芯片获取的经纬度一般都是为WGS84地理坐标系,目前谷歌地图采用的是WGS84坐标系(中国范围除外). GCJ02坐标系:GCJ-02是由中国国家测绘局(

  • Python代码调试的几种方法总结

    使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了一些常用的调试命令,详情见表 1. 表 1. pdb 常用命令 下面结合具体的实例讲述如何使用 pdb 进行调试. 清单 1. 测试代码示例 import pdb a = "aaa" pdb.set_trace() b = "bbb" c = &

随机推荐