Python 从GPS点绘制线

Python 从GPS点绘制线,python,matplotlib,plot,gps,Python,Matplotlib,Plot,Gps,我有大约100个gps坐标的列表,我想画出每个列表的界限 使用“散布”绘制的其中一个列表看起来有点像: 很明显,那里有一条线 我尝试了几种方法对gps位置进行排序并绘制它们: lats = [] lngs = [] with open(filename) as f: for line in f: lat, lng = line.split("\t") lats.append(float(lat)) lngs.append(float(ln

我有大约100个gps坐标的列表,我想画出每个列表的界限

使用“散布”绘制的其中一个列表看起来有点像:

很明显,那里有一条线

我尝试了几种方法对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()
按经度排序

按纬度排序

二者相加排序

如果直线在其中一个轴(纬度/经度)上基本上是直的,则绘制得很好(仍显示一些小凸起)

这里有一个列表可以很好地绘制,按纬度排序

我只想在两点之间的距离小于200~500米的情况下绘制,但由于缺少一些数据,我最终在直线上留下了洞

也许我做错了。有人知道如何正确地绘制这条线吗

编辑: 对于
rth
回答:

蓝线在这个问题上使用了他的方法,红线在他的问题上使用了这个方法

忽略红色正在关闭循环的事实

两者都有一些局限性,首先,红色的一个不能处理太多的点,我不得不使用1/90的点来处理,蓝色的一个在点太密集时会产生一些奇怪的急转弯(图像中的黑点),而红色的一个在这些地方会有一些奇怪的曲线。

我怀疑所有(不错但)奇怪的情节(第一个除外)是因为您试图对不允许按字母排序的内容进行排序

也没有理由单独绘制每条线段。请尝试仅执行以下操作:

plt.plot(lngs, lats, 'b')
这是我放置的一个示例轨迹:我没有正确缩放水平轴和垂直轴,因此绘图垂直拉长(太高)


这里最简单的方法是首先找出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
并使用
s
参数(请参见相关问题),

将每个坐标放置到一个数组中(lat,long)。 将所有坐标放置到另一个数组中 收藏(array1,array2,…arrayn)


对集合数组进行排序,然后进行绘图。

这就是我在示例中使用zip所做的。问题是对它进行排序。squareform、pdist和N是什么?gps位置有些混合,它们有一些额外的信息:时间戳和ID。数据来自我所在城市的公交服务,丢失数据的原因是公交车关闭了电源当他们完成一条路线,需要移动到一条新路线,或者加油,在停车场等待等等时,GPS。我能够使用该路线的一辆公交车绘制一些路线,但另一辆车的数据点太少,需要使用所有公交车的数据点,但当我将它们连接在一起时,我得到了这个混合声明。“N”未定义,但我假设它是len(xy_coord)它运行得很好。它比我的尝试要好得多。当点太密集时,它仍然有一些奇怪的转弯(例如,在停车场内或停车灯附近),但我稍后会尝试解决。@f.rodrigues对此表示抱歉。请参阅我上面的编辑,了解您可以对最终轨迹中的聚集点进行的可选平滑处理。酷,我检查了您的其他答案,我尝试了您的方法,但有一些限制,首先它无法处理许多点,我必须使用1/90的点,其次它生成一些奇怪的曲线,我将它们添加到问题中。@f.rodrigues是的,这是因为它试图重建一条闭合曲线。设置\per=0`将解决此问题。它可以处理任意多个点,否则会给您带来什么错误?这是一般的方法,可能需要进行一些更精细的调整才能获得您想要的结果nt。这是不可能的,因为数据是未排序的。请查看可以按键或值排序的位置。为什么不按时间戳排序?它们是混合的,因为有多个车辆执行相同的路线。
plt.plot(lngs, lats, 'b')
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)