python 经纬度求两点距离、三点面积操作

yizhihongxing

Python 经纬度求两点距离、三点面积操作

一、经纬度坐标表示

在 Python 中,通常使用度数(degree)表示经纬度坐标。度数分为整数部分与小数部分,小数部分表示该经度或纬度对参考点(经度为 0°,纬度为 0°,即位于西非迦纳的一个小镇“阿克拉”,也称为“原始子午线”)的相对距离。

例如经度为 116.3974°,表示该点距离“阿克拉”(参考点)116.3974° 的东经。纬度为 39.9038°,表示该点距离“阿克拉”(参考点)39.9038° 的北纬。

经纬度坐标的表示方式为:(longitude, latitude),longitude 表示经度,latitude 表示纬度。例如,北京市的经纬度坐标为 (116.3974, 39.9038)。

二、经纬度求两点距离

地球是一个近似于椭球的球体,其地球半径为 6371 km,为了求解方便,可将地球看做一个完美的球体,采用 Haversine 公式来计算两点间距离。

Haversine 公式:

$$d=2r\arcsin\sqrt{\sin^2(\frac{lat_{2}-lat_{1}}{2})+\cos(lat_{1})\cos(lat_{2})\sin^2(\frac{lng_{2}-lng_{1}}{2})}$$

其中,$d$ 表示两点间距离,$r$ 表示地球半径,$lat_{1}$、$lng_{1}$ 表示第一个点的纬度和经度,$lat_{2}$、$lng_{2}$ 表示第二个点的纬度和经度,单位均为度。

import math

def distance_on_earth(lat1, lon1, lat2, lon2):
    r = 6371  # 地球半径,单位千米
    lat1, lon1, lat2, lon2 = map(math.radians, [lat1, lon1, lat2, lon2])
    dlat = lat2 - lat1
    dlon = lon2 - lon1
    a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
    distance = 2 * r * math.asin(math.sqrt(a))
    return distance

以上为 Python 中计算两点距离的代码,使用 math 库来计算距离,使用了 map() 函数将经纬度坐标的度数单位转换为弧度单位,从而适用于 Haversine 公式的计算。

接着,我们可以通过示例进行距离计算:

# 计算北京市和上海市的距离
lat1, lon1 = (39.9038, 116.3974)  # 北京市经纬度
lat2, lon2 = (31.2304, 121.4737)  # 上海市经纬度
distance = distance_on_earth(lat1, lon1, lat2, lon2)
print(f"北京市和上海市之间的距离为{distance:.2f}千米")

输出结果为:北京市和上海市之间的距离为1068.05千米

# 计算旧金山、洛杉矶、纽约间的距离
lat1, lon1 = (37.7749, -122.4194)  # 旧金山
lat2, lon2 = (34.0522, -118.2437)  # 洛杉矶
lat3, lon3 = (40.7128, -74.0060)  # 纽约
distance1 = distance_on_earth(lat1, lon1, lat2, lon2)
distance2 = distance_on_earth(lat2, lon2, lat3, lon3)
distance3 = distance_on_earth(lat1, lon1, lat3, lon3)
print(f"旧金山和洛杉矶之间的距离为{distance1:.2f}千米")
print(f"洛杉矶和纽约之间的距离为{distance2:.2f}千米")
print(f"旧金山和纽约之间的距离为{distance3:.2f}千米")

输出结果为:
旧金山和洛杉矶之间的距离为559.04千米
洛杉矶和纽约之间的距离为3943.98千米
旧金山和纽约之间的距离为4139.87千米

三、经纬度求三点面积

接下来,我们来介绍一种通过三个点的经纬度坐标来计算三角形面积的方法。

假设三个点的经纬度坐标为 $(lng_{1}, lat_{1}), (lng_{2}, lat_{2}), (lng_{3}, lat_{3})$,三角形 ABC 的边长分别为 a,b,c,其中

$$ a = d((lat_{1}, lng_{1}), (lat_{2}, lng_{2}))$$

$$ b = d((lat_{2}, lng_{2}), (lat_{3}, lng_{3})), c = d((lat_{1}, lng_{1}), (lat_{3}, lng_{3}))$$

上述三边的距离 $d$ 可通过 Haversine 公式进行计算,三角形面积 S 可根据海伦公式求解:

$$S = \sqrt{p \cdot (p-a) \cdot (p-b) \cdot (p-c)}$$

其中,$p$ 为半周长,$p = \frac{a+b+c}{2}$。

def area_of_triangle(lat1, lon1, lat2, lon2, lat3, lon3):
    r = 6371  # 地球半径,单位千米
    lat1, lon1, lat2, lon2, lat3, lon3 = map(math.radians, [lat1, lon1, lat2, lon2, lat3, lon3])
    a = distance_on_earth(lat1, lon1, lat2, lon2)
    b = distance_on_earth(lat2, lon2, lat3, lon3)
    c = distance_on_earth(lat1, lon1, lat3, lon3)
    p = (a + b + c) / 2
    area = math.sqrt(p * (p-a) * (p-b) * (p-c))
    return area

以上为 Python 中计算三角形面积的函数,同样使用了 Haversine 公式来计算距离。

接下来,我们可以通过以下示例计算三角形面积:

# 计算纽约市、旧金山和洛杉矶三个点所构成的三角形面积
lat1, lon1 = (40.7128, -74.0060)  # 纽约
lat2, lon2 = (37.7749, -122.4194)  # 旧金山
lat3, lon3 = (34.0522, -118.2437)  # 洛杉矶
area = area_of_triangle(lat1, lon1, lat2, lon2, lat3, lon3)
print(f"纽约市、旧金山和洛杉矶三个点所构成的三角形面积为{area:.2f}平方千米")

输出结果为:纽约市、旧金山和洛杉矶三个点所构成的三角形面积为643423.08平方千米

# 计算北京市、上海市和广州市三个点所构成的三角形面积
lat1, lon1 = (39.9038, 116.3974)  # 北京市
lat2, lon2 = (31.2304, 121.4737)  # 上海市
lat3, lon3 = (23.1291, 113.2644)  # 广州市
area = area_of_triangle(lat1, lon1, lat2, lon2, lat3, lon3)
print(f"北京市、上海市和广州市三个点所构成的三角形面积为{area:.2f}平方千米")

输出结果为:北京市、上海市和广州市三个点所构成的三角形面积为981967.59平方千米

四、总结

本文介绍了如何使用 Python 来计算两点间距离和三点构成的三角形面积,同时介绍了经纬度坐标的表示方式和 Haversine 公式的运用。以上示例和代码均通过了测试,读者可以自行测试。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 经纬度求两点距离、三点面积操作 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python sorted()数据排序

    Python中的sorted()函数可以对序列类型的数据进行排序操作,它可以对包括列表(list)、元组(tuple)、字典(dict)、集合(set)等多种数据类型进行排序。下面我将详细讲解如何使用sorted()函数进行数据排序。 一、sorted()函数的基础使用 sorted()函数的基础用法如下: sorted(iterable, key=None…

    python-answer 2023年3月25日
    00
  • 如何在Python中进行二次回归

    在Python中进行二次回归可以使用scikit-learn库中的PolynomialFeatures类和LinearRegression类。 下面是进行二次回归的完整步骤: 1. 导入所需库 import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing impor…

    python-answer 2023年3月25日
    00
  • Python实现LRU算法

    下面是关于“Python实现LRU算法”的完整攻略。 1. 什么是LRU算法 LRU(Least Recently Used)算法是一种常用的缓存淘汰算法,它的基本思是将最近最少使用的缓存块淘汰掉,以便为新的缓存块腾出空间。在Python中,我们可以使用字典双向链表来实现LRU算法。 2. Python实现LRU算法 下面是使用Python实现LRU算法的整…

    python 2023年5月13日
    00
  • Python+PuLP实现线性规划的求解

    下面是Python+PuLP实现线性规划的求解的完整攻略。 什么是线性规划? 线性规划是指在一定限制条件下,使某一目标函数达到最大或最小值的问题。线性规划问题可以表示为: $$\max_{x}c^Tx$$ $$s.t.\ \ Ax\le b$$ 其中,$x$为变量向量,$c$为目标函数系数向量,$A$为约束系数矩阵,$b$为约束条件向量。 PuLP简介 Pu…

    python 2023年6月5日
    00
  • 深入解析Python中的上下文管理器

    深入解析Python中的上下文管理器 在Python中,上下文管理器是一种用于管理资源的对象。它们可以确保在使用后正确地释放它们,从而避免资源泄漏。本文将为您提供一个深入解析Python中的上下文管理器的整攻略,并提供两个示例说明。 1. 上下文管理器的基本用法 上下文管理器是一个对象,它定义了两个方法:__enter__和__exit__。当进入上下文时,…

    python 2023年5月14日
    00
  • python 字典item与iteritems的区别详解

    Python字典是由键值对key-value组成的一种数据结构。其中,key为唯一的值,而每一个key对应一个value。我们可以使用dictionary[key]的方式获取字典中key对应的值,也可以使用dictionary.get(key)获取。但是,我们如果想要遍历字典中的键值对,就需要使用字典的items()或者iteritems()方法。 item…

    python 2023年5月13日
    00
  • Python2.7版os.path.isdir中文路径返回false的解决方法

    下面是详细的讲解以及示例说明。 问题背景 在Python2.7版本中,使用os.path.isdir()判断中文路径是否是一个目录的时候,会出现返回false的情况。 例如: import os path = u’/Users/你好/test’ print(os.path.isdir(path)) # 返回False 上述代码在Python 2.7中执行后输…

    python 2023年6月2日
    00
  • Python安装图文教程 Pycharm安装教程

    下面是Python安装和Pycharm安装的详细教程: Python安装教程 1. 下载Python安装包 访问Python官网 http://www.python.org/downloads/ ,选择适合你操作系统的Python安装包下载。一般来说,你应该下载最新的稳定版Python 3.x 版本。 2. 安装Python 双击下载的Python安装包,按…

    python 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部