php - 一种克服距离矩阵 API 带来的元素限制的算法

标签 php algorithm google-maps-api-3 google-distancematrix-api distance-matrix

首先,我进行了 StackOverflow 搜索,所以我知道这是新的。请继续阅读:

所以我有一个包含 9 个位置的字符串数组,需要找出它们之间的距离以输入到算法中。我使用了谷歌的距离矩阵 API 并将这些地方作为起点和终点传递,它返回一个响应,我制作了一个 n x n 方阵,如下所示:

0  3201  4584  4821  1628  1218  1786  4738  4897
3122  0  1400  1638  1797  2756  3323  5310  5472
4523  1400  0  237 3198  4156  4723  6711  6872
4760  1638  237 0  3435  4394  4961  6948  7110
1324  1846  3247  3485  0  958 1525  3931  4093
932 2854  4273  4510  1002  0  567 4873  5034
1499  3422  4840  5078  1569  567 0  5440  5602
5061  5359  6760  6998  4019  4959  5526  0  161
5233  5531  6931  7169  4190  5130  5697  171 0

在此,行向和列向都是地名,即相同顺序的相同位置数组,这就是为什么对角线元素为零(尽管实际上谷歌的响应由于某种原因并不总是 0 ) 因为从它自己去一个地方应该是 0。

现在的问题是,Google 距离矩阵 API 对每个请求有 25 个元素的限制,其中起点和终点的总和不应超过 25。因此,由于我使用相同的起点和终点,这最多将其分解为 12 个元素。但是我正在构建的应用程序需要计算超过 12 个地方,所以我在考虑一个解决方法。

一个想法是使用这种逻辑(它不是真正的代码,我写它只是为了展示算法/伪代码):

if(count(places) > 12) {
   distanceMatrix = []
   for(place in placesArray) {
      distanceMatrix[] = apiCall->(place, placesArray); // apiCall(origin, dest)
   }
} else {
   response = apiCall->(placesArray, placesArray); // apiCall(origin, dest)
   distancesMatrix = convertResponseToDistancesMatrix(response)
}

所以基本上在这种情况下,如果地点数超过 12 个地点,它会取而代之的是一个 for 循环,它将一个地点作为起点,所有地点作为目的地。这样我就可以将限制从 12 -> 25 移动,因为它计算 1 个起点和 24 个目的地。问题是仍然超过 24,它就无法工作。那么有没有其他方法可以克服这个问题呢?我知道必须有一些方法可以让我发出多个请求并填充矩阵,我想知道如何做,因为我想不出算法。

最佳答案

我不确定您执行此操作的频率,但请注意,随着元素数量的增加,这可能会很快加起来。来自 their site :

“起始点的数量乘以目的地的数量等于元素的数量。”,元素的起始价格为 $.01/每个。因此,如果您要处理 25 个起点和 25 个目的地,那么 625 个元素需要 6.25 美元。对于 100,它将是 100 美元。对于 200,它将是 400 美元。对于 1000,这将是 10,000 美元。

如果您仍想继续,这里有一些伪代码可以告诉您如何执行此操作(假设包括 apiCall 在内的所有内容都是同步的,并且结果在二维数组中):

/**
 * @param locations Array of locations you want to consider
 */
var queryDistances = function(locations) {
    var locationDistances = [];
    var placesToConsiderAtOnce = 12;

    //Get the location groups to consider
    var locationGroups;
    for(var i = 0; i < locations.length; i++){
        var locationArraysIndex = Math.floor(i / placesToConsiderAtOnce);
        locationGroups[locationArraysIndex] = locationGroups[locationArraysIndex] || [];
        locationGroups[locationArraysIndex].push(locations[i]);
    }

    //Process all combinations of the location groups
    for(var i = 0; i < locationGroups.length; i++){
        for(var j = 0; j < locationGroups.length; j++){
            var originArray = locationGroups[i];
            var destinationArray = locationGroups[j];
            var results = apiCall(originArray, destinationArray);

            for(var k = 0; k < originArray.length; k++){
                for(var l = 0; l < destinationArray.length; l++){
                    var locationDistancesFirstIndex = k + i * placesToConsiderAtOnce;
                    var locationDistancesSecondIndex = l + j * placesToConsiderAtOnce;

                    locationDistances[locationDistancesFirstIndex] = locationDistances[locationDistancesFirstIndex] || [];
                    locationDistances[locationDistancesSecondIndex] = results[k][l];
                }
            }
        }
    }

    return locationDistances;
};

关于php - 一种克服距离矩阵 API 带来的元素限制的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52969366/

相关文章:

php - 如何向下舍入到php中最接近的有效数字

google-maps-api-3 - Google Maps v3 data.feature是否可编辑?

php - 刷新页面之前等待 UPDATE 完成

php - 通知 : A non well formed numeric value encountered

php - MongoDB/PHP 不喜欢俄语字符

c# - 如何获得子集的所有可能组合?

algorithm - 图像稳定/对齐算法

javascript - 在谷歌地图中平铺连续的多边形

javascript - 谷歌地图 带有多个标记的多个 map

php - 如何在 Windows 7 + PHP 5.6.1 上安装 memcached