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中pygame模块用法实例
Oct 09 Python
Python中的__SLOTS__属性使用示例
Feb 18 Python
python实现在windows下操作word的方法
Apr 28 Python
Python 使用SMTP发送邮件的代码小结
Sep 21 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
在Python中通过getattr获取对象引用的方法
Jan 21 Python
ML神器:sklearn的快速使用及入门
Jul 11 Python
python3 反射的四种基本方法解析
Aug 26 Python
Python列表解析操作实例总结
Feb 26 Python
Python如何实现邮件功能
May 27 Python
python 用struct模块解决黏包问题
Nov 07 Python
python垃圾回收机制原理分析
Apr 13 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中经典方法实现判断多维数组是否为空
2011/10/23 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
php自定文件保存session的方法
2014/12/10 PHP
在html文件中也可以执行php语句的方法
2015/04/09 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
jquery实现Ctrl+Enter提交表单的方法
2015/07/21 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
Python常用的日期时间处理方法示例
2015/02/08 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
应届大学生自荐书
2014/06/17 职场文书
大专生求职信
2014/06/29 职场文书
民族精神月活动总结
2014/08/28 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
2015年人事工作总结范文
2015/04/09 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers