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和shell变量互相传递的几种方法
Nov 20 Python
Python多继承原理与用法示例
Aug 23 Python
django-初始配置(纯手写)详解
Jul 30 Python
Python实现Restful API的例子
Aug 31 Python
Python实现不规则图形填充的思路
Feb 02 Python
pycharm设置python文件模板信息过程图解
Mar 10 Python
详解Python IO编程
Jul 24 Python
python 实现图片批量压缩的示例
Dec 18 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 Python
python基于turtle绘制几何图形
Jun 15 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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
WiFi云数码相框:Nixplay
2018/07/05 全球购物
采购主管的岗位职责
2013/12/17 职场文书
教师辞职报告范文
2014/01/20 职场文书
春风行动实施方案
2014/03/28 职场文书
党的生日活动方案
2014/08/15 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
买卖合同协议书范本
2014/10/18 职场文书
李强感恩观后感
2015/06/17 职场文书
初婚未育证明样本
2015/06/18 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android
Python实现双向链表基本操作
2022/05/25 Python