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兔子毒药问题实例分析
Mar 05 Python
Python设计模式之观察者模式简单示例
Jan 10 Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 Python
windows下安装Python的XlsxWriter模块方法
May 03 Python
基于DataFrame改变列类型的方法
Jul 25 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
利用pyinstaller打包exe文件的基本教程
May 02 Python
Python3 实现串口两进程同时读写
Jun 12 Python
django使用F方法更新一个对象多个对象字段的实现
Mar 28 Python
Python实现转换图片背景颜色代码
Apr 30 Python
Python项目实战之使用Django框架实现支付宝付款功能
Feb 23 Python
如何使用flask将模型部署为服务
May 13 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
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
php中实现简单的ACL 完结篇
2011/09/07 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
jQuery live
2009/05/15 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
React Native 图片查看组件的方法
2018/03/01 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
Python中实现的RC4算法
2015/02/14 Python
Unicode和Python的中文处理
2017/03/19 Python
Python制作Windows系统服务
2017/03/25 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
《搭石》教学反思
2014/04/07 职场文书
原料仓管员岗位职责
2014/04/12 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
机关党员公开承诺书
2014/08/30 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
2014年个人教学工作总结
2014/12/09 职场文书
文明单位汇报材料
2014/12/24 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
工作会议通知
2015/04/15 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android