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实现的扫雷游戏实例代码
Aug 01 Python
Python写的一个简单监控系统
Jun 19 Python
Python字符串匹配算法KMP实例
Jul 18 Python
使用rst2pdf实现将sphinx生成PDF
Jun 07 Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
Python使用SQLite和Excel操作进行数据分析
Jan 20 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
对python数据切割归并算法的实例讲解
Dec 12 Python
python爬虫爬取笔趣网小说网站过程图解
Nov 18 Python
python 初始化一个定长的数组实例
Dec 02 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 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
用PHP调用Oracle存储过程
2006/10/09 PHP
用PHP与XML联手进行网站编程代码实例
2008/07/10 PHP
一些php项目中比较通用的php自建函数的详解
2013/06/06 PHP
php获取中文拼音首字母类和函数分享
2014/04/24 PHP
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
ES5新增数组的实现方法
2020/05/12 Javascript
python之Socket网络编程详解
2016/09/29 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
Python模拟登陆实现代码
2017/06/14 Python
python实现rsa加密实例详解
2017/07/19 Python
Django admin美化插件suit使用示例
2017/12/12 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
python抽取指定url页面的title方法
2018/05/11 Python
python读取Excel实例详解
2018/08/17 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
幼儿园托班开学寄语
2014/01/18 职场文书
最新奶茶店创业计划书
2014/01/25 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
公休请假条
2014/04/11 职场文书