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中,类型转换函数是将一个数据类型转换为另一个数据类型的函数。Python提供了几个内置的类型转换函数,包括int()、float()、str()、bool()等。下面我们将详细介绍这些类型转换函数。 int() int()函数用于将一个字符串或浮点数转换为整数…

    python 2023年5月13日
    00
  • Android使用美团多渠道打包方案详解

    Android使用美团多渠道打包方案详解 简介 在Android开发中,需要为不同渠道(例如应用宝、小米商店等)打不同的包,以适应不同的需求。但是这样做可能会造成开发过程和发布过程的混乱,因此需要一个可扩展的打包方案来解决这个问题。美团的多渠道打包方案就是这样一个解决方案。 方案概述 美团的多渠道打包方案基于gradle实现,可以通过gradle插件将一份代…

    python 2023年6月3日
    00
  • python删除文件示例分享

    下面是详细的python删除文件示例分享攻略。 概述 在开发的时候,有时候需要删除一些无用的文件,本文将分享python删除文件的几种方法,适用于不同场景。 方法一:使用os模块的remove()函数 os模块是python文件和目录处理的核心模块,其中包含了删除文件的函数remove()。其使用方法如下: import os os.remove(&quot…

    python 2023年6月2日
    00
  • python playwright 自动等待和断言详解

    Python Playwright 自动等待和断言详解 Python Playwright 是一个用于自动化测试的 Python 库,它可以对 web 程序进行操作及断言,同时它还内置了自动等待能力,可以有效地避免因为页面异步处理或延迟加载导致的时间差问题。 自动等待 在爬取网页或进行自动化测试时,通常会出现下面的情况: 页面可能正在进行异步处理或延迟加载,…

    python 2023年5月19日
    00
  • Python实现备份文件实例

    Python实现备份文件实例 在实际的工作中,我们需要将数据进行备份,以防数据丢失或损坏。Python作为一门高效、灵活的编程语言,可以帮助我们简单、快捷地实现文件备份。 实现思路 文件备份的实现思路非常简单,通俗易懂。我们只需要按照以下步骤来实现即可: 找到需要备份的文件。 将文件复制到备份文件夹中。 完成备份。 在Python中,我们可以使用os模块来完…

    python 2023年6月3日
    00
  • python实现批量图片格式转换

    下面是“Python实现批量图片格式转换”的完整攻略。 1. 确定目标 首先,我们需要确认需要实现的功能:批量图片格式转换。这意味着,我们将使用Python编写一个脚本程序来自动将指定目录中的一些或所有图像文件转换为另一种图像格式。 2. 安装必要的库 在开始编写Python脚本之前,需要确保已经安装了Python Imaging Library(PIL)或…

    python 2023年5月19日
    00
  • 如何使用Python在MySQL中使用分组查询?

    在MySQL中,分组查询是一种将数据分组并对每个组执行聚合函数的查询。在Python中,可以使用MySQL连接来执行分组查询。以下是在Python中分组查询的完整攻略,包分组查询的基本语法、使用分组查询的示例以及如何在Python中使用分组查询。 分组查询的基本语法 分组查询的基本语法如下: SELECT column_name(s) FROM table_…

    python 2023年5月12日
    00
  • python3线程池ThreadPoolExecutor处理csv文件数据

    让我为您详细讲解如何使用Python 3的线程池ThreadPoolExecutor处理CSV文件数据。 1. 线程池ThreadPoolExecutor简介 ThreadPoolExecutor是Python 3中的一个内置模块,它提供了可以自动管理线程的池。线程池的主要好处是可以限制和管理系统中的线程数量,避免过多线程导致系统资源耗尽的问题。在处理大量数…

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