python 经纬度求两点距离、三点面积操作


Posted in Python onJune 03, 2021

给出地球上两点的经纬度,计算两点之间的球面距离。给出地球上三点的经纬度,求形成的三角形面积。

对于这样的需求,可以通过使用半正失公式来计算得到我们想要的距离,面积值。

先给出半正失公式(haversine formula):

python 经纬度求两点距离、三点面积操作

python 经纬度求两点距离、三点面积操作

先看第一个式,等号的右边,输入参数有φ、λ,等号的右边有d、r,其中φ表示纬度,λ表示经度,d是我们要的两点的距离,

r是地球半径,d/r表示两点在圆上的弧度θ。

通过整理两个式子可得:

python 经纬度求两点距离、三点面积操作

python 经纬度求两点距离、三点面积操作

也就是说,只要根据上面最后这行式子,带入相应的经纬度值,以及地球半径,就可以得到我们想要的两点的球面距离,

在这里我们假设地球为均匀球体(r=6371.393公里)。

具体的python代码实现如下:

import math
class cal_distance(object):
    def __init__(self,**kwargs):
        self.lat1 = kwargs.get('lat1')
        self.lon1 = kwargs.get('lon1')
        self.lat2 = kwargs.get('lat2')
        self.lon2 = kwargs.get('lon2')
        
    def twopoint_distance(self):
        R=6371.393
        dlat=self.deg2rad(self.lat2-self.lat1)
        dlon=self.deg2rad(self.lon2-self.lon1)
        a=math.sin(dlat/2)**2+math.cos(self.deg2rad(self.lat1))*math.cos(self.deg2rad(self.lat2))*math.sin(dlon/2)**2
        c=2*math.atan2(math.sqrt(a),math.sqrt(1-a))
        return R*c
        
    def deg2rad(self,deg):
        return deg*(math.pi/180)

定义一个cal_distance类,功能为输入参数为两点的经纬度计算两点的球面距离。deg2reg函数为度数转弧度函数,twopoint_distance为距离计算功能函数,输出两点距离,单位为千米(公里)。

from cal_distance import cal_distance
def run():
    point1_lat = 39.2186266952
    point2_lat = 39.08579871
    point1_lon = 117.8175961241
    point2_lon = 117.7040162
    Distance = cal_distance(lat1=point1_lat,lon1=point1_lon1,lat2=point2_lat,lon2=point2_lon)
    distance = Distance.twopoint_distance()
    print distance
    
if __name__=='__main__':
    run()

这段代码为具体的函数调用部分,实例化对象,调用twopoint_distance(),就可以得到我们想要的距离值了。

在现在的代码基础上,想要计算三个点围成的面积就很容易实现了。三个点两两求出三条边的距离,利用三边求面积公式,就可以得到三角形的面积值。

下面给出类的定义部分:

import math
class cal_area(object):
    def __init__(self,**kwargs):
        self.lat1 = kwargs.get('lat1')
        self.lon1 = kwargs.get('lon1')
        self.lat2 = kwargs.get('lat2')
        self.lon2 = kwargs.get('lon2')
        self.lat3 = kwargs.get('lat3')
        self.lon3 = kwargs.get('lon3')
        
    def twopoint_distance(self,lat1,lon1,lat2,lon2):
        R=6371.393
        dlat=self.deg2rad(lat2-lat1)
        dlon=self.deg2rad(lon2-lon1)
        a=math.sin(dlat/2)**2+math.cos(self.deg2rad(self.lat1))*math.cos(self.deg2rad(self.lat2))*math.sin(dlon/2)**2
        c=2*math.atan2(math.sqrt(a),math.sqrt(1-a))
        return R*c
        
    def deg2rad(self,deg):
        return deg*(math.pi/180)
    
    def area(self):
        distance12=self.twopoint_distance(self.lat1,self.lon1,self.lat2,self.lon2)
        distance13=self.twopoint_distance(self.lat1,self.lon1,self.lat3,self.lon3)
        distance23=self.twopoint_distance(self.lat2,self.lon2,self.lat3,self.lon3)
        p=self.half_perimeter(distance12,distance23,distance13)
        s=math.sqrt(p*(p-distance12)*(p-distance23)*(p-distance13))
        return s
        
    def half_perimeter(a,b,c):
        return (a+b+c)/2

Python Haversine公式计算两点(经纬度坐标)距离

在WGS84坐标系下,计算两点(经纬度坐标)之间的距离(单位:km)。

import math
def LLs2Dist(lat1, lon1, lat2, lon2):
    R = 6371
    dLat = (lat2 - lat1) * math.pi / 180.0
    dLon = (lon2 - lon1) * math.pi / 180.0
    a = math.sin(dLat / 2) * math.sin(dLat / 2) + math.cos(lat1 * math.pi / 180.0) * math.cos(lat2 * math.pi / 180.0) * math.sin(dLon / 2) * math.sin(dLon / 2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    dist = R * c
    return dist

验证:

x1 = 37.779388
y1 = -122.423246
x2 = 32.719464
y2 = -117.220406
dist = LLs2Dist(y1, x1, y2, x2)
print dist

输出结果为:

642.185478152

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python复制目录结构脚本代码分享
Mar 06 Python
详解Python的迭代器、生成器以及相关的itertools包
Apr 02 Python
归纳整理Python中的控制流语句的知识点
Apr 14 Python
Python文件夹与文件的相关操作(推荐)
Jul 25 Python
Django实现快速分页的方法实例
Oct 22 Python
Python选择网卡发包及接收数据包
Apr 04 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
django使用xadmin的全局配置详解
Nov 15 Python
基于django 的orm中非主键自增的实现方式
May 18 Python
Python如何把字典写入到CSV文件的方法示例
Aug 23 Python
Python实现壁纸下载与轮换
Oct 19 Python
如何使用PyCharm及常用配置详解
python for循环赋值问题
Jun 03 #Python
python批量创建变量并赋值操作
Jun 03 #Python
详解运行Python的神器Jupyter Notebook
Jun 03 #Python
python中如何对多变量连续赋值
Python连续赋值需要注意的一些问题
Jun 03 #Python
pytorch fine-tune 预训练的模型操作
Jun 03 #Python
You might like
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
Jquery iframe内部出滚动条
2010/02/11 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
jquery向后台提交数组的代码分析
2020/02/20 jQuery
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
全面解读Python Web开发框架Django
2014/06/30 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
PyQt5每天必学之关闭窗口
2018/04/19 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
StringBuilder和String的区别
2015/05/18 面试题
夏季奶茶店创业计划书
2014/01/16 职场文书
检讨书怎么写
2015/01/23 职场文书
大学生党员自我评价
2015/03/04 职场文书
采购内勤岗位职责
2015/04/13 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python
Django中session进行权限管理的使用
2021/07/09 Python