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算法学习之基数排序实例
Dec 18 Python
跟老齐学Python之有容乃大的list(2)
Sep 15 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
Python实现的简单算术游戏实例
May 26 Python
python实现简单遗传算法
Mar 19 Python
程序员写Python时的5个坏习惯,你有几条?
Nov 26 Python
基于Python函数和变量名解析
Jul 19 Python
Python中BeautifuSoup库的用法使用详解
Nov 15 Python
python绘制随机网络图形示例
Nov 21 Python
Python新手如何理解循环加载模块
May 29 Python
Python读取yaml文件的详细教程
Jul 21 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 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
URL Rewrite的设置方法
2007/01/02 PHP
提高php运行速度的一些小技巧分享
2012/07/03 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
优纳科技软件测试面试题
2012/05/15 面试题
药店主任岗位责任制
2014/02/10 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
地震慰问信
2015/02/14 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
安全生产会议制度
2015/08/06 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
Ajax请求超时与网络异常处理图文详解
2021/05/23 Javascript
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android
浅谈Redis中的RDB快照
2021/06/29 Redis
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸