python 编写的经纬度坐标转换类
# -*- coding: utf-8 -*-
# /**
# * 各地图API坐标系统比较与转换;
# * WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,
# * 谷歌地图采用的是WGS84地理坐标系(中国范围除外);
# * GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系;
# * 3BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系;
# */
import math
from decimal import * class transfer:
def __init__(self,key=None):
self.a=6378245.0
self.ee=Decimal(0.00669342162296594323) def transformLng(self,x,y):
ret=Decimal()
ret = 300.0+x+2.0*y+0.1*x*x+0.1*x*y+0.1*math.sqrt(math.fabs(x))
ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
ret += (20.0 * math.sin(x * math.pi) + 40.0 * math.sin(x / 3.0 * math.pi)) * 2.0 / 3.0
ret += (150.0 * math.sin(x / 12.0 * math.pi) + 300.0 * math.sin(x / 30.0* math.pi)) * 2.0 / 3.0
return ret def transformLat(self,x,y):
ret = Decimal()
ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y+ 0.2 * math.sqrt(math.fabs(x))
ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
ret += (20.0 * math.sin(y * math.pi) + 40.0 * math.sin(y / 3.0 * math.pi)) * 2.0 / 3.0
ret += (160.0 * math.sin(y / 12.0 * math.pi) + 320 * math.sin(y * math.pi / 30.0)) * 2.0 / 3.0
return ret def transfrom(self,lng,lat):
dLat = self.transformLat(lng - 105.0, lat - 35.0)
dLng = self.transformLng(lng - 105.0, lat - 35.0)
radLat = lat / 180.0 * math.pi
magic = math.sin(radLat)
magic = 1 - self.ee * Decimal(magic) * Decimal(magic)
sqrtMagic = math.sqrt(magic)
dLat = Decimal((dLat * 180.0)) / ((Decimal(self.a) * (1 - self.ee)) / (Decimal(magic) * Decimal(sqrtMagic)) * Decimal(math.pi))
dLng = (dLng * 180.0) / (self.a / sqrtMagic * math.cos(radLat) * math.pi)
mgLat = lat + float(dLat)
mgLng = lng + dLng
return mgLng,mgLat #gps坐标转换为gcj02坐标系
def wg84_to_gcj02(self,wg84_lng,wg84_lat):
dLat=self.transformLat(wg84_lng-105.0,wg84_lat-35.0)
dLng=self.transformLng(wg84_lng-105.0,wg84_lat-35.0)
radLat = wg84_lat / 180.0 * math.pi
magic = math.sin(radLat)
magic = 1 - self.ee * Decimal(magic) * Decimal(magic)
sqrtMagic = math.sqrt(magic)
dLat = Decimal((dLat * 180.0)) / ((Decimal(self.a) * (1 - self.ee)) / (Decimal(magic) * Decimal(sqrtMagic)) * Decimal(math.pi))
dLng = (dLng * 180.0) / (self.a / sqrtMagic * math.cos(radLat) * math.pi)
gcj02Lat = wg84_lat + float(dLat)
gcj02Lng = wg84_lng + dLng
return gcj02Lng,gcj02Lat #gcj02坐标转百度坐标
def gcj02_to_bd09(self,gcj02_lng,gcj02_lat):
x = gcj02_lng
y = gcj02_lat
z = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y * math.pi)
theta = math.atan2(y, x) + 0.000003 * math.cos(x * math.pi)
bd09_Lng = z * math.cos(theta) + 0.0065
bd09_Lat = z * math.sin(theta) + 0.006
return bd09_Lng,bd09_Lat #wg84坐标转百度坐标
def wg84_to_bd09(self,wg84_lng,wg84_lat):
gcj02lng,gcj02lat=self.wg84_to_gcj02(wg84_lng,wg84_lat)
return self.gcj02_to_bd09(gcj02lng,gcj02lat) #百度坐标转GCJ02坐标
def bd09_to_gcj02(self,bd09_lng,bd09_lat):
x = bd09_lng - 0.0065
y = bd09_lat - 0.006
z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * math.pi)
theta = math.atan2(y, x) - 0.000003 * math.cos(x * math.pi)
gcj02_lng = z * math.cos(theta)
gcj02_lat = z * math.sin(theta)
return gcj02_lng,gcj02_lat #GCJ坐标转WG84坐标
def gcj02_to_wg84(self,gcj02_lng,gcj02_lat):
mlng,mlat=self.transfrom(gcj02_lng,gcj02_lat)
wg84_Lng=gcj02_lng*2-mlng
wg84_Lat=gcj02_lat*2-mlat
return wg84_Lng,wg84_Lat #将百度坐标转WG84坐标
def bd09_to_wg84(self,bd09_lng,bd09_lat):
gcj02_lng, gcj02_lat=self.bd09_to_gcj02(bd09_lng,bd09_lat)
return self.gcj02_to_wg84(gcj02_lng,gcj02_lat) tr=transfer()
#测试
print(tr.bd09_to_gcj02(113.30764968,23.1200491)) #转换正确 print(tr.bd09_to_wg84(113.30764968,23.1200491)) #转换正确 print(tr.wg84_to_bd09(113.30764968,23.1200491)) #转换正确
由python实现的各类坐标系转换程序,验证可行
在线的测试工具 https://tool.lu/coordinate
python 编写的经纬度坐标转换类的更多相关文章
- python基础——实例属性和类属性
python基础——实例属性和类属性 由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(objec ...
- 用Python编写的第一个回测程序
用Python编写的第一个回测程序 2016-08-06 def savfig(figureObj, fn_prefix1='backtest8', fn_prefix2='_1_'): import ...
- [译]Python编写虚拟解释器
使用Python编写虚拟机解释器 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环 ...
- python 面向对象之封装与类与对象
封装 一,引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,小老虎一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装='隐藏',这种理解是相当片面的 二,先看如何隐藏 在 ...
- Python编写守护进程程序
Python编写守护进程程序思路 1. fork子进程,父进程退出通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端 ...
- python入门学习:8.类
python入门学习:8.类 关键点:类 8.1 创建和使用类8.2 使用类和实例8.3 继承8.4 导入类 8.1 创建和使用类 面向对象编程是最有效的软件编写方法之一.在面向对象编程中,你编写 ...
- 【转】python编写规范——中标软件有限公司测试中心
[转]python编写规范 一.说明 二.内容 1. 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行... 1.5 编码... 2. 语句... 2.1 标准 ...
- python编写shell脚本详细讲解
python编写shell脚本详细讲解 那,python可以做shell脚本吗? 首先介绍一个函数: os.system(command) 这个函数可以调用shell运行命令行command并且返回它 ...
- python之旅:元类
type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hel ...
随机推荐
- SQL中EXTRACT() 函数
EXTRACT()("提取"的意思) 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. 就是返回出来具体的年,月,日 2008-12-29 16:25:46.63 ...
- dubbo之分组聚合
按组合并返回结果 ,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项. 相关代码可以参考 dubbo 项目 ...
- sql server 查询数据判断为空
and xxx is NOT null and xxx is null
- XML-20100: (Fatal Error) Expected ';'. xml转word 导出时异常
因为数据中包含特殊字符.需要进行转译. < < 小于号 > > 大于号 & & 和 ' ’ 单引号 " " 双引号 XML ...
- Oracle经验积累
Oracle 常用Funtion ----行转列 开始---- select u_id, wmsys.wm_concat(goods) goods_sum from shopping group by ...
- 01-Linux命令基础-第01天(命令基础,软件安装与卸载、磁盘管理)
01- Linux初步 最早一直是单道程序设计模型的操作系统 69年贝尔实验室决定开发多道程序设计模型的操作系统 Multics计划 (失败了) x86 IA(Intel Architecture ...
- Linux C(day01)
Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用键盘不能使用鼠标 可以在终端软件里输入各种命令控制计算机 完成各种任务 clear命令可以清除 ...
- [tyvj1935 Poetize3]导弹防御塔 (二分图多重匹配)
传送门 Description Freda控制着N座可以发射导弹的防御塔.每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚.在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚 ...
- [jzoj 5778]【NOIP提高A组模拟2018.8.8】没有硝烟的战争 (博弈论+dp)
传送门 Description 被污染的灰灰草原上有羊和狼.有N只动物围成一圈,每只动物是羊或狼. 该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x ...
- 爬虫框架Scrapy初步使用
本文转载自: Scrapy 爬取并分析酷安 6000 款 App,找到良心佳软(抓取篇) https://www.makcyun.top/web_scraping_withpython10.html ...