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中if __name__ == "__main__"详细解释
Oct 21 Python
Python文件及目录操作实例详解
Jun 04 Python
Python检测网站链接是否已存在
Apr 07 Python
python如何实现int函数的方法示例
Feb 19 Python
浅析PHP与Python进行数据交互
May 15 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 Python
PyCharm如何导入python项目的方法
Feb 06 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
May 19 Python
python在package下继续嵌套一个package
Apr 14 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中session与cookie的比较
2015/01/27 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
AutoSave/自动存储功能实现
2007/03/24 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
js面向对象的写法
2016/02/19 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
使用Python读取大文件的方法
2018/02/11 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
Python识别html主要文本框过程解析
2020/02/18 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
PHP如何自定义函数
2016/09/16 面试题
追悼会主持词
2014/03/20 职场文书
迎国庆演讲稿
2014/09/05 职场文书
2015年保管员工作总结
2015/04/30 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis