在定位与地图构建领域,有时候会需要进行各种地理坐标系之间的转换,以及如何计算各种地理信息!下面是我使用python来实现的计算方法,各位适当参考!

参考资料:

https://www.movable-type.co.uk/scripts/latlong.html

https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates

1.将大地坐标系坐标转换为ECEF坐标系坐标

大地坐标系坐标一般为经度、维度、海拔,是球坐标系,而ECEF坐标系为笛卡尔坐标系,该转换方法是基于地球为椭球来进行转换的。

原理如下:

# latitude:纬度 longitude:经度 altitude:海拔
def LLA_to_XYZ(latitude, longitude, altitude):# 经纬度的余弦值cosLat = math.cos(latitude * math.pi / 180)sinLat = math.sin(latitude * math.pi / 180)cosLon = math.cos(longitude * math.pi / 180)sinLon = math.sin(longitude * math.pi / 180)# WGS84坐标系的参数rad = 6378137.0        #地球赤道平均半径(椭球长半轴:a)f = 1.0 / 298.257224   # WGS84椭球扁率 :f = (a-b)/aC = 1.0 / math.sqrt(cosLat * cosLat + (1-f) * (1-f) * sinLat * sinLat)S = (1-f) * (1-f) * Ch = altitude# 计算XYZ坐标X = (rad * C + h) * cosLat * cosLonY = (rad * C + h) * cosLat * sinLonZ = (rad * S + h) * sinLatreturn np.array([X, Y, Z])

2.将ECEF坐标系转换为大地坐标系

def XYZ_to_LLA(X, Y, Z):# WGS84坐标系的参数a = 6378137.0        # 椭球长半轴b = 6356752.314245   # 椭球短半轴ea = np.sqrt((a ** 2 - b ** 2) / a ** 2)eb = np.sqrt((a ** 2 - b ** 2) / b ** 2)p = np.sqrt(X ** 2 + Y ** 2)theta = np.arctan2(Z * a, p * b)# 计算经纬度及海拔longitude = np.arctan2(Y, X)latitude = np.arctan2(Z + eb ** 2 * b * np.sin(theta) ** 3, p - ea ** 2 * a * np.cos(theta) ** 3)N = a / np.sqrt(1 - ea ** 2 * np.sin(latitude) ** 2)altitude = p / np.cos(latitude) - Nreturn np.array([np.degrees(latitude), np.degrees(longitude), altitude])

3.根据经度、纬度、海拔计算两地距离

# 根据经度、纬度、海拔计算两地距离:法一
def get_distance1(position1, position2):v1 = LLA_to_XYZ(position1[0], position1[1], position1[2])v2 = LLA_to_XYZ(position2[0], position2[1], position2[2])distance = np.linalg.norm(v1 - v2)return distance# 根据经度、纬度计算两地距离:法二
def get_distance2(lat1, lon1, lat2, lon2):"""获取地理坐标系下的两点间距离"""# GetDistanceInGeographyCoordinate, return two point distanceradius_lat1 = lat1 * math.pi / 180radius_lat2 = lat2 * math.pi / 180radius_lon1 = lon1 * math.pi / 180radius_lon2 = lon2 * math.pi / 180a = radius_lat1 - radius_lat2b = radius_lon1 - radius_lon2distance = 2 * math.asin(math.sqrt(pow(math.sin(a / 2.0), 2) +math.cos(radius_lat1) * math.cos(radius_lat2) *pow(math.sin(b / 2.0), 2)))distance = distance * 6378137distance = distance - (distance * 0.0011194)return distance

4.根据两地经纬度计算方位角

def get_bearing(lat1, lon1, lat2, lon2):dlon = lon2 - lon1y = math.sin(dlon) * math.cos(lat2)x = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(dlon)bearing = math.atan2(y, x)bearing = np.degrees(bearing)bearing = (bearing + 360) % 360return bearing

5.由A地的经纬度,A、B两地的方位角、距离,计算B点的经纬度

略!后续补充!

地理坐标系之间的转换及经纬度、方位角、距离之间的计算!相关推荐

  1. java类型之间的转换_JAVA基本数据类型及之间的转换

    一.数据类型 1.布尔型(boolean) :true/false,不可以以0或非0的数字代替:不能进行数据之间的转换. 2.整数类型 ** 整型默认为int型,而long类型表示的范围要超出int表 ...

  2. 计算机不同进制数之间的转换,计算机进制数之间的转换002

    不错 除以16取余和倍数 如: (120)10 120/16 =8 ...8(余8) 8(余数8)/16=0 (8) (120)10 =(88)16 回答人的补充 2009-08-14 09:42 计 ...

  3. C++ —— (两个经纬度计算距离、方位角)、(经纬度A+距离+方位,计算目标经纬度)、(多个经纬度计算面积)

      顺看 编码不易,觉得文章好,请给作者点赞关注.一键三连.谢谢!       * 计算两经纬度之间的距离.方位角 * 已知A经纬度.根据距离.方位,计算目标经纬度            测试了三组数 ...

  4. 关于数组集合之间的转换

    开发中经常用到数组和集合之间的转换和集合与集合之间的转换. 在JDK中有现成的API中供我们使用. 1.首先是数组和集合之间的转换: 1 import java.util.ArrayList; 2 i ...

  5. Timestamp、String、Date之间的转换

    2019独角兽企业重金招聘Python工程师标准>>> 用Timestamp来记录日期时间还是很方便的,但有时候显示的时候是不需要小数位后面的毫秒的,这样就需要在转换为String时 ...

  6. ipv6的表示、ipv6与ipv4之间的转换、ipv6地址大小判定

    本文对初步接触到ipv6时,常遇到的三个疑问(ipv6的表示.ipv6与ipv4之间的转换.ipv6地址大小判定)进行了简单介绍. ipv6的表示 关于单个ipv6地址的基本表示有:标准表示.压缩表示 ...

  7. 进制之间的转换(补充版)

    这里是进制转换的补充,至于整数部分的讲解,参考小编的上一篇文章https://blog.csdn.net/mez_Blog/article/details/91354750,介绍了整数部分个进制之间的 ...

  8. Java集合Map,set, list 之间的转换

    Java集合Map,set, list 之间的转换 前言: 通过思维导图复习联系,看到一个HashMap排序题上机题之后有的一个感想,题目如下,看看你能时间出来么? 已知一个HashMap<In ...

  9. java int 64 转换_Java中数据类型及其之间的转换

    Java中数据类型及其之间的转换 Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种: 1)int长度数据类型有:byte(8bits).short(16bits).int(32bi ...

最新文章

  1. 如何优雅的编写 JavaScript 代码
  2. python编程入门指南pdf-python编程初学者指南
  3. KubeCon 2020 演讲集锦|《阿里巴巴云原生技术与实践 13 讲》开放下载
  4. Web API应用架构设计分析(2)
  5. C++学习笔记-----二分法之寻找非减序列第一个大于某个值的数或最后一个小于某个值的数
  6. android 引用非 android 工程,Unity3D调用android方法(非插件方式)
  7. Anti-debugging Skills in APK
  8. python的os库_os库(python)—总结
  9. SQL中inner join、outer join和cross join的区别
  10. 电力电子仿真软件对比分析
  11. pitch、yaw、roll三个角
  12. redis集群原理及三种模式详解
  13. 计算机组装与维护公开课,计算机组装与维护公开课教案
  14. 用数字计算机公式表白,数学计算题表白公式
  15. 钢琴学习:B站:时一:《万能左手伴奏》
  16. 台式电脑接路由器步骤_台式电脑插线步骤图连接路由器(路由器最正确的连接方法)...
  17. #762 (Div. 3) E. MEX and Increments(贪心构造
  18. Constraint of Oracle studing
  19. MISC解题思路总结(一)XCTF平台
  20. 亚马逊中国站获取全部商品分类

热门文章

  1. codeforces 961 D. Pair Of Lines (几何,向量叉乘,三点共线)
  2. php获取7天,php 获取未来七天的日期和星期
  3. System.nanoTime()的使用
  4. 游戏帧同步和状态同步
  5. 那个学php的上吊了,这位一路名校的中国博士,突然在美国上吊自杀了
  6. 格局决定结局,态度决定高度
  7. 我用“电驴”抓肉鸡(转)
  8. python+机器学习方法进行情感分析
  9. Win7+Win8双系统安装教程!零风险超简单2
  10. SUBTOTAL函数的应用