在matplotlibbasemap中有没有从GPS点绘制航向(360)的功能?

问题描述 投票:0回答:1

我需要绘制一艘船在海洋中的水下图。我有GPS数据和航向数据。数据集在pandas数据框中。我想把车辆的航向绘制成一个从GPS主线出来的箭头。

enter image description here

这张图是我的GPS航向。我想在basemap中做这件事,但我似乎甚至不知道如何做到这一点是matplotlib。下面我有一个例子,我的代码。

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
import math
from mpl_toolkits.basemap import Basemap



data = pd.read_csv('dataset')
style.use('seaborn')

data['pd_datetime'] = pd.to_datetime(data['time (UTC)'])
       # convert current date format into pandas date time format 

gpsdata = data.loc[:, ['m_gps_lon (DDMM.MMMM)', 'm_gps_lat (DDMM.MMMM)']] #from my data set
gpsdata = gpsdata.dropna() 
plt.plot(gpsdata['m_gps_lon (DDMM.MMMM)'], gpsdata['m_gps_lat (DDMM.MMMM)'], '-.')
plt.title('GPS')
plt.xlabel('lon')
plt.ylabel('lat')
plt.show()

place = 'some area'
c = {'llclon': -55, 'llclat': 55, 'urclon': 55, 'urclat': 55}
map = Basemap(
    llcrnrlon= c['llclon'], llcrnrlat= c['llclat'],
    urcrnrlon= c['urclon'], urcrnrlat= c['urclat'], 
    resolution='l')
    #projections: cyl=cylindrical equidistant projection, ortho=orthographic
map.drawcoastlines()

plt.plot(gpsdata['m_gps_lon (DDMM.MMMM)'], gpsdata['m_gps_lat (DDMM.MMMM)'], '-.')
plt.plot(data['pd_datetime'], np.rad2deg(data['m_heading (rad)']), '.', color='red') #i thought this would at least plot a point. but it doesnt do anything. all headings are in compass headings. not nessisarily pointing in the direction of the track
plt.show()
plt.show()

任何帮助将是非常感激

python matplotlib gps matplotlib-basemap
1个回答
0
投票

所以,这似乎是工作。我使用一个数学函数来发布一个新的位置,使用标题和一个任意的距离,只是为了可视化的标题。

import numpy as np
import pandas as pd

dec = np.deg2rad(22.74)         #NOAA declination correction for area 
R = 6378.1                      #Radius of the Earth
brng = np.deg2rad(320) - dec    #bearing needs to be in rad 
d = 1                           #Distance in km, this didn't matter to me. 1 km is arbitrary, but it could matter to you. 

### c_heading
heading_lat1 = np.deg2rad(pandas_df['dataframe header latitude (DD.DDDD)'])
heading_lon1 = np.deg2rad(pandas_df['dataframe header longitude (DD.DDDD)'])

heading_lat2 = np.arcsin(np.sin(heading_lat1)*np.cos(d/R) + np.cos(heading_lat1)*np.sin(d/R)*np.cos(brng)) 
heading_lon2 = heading_lon1 + np.arctan2(np.sin(brng)*np.sin(d/R)*np.cos(heading_lat1), 
        np.cos(d/R) - np.sin(heading_lat1)*np.sin(heading_lat2))

heading_lat2 = np.rad2deg(heading_lat2)
heading_lon2 = np.rad2deg(heading_lon2)

请注意,我使用的是一个 pandas dataframe,这将与 import math 和数学函数。但从我目前的经验来看,数学并不能很好地与pandas的dataframe玩耍

希望能帮助到大家

© www.soinside.com 2019 - 2024. All rights reserved.