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使用plotly绘制数据图表的方法
Jul 18 Python
快速查询Python文档方法分享
Dec 27 Python
python http接口自动化脚本详解
Jan 02 Python
Python实现多进程的四种方式
Feb 22 Python
django 消息框架 message使用详解
Jul 22 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
Aug 23 Python
python中的Elasticsearch操作汇总
Oct 30 Python
Python批量安装卸载1000个apk的方法
Apr 10 Python
基于python实现数组格式参数加密计算
Apr 21 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
什么是Python包的循环导入
Sep 08 Python
Python编程super应用场景及示例解析
Oct 05 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
PHP中的正规表达式(一)
2006/10/09 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
js实现数字滚动特效
2019/12/16 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
keras K.function获取某层的输出操作
2020/06/29 Python
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
Java基础类库面试题
2013/09/04 面试题
网络维护中文求职信
2014/01/03 职场文书
大学毕业生个人自荐信范文
2014/01/08 职场文书
校园招聘策划书
2014/01/09 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
学雷锋的心得体会
2014/09/04 职场文书
工作证明英文模板
2014/10/21 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
演讲开场白台词大全
2015/05/29 职场文书
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript