我有大约100个gps坐标列表,我想绘制每个列表所做的行.
使用scatter绘制的列表之一,看起来有点像这样:
显然那里有一条线;
我尝试了几种方法来对gps位置进行排序并绘制它们:
lats = []
lngs = []
with open(filename) as f:
for line in f:
lat, lng = line.split("\t")
lats.append(float(lat))
lngs.append(float(lng))
def sort_positions(position):
return position[0]+position[1]
positions= zip(lngs, lats)
positions = sorted(poss, key=sort_positions)
for i, positionin enumerate(positions):
lng, lat = position
#plt.scatter(lng, lat)
try:
n_lng, n_lat = positions[i+1]
plt.plot((lng, n_lng),(lat, n_lat), "b")
except IndexError:
pass
plt.show()
按经度排序
def sort_positions(position):
return position[0]
按纬度排序
def sort_positions(position):
return position[1]
通过总结两者进行排序
def sort_positions(position):
return position[0]+position[1]
如果该线在其中一个轴(纬度/经度)上大部分是直的,那么它会很好(一些小的凸起仍在显示)
这是一个精确绘制的列表之一,按纬度排序.
我只绘制两点之间的距离是否小于200~500米的情节,但我最终会在线上留下洞,因为有一些缺失的数据.
可能我做错了.有谁知道如何正确绘制这条线?
编辑:
回答rth回答:
蓝线在这个问题中使用了他的方法,红色的方法在他的other answer中使用了这个方法.
忽略红色正在关闭循环的事实.
两者都有一些限制,首先,红色不能处理太多的点,我不得不使用两个点的1/90,当点太集中时蓝色的一个产生一些奇怪的急转弯(图像中的黑点),而红色的那些地方有些奇怪的曲线.
最佳答案 这里最简单的方法是弄清楚为什么GPS坐标首先混淆并纠正.
如果这是不可能的,我唯一能想到的是迭代算法,它采用xy点并根据某些标准(例如距离,连续点的方向等)决定哪个点应该接下来.
沿着这些方向,
import numpy as np
from scipy.spatial.distance import pdist, squareform
def find_gps_sorted(xy_coord, k0=0):
"""Find iteratively a continuous path from the given points xy_coord,
starting by the point indexes by k0 """
N = len(xy_coord)
distance_matrix = squareform(pdist(xy_coord, metric='euclidean'))
mask = np.ones(N, dtype='bool')
sorted_order = np.zeros(N, dtype=np.int)
indices = np.arange(N)
i = 0
k = k0
while True:
sorted_order[i] = k
mask[k] = False
dist_k = distance_matrix[k][mask]
indices_k = indices[mask]
if not len(indices_k):
break
# find next unused closest point
k = indices_k[np.argmin(dist_k)]
# you could also add some criterion here on the direction between consecutive points etc.
i += 1
return sorted_order, xy_coord[sorted_order]
你可以用作,
xy_coord = np.random.randn(10, 2)
sorted_order, xy_coord_sorted = find_gps_sorted(xy_coord, k0=0)
虽然这可能需要延长.
例如,您可以说除了最近的距离标准之外,您不希望轨迹转向90°以上(如果那是对公交有意义的话)并且在每次迭代时忽略这些点.实质上,您可以在此算法中添加足够的约束以获得您要查找的结果.
编辑:由于GPS坐标有一些不确定性,最后一步可能是使用scipy.interpolate.splprep使用B样条插值平滑生成的轨迹并使用s参数进行播放(参见相关问题(1),(2))