对大坐标列表调用Mapbox距离API的最有效方法

2024-09-29 01:28:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在地图上找到许多地方之间的所有距离。为此,我使用Mapbox's Distance API,它接受最多100个坐标对的列表,并返回它们之间的距离矩阵。 所以如果你给它:

{
  "coordinates": [
    [13.41894, 52.50055],
    [14.10293, 52.50055],
    [13.50116, 53.10293]
  ]
}

它将返回如下矩阵:

^{pr2}$

所以,因为我不能发送所有6000个位置的请求,所以我必须分段进行。经过几次尝试,我想出了一个解决方案:

  1. 首先得到一组from/to对的所有可能的排列
  2. 然后得到上述集合大小为100的随机抽样子集的所有置换
  3. 从较大的集合中减去较小的集合,并将结果插入步骤1
  4. 继续,直到步骤3中的结果集为空。在

下面是Python中的工作玩具代码(没有实际的API调用,位置用数字表示):

import itertools
import random

def get_set(s, rsample_size):
    m_set = set([x[0] for x in s] + [x[1] for x in s])
    if len(m_set) < rsample_size:
        rsample_size = len(m_set)
    sampled = random.sample(set(m_set), rsample_size) #sampling
    return sampled, rsample_size

#all place features, but just numbers here
master = set(range(500))
#all possible permutations between them
master_combinations = set(itertools.permutations(master, 2))
print 'len of original combinations list', len(master_combinations)

c = 0
#API call limit
smpl_size = 100
while len(master_combinations) > 0:
    print 'start iter: ', c, '\t remaining combinations: ', len(master_combinations)
    #sampling 100 random locations
    combs, smpl_size = get_set(master_combinations, smpl_size)
    #a set of all possible permutations of above 100
    combs = set(itertools.permutations(combs, 2))
    #subtracting calculated pairs from all possible pairs
    master_combinations = master_combinations.difference(combs)
    c += 1

上面的例子在132-140个调用中查找所有可能的500个元素对之间的距离。我有两个问题:

  1. 随机抽样似乎是一种非常不精确的方法来确定要发送给API的位置列表,有许多重复的结果,尽管它在每种情况下都会收敛
  2. 在Python中,从一个非常大的(1000万个元组)中减去一个大的(一百万个元组)会导致一个具有16gbram的Windows计算机上的内存错误,尽管这不是主要问题。我可能可以将原始列表分成许多更小的部分,并应用更复杂的方法。在

我的问题是,既然我显然是粗暴地逼迫我通过这个列表,那么是否有一个更优雅和更有效的方法来解决这个问题?在

我在想也许:

  • 首先用所有的位置组合构造一个6000 x 6000 numpy阵列,然后用60步和一系列偏移量对其进行二次采样,以产生初始距离
  • 找出剩下的,然后再使用前面提到的浪费方法。在

任何想法都将不胜感激。谢谢!在


Tags: 方法masterapi距离列表sizelenrandom