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实现二叉搜索树
Feb 03 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
python如何读写csv数据
Mar 21 Python
对Python 文件夹遍历和文件查找的实例讲解
Apr 26 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
Python 对输入的数字进行排序的方法
Jun 23 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
pycharm激活码有效到2020年11月底
Sep 18 Python
Pytorch 实现focal_loss 多类别和二分类示例
Jan 14 Python
python求最大公约数和最小公倍数的简单方法
Feb 13 Python
详解Flask开发技巧之异常处理
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
第三章 php操作符与控制结构代码
2011/12/30 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
Ajax基础知识详解
2017/02/17 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
python+opencv识别图片中的圆形
2020/03/25 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
Spy++的使用方法及下载教程
2021/01/29 Python
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
专科应届生求职信
2013/11/24 职场文书
团队精神演讲稿
2013/12/31 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
春风化雨观后感
2015/06/11 职场文书
高中数学课堂教学反思
2016/02/18 职场文书