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

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 马氏距离求取函数详解

    以下是关于“Python马氏距离求取函数详解”的完整攻略: 简介 马氏距离是一种用于衡量多维数据之间相似度的方法,它考虑了数据之间的相关性,可以用于聚类、分类、降维等多种机器学习任务。在本教程中,我们将介绍如何使用Python实现马氏距离算法,并解析相关函数的实现方法和代码。 马氏距离的定义 马氏距离是一种用于衡量多维数据之间相似度的方法,它考虑了数据之间的…

    python 2023年5月14日
    00
  • python 正则表达式的使用

    Python正则表达式的使用攻略 正则表达式是一种强大的文本处理工具,可以用于匹配、查找、替换和割字符串。Python提供了re模块来处理正则表达式,本文将为您详细解Python正则表达式的语法、re模块的常用方法和两个示例说明。 正则表达式的语法 在正则表达式中,使用[]表示字符集,^表示取反,-表示范围,+表示匹配一个或多个字符,*表示匹配零个或多个字符…

    python 2023年5月14日
    00
  • Python 获取异常(Exception)信息的几种方法

    以下是关于 Python 获取异常信息的几种方法的详细攻略: 问题描述 在 Python 中,当程序出现异常时,我们需要获取异常信息以便于调试和修问题。本文将介绍 Python 中获取异常信息几种方法。 解决方法 以下是 Python 中获取异常信息的几种方法: 使用 try-except 语句捕获异常并打印异常信息。 可以使用 try-except 语句捕…

    python 2023年5月13日
    00
  • 解决python路径错误,运行.py文件,找不到路径的问题

    对于解决python路径错误,运行.py文件时找不到路径的问题,可按照以下攻略进行处理: 使用绝对路径或相对路径运行.py文件 如果我们在运行.py文件时,出现找不到路径的问题,我们可以尝试使用绝对路径或相对路径运行.py文件,来确保能够准确找到文件路径。具体的代码示例如下: 以绝对路径方式运行: python /Users/xxx/xxx/test.py …

    python 2023年6月2日
    00
  • python处理json文件的四个常用函数

    当我们需要处理 JSON 格式的数据时,Python 中提供了很多有用的函数。本文将介绍 Python 处理 JSON 文件的四个常用函数:load()、loads()、dump() 和 dumps()。 load() load() 函数可以将 JSON 文件加载为 Python 中的一个对象。对于大型的 JSON 文件,我们可以使用这个函数以避免将文件一次…

    python 2023年6月3日
    00
  • Python基础学习之反射机制详解

    Python基础学习之反射机制详解 1. 反射机制的概念 在Python中,反射机制指的是在运行时(runtime)动态地访问、检查、修改程序对象的能力。具体来说,可以通过字符串形式的对象名来访问对象的属性、方法,或者通过属性名、方法名来访问属性、方法。 2. 反射机制的应用 2.1 动态导入模块 Python中的import语句可以在程序运行时动态地导入模…

    python 2023年6月3日
    00
  • Python字符串的全排列算法实例详解

    Python字符串的全排列算法实例详解 在Python中,字符串的全排列算法是一种常见的算法,它可以用于字符串的排序、组合、查找等问题。本文将详细介绍Python字符串的全排列算法,包括递归实现和迭代实现两种方法。 1. 递归实现 递归实现是一种常用的字符串全排列算法,它的本思想是将分为两部分第一个字符和剩余字符。然后将第一个字符与剩余字符的全排列进行组合,…

    python 2023年5月14日
    00
  • python爬虫把url链接编码成gbk2312格式过程解析

    在Python中,可以使用urllib.parse模块将URL链接编码为GBK2312格式。以下是Python爬虫把URL链接编码成GBK2312格式的详细攻略: 编码URL链接 要编码URL链接,可以使用urllib.parse.quote()方法。以下是编码URL链接的示例: from urllib.parse import quote url = ‘h…

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