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 相关文章推荐
在Django中限制已登录用户的访问的方法
Jul 23 Python
Python2和Python3中print的用法示例总结
Oct 25 Python
python通过tcp发送xml报文的方法
Dec 28 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
Python中dict和set的用法讲解
Mar 28 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
Python for循环及基础用法详解
Nov 08 Python
10个Python面试常问的问题(小结)
Nov 20 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
python-numpy-指数分布实例详解
Dec 07 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 26 Python
Django Auth用户认证组件实现代码
Oct 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
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
14款NodeJS Web框架推荐
2014/07/11 NodeJs
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
Python实现控制台输入密码的方法
2015/05/29 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
2018/01/11 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
中医专业应届生求职信
2013/11/17 职场文书
高级工程师英文求职信
2014/03/19 职场文书
党组织公开承诺书
2014/03/29 职场文书
调查研究项目计划书
2014/04/29 职场文书
超市促销活动总结
2014/07/01 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
上学路上观后感
2015/06/16 职场文书
总结一些Java常用的加密算法
2021/06/11 Java/Android
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript