如何在 Matplotlib 中绘制给定 2 个点(纬度和经度)的有向线段(矢量)
How to plot a directed line segment (vector) given 2 points (Latitude and longitude) in Matplotlib
假设我们从一个 Python 列表开始,例如:
list=[[-3.7025753,40.417016,-3.7062202, 40.4285271, 20], [5.7023456,40.221567,3.67823, 41.27236, 10]]
其中:
- 第一个元素是A点的经度(例如列表的第一个元素:-3.7025753)
- 第二个元素是A点的纬度(例如列表的第一个元素:40.417016)
- 第三个元素是B点的经度(例如列表的第一个元素:-3.7062202)
- 第四个元素是B点的经度(例如列表的第一个元素:40.4285271)
- 第五个元素是量级(例如,列表的第一个元素:20)
我试图在 Matplotlib 中获得的是类似于以下的图:
总结:
- 用 plot(x, y) 画点很清楚
- Matplotlib 的 Text 函数也可以清楚地绘制标签
- 我要问的关键问题是:
- 3.1 如何在原点绘制一条“定向”到目标点或命运点的线?
根据第一个回答要使用的函数应该是:
matplotlib.pyplot.arrow(x, y, dx, dy, **kwargs)
重点是,除了 de x 和 y 原始坐标外,此函数还接收增量 dx 和 dy。在我的问题中,B 点为我提供了向量的方向,并且大小需要与其大小成正比。所以主要问题是 我如何将数据从 (latitude_origin, longitude_origin, latitude_destiny, longitude_destiny, magnitude) 转换为 (x, y, dx ,dy)?。明白了x,y是从经纬度原点直接变换过来的,但是dx和dy呢?
终于找到了解决办法:
第 1 步:计算形成连接起点和终点线的坡度角。使用此自定义函数:
import math
def CalcPendAng (lon1, lat1, lon2,lat2):
if (lon2-lon1)==0:
ang_grad=0 división por 0
else:
m=(lat2-lat1) / (lon2-lon1)
ang_rad=math.atan(m)
ang_grad=ang_rad* 180 / 3.14159265
return ang_grad
步骤 2 计算连接起点和终点的 sme 线上的命运点,但与我们想要的向量的起点点 = 模数有一定距离:
def CalcLatLonDest (lon1, lat1,modulo, angulo_grad):
factor_corrector= 0.0001
lon2= lon1 + (modulo* math.cos(angulo_grad))
lat2= lat1 + (modulo* math.sin(angulo_grad))
return lon2, lat2
假设我们从一个 Python 列表开始,例如:
list=[[-3.7025753,40.417016,-3.7062202, 40.4285271, 20], [5.7023456,40.221567,3.67823, 41.27236, 10]]
其中:
- 第一个元素是A点的经度(例如列表的第一个元素:-3.7025753)
- 第二个元素是A点的纬度(例如列表的第一个元素:40.417016)
- 第三个元素是B点的经度(例如列表的第一个元素:-3.7062202)
- 第四个元素是B点的经度(例如列表的第一个元素:40.4285271)
- 第五个元素是量级(例如,列表的第一个元素:20)
我试图在 Matplotlib 中获得的是类似于以下的图:
总结:
- 用 plot(x, y) 画点很清楚
- Matplotlib 的 Text 函数也可以清楚地绘制标签
- 我要问的关键问题是:
- 3.1 如何在原点绘制一条“定向”到目标点或命运点的线?
根据第一个回答要使用的函数应该是:
matplotlib.pyplot.arrow(x, y, dx, dy, **kwargs)
重点是,除了 de x 和 y 原始坐标外,此函数还接收增量 dx 和 dy。在我的问题中,B 点为我提供了向量的方向,并且大小需要与其大小成正比。所以主要问题是 我如何将数据从 (latitude_origin, longitude_origin, latitude_destiny, longitude_destiny, magnitude) 转换为 (x, y, dx ,dy)?。明白了x,y是从经纬度原点直接变换过来的,但是dx和dy呢?
终于找到了解决办法:
第 1 步:计算形成连接起点和终点线的坡度角。使用此自定义函数:
import math
def CalcPendAng (lon1, lat1, lon2,lat2):
if (lon2-lon1)==0:
ang_grad=0 división por 0
else:
m=(lat2-lat1) / (lon2-lon1)
ang_rad=math.atan(m)
ang_grad=ang_rad* 180 / 3.14159265
return ang_grad
步骤 2 计算连接起点和终点的 sme 线上的命运点,但与我们想要的向量的起点点 = 模数有一定距离:
def CalcLatLonDest (lon1, lat1,modulo, angulo_grad):
factor_corrector= 0.0001
lon2= lon1 + (modulo* math.cos(angulo_grad))
lat2= lat1 + (modulo* math.sin(angulo_grad))
return lon2, lat2