从GPS点绘制线

时间:2015-07-16 14:11:48

标签: python matplotlib plot gps

我有大约100个gps坐标列表,我想绘制每个列表所做的行。

使用散点图绘制的列表之一,看起来有点像这样:

gps points

显然,那里有一条线;

我尝试了几种方法来对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]

Longitude Sort

按纬度排序

def sort_positions(position):
    return position[1]

Latitude Sort

通过对两者进行排序

def sort_positions(position):
    return position[0]+position[1]

Sommation Sort

如果该线在其中一个轴(纬度/经度)上大部分是直的,那么它就会很好(一些小的凸起仍在显示)

这里有一个精确绘制的列表,按纬度排序。

Latitude Sort 2

我只绘制两点之间的距离是否小于200~500米的情节,但我最终会在线上留下洞,因为有一些缺失的数据。

Distance

可能我做错了。有谁知道如何正确地绘制这条线?

编辑:

回复rth回答:

Two Approachs

蓝线在这个问题中使用了他的方法,红色的方法正在他的other answer中使用该方法。

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

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

3 个答案:

答案 0 :(得分:3)

这里最简单的方法是弄清楚为什么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]

你可以使用as,

 xy_coord = np.random.randn(10, 2)
 sorted_order, xy_coord_sorted = find_gps_sorted(xy_coord, k0=0)

enter image description here

虽然这可能需要延长。

例如,您可以说除了最近的距离标准之外,您不希望轨迹转向90°以上(如果那是对公交有意义的话)并且在每次迭代时忽略这些点。实际上,您可以在此算法中添加足够的约束以获得您要查找的结果。

编辑:由于GPS坐标有一些不确定性,最后一步可能是使用scipy.interpolate.splprep使用B样条插值平滑生成的轨迹并使用s参数进行播放(参见相关问题(1)(2)

答案 1 :(得分:0)

我怀疑所有(好但是)奇怪的情节(第一个除外)是因为你试图对不允许字母排序的东西进行排序。

没有理由分别绘制每个线段。尽量做到:

plt.plot(lngs, lats, 'b')

这是我放置的示例轨道:我没有正确地缩放水平轴和垂直轴,因此绘图垂直拉长(太高)。

enter image description here

答案 2 :(得分:-1)

将每个坐标放入一个数组(lat,long)。 将所有坐标放入另一个阵列     集合(array1,array2,... arrayn)

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