谷歌地点API返回重复的地点

6

我正在通过关键字在LatLngBounds数组中搜索地点。

    var boundsarr = new Array();

    boundsarr[0] = new google.maps.LatLngBounds(
        new google.maps.LatLng(25.941886953491675, -80.17411103748543),
        new google.maps.LatLng(25.947676224813897, -80.16767330177947)
    );
    boundsarr[1] = new google.maps.LatLngBounds(
        new google.maps.LatLng(25.941886953491675, -80.16767330177947),
        new google.maps.LatLng(25.94622890698334, -80.1644544339265)
    );
    boundsarr[2] = new google.maps.LatLngBounds(
        new google.maps.LatLng(25.927413775186118, -80.1644544339265),
        new google.maps.LatLng(25.94622890698334, -80.15962613214703)
    );
    boundsarr[3] = new google.maps.LatLngBounds(
        new google.maps.LatLng(25.927413775186118, -80.15962613214703),
        new google.maps.LatLng(25.931755728677782, -80.15801669822054)
    );
    boundsarr[4] = new google.maps.LatLngBounds(
        new google.maps.LatLng(25.927413775186118, -80.15801669822054),
        new google.maps.LatLng(25.933203046508336, -80.15318839644107)
    );
    boundsarr[5] = new google.maps.LatLngBounds(
        new google.maps.LatLng(25.92886109301667, -80.15318839644107),
        new google.maps.LatLng(25.933203046508336, -80.15157896251458)
    );

然后在地图上添加标记,加入数组并使用标记数组创建返回的地点列表。 列表中会出现重复条目,我无法弄清原因...例如:http:// jsfiddle.net / 2KrmY / 。 如何防止显示重复项? 非常感谢您的帮助!

抱歉,我刚才才意识到,你正在循环中调用nearbySearch,并为每个调用使用一个LatLngBounds。我没有机会检查它,但我认为这可能是问题所在。也许你的边界重叠了,或者可能是精度的问题? - Rafael Oltra
没问题。是的,我正在为每个边界进行附近搜索。我确定这与循环有关,但我一直在查看代码,无法弄清楚它们重叠的位置... - CyberJunkie
1
它并没有重叠在某个地方,重复是由于搜索boundsarr[1]而产生的。当你创建一个边界矩形时,你会发现返回的地点(Cafe Que Rico和Net Place Cafe Inc)并不在定义的边界内。因此,你可以称之为一个错误,我会称之为一个不准确的结果。 - Dr.Molle
@Dr.Molle 谢谢!您认为这是一个API的bug吗? - CyberJunkie
3个回答

3
作为临时解决方案,您可以在每次回调中建立一个找到的地点数组,然后在同一循环内查看该地点是否有计数大于1,如果是,则不要调用createMarker。不确定是否完美,但请参考以下内容:
var foundPlaces = [];
var found;

function callback(results, status) { 
  if (status === google.maps.places.PlacesServiceStatus.OK) {
    for (var i = 0; i < results.length; i++) {
      found = 0;
      foundPlaces.push(results[i].id);
      for (var j = 0; j < foundPlaces.length; j++) {
        if (foundPlaces[j] === results[i].id) {
          found++;
          console.log(foundPlaces[j], results[i].id);
        }
      }

      if (found < 2) {
        createMarker(results[i]);
      }
    }
  }
}

http://jsfiddle.net/2KrmY/15/


谢谢,如果无法避免请求本身的重复,这可能是唯一的解决方案。 - CyberJunkie
1
一种更简单的方法是使用 markersArray[i].getPosition().equals(marker.getPosition()) 比较现有标记和新标记的标记数组。 - CyberJunkie
1
最好使用哈希映射。这可能是最坏情况下的n^2或更大。foundPlaces可以是一个哈希而不是一个字典。 - Travis Delly
@TravisDelly 是的,这些现在在ES6中得到了支持 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map - Matt Rowles

3

bounds参数的描述如下:

在其中搜索地点的范围。如果设置了bounds,则位置和半径都将被忽略。

但是,在您的代码示例中,第二个bounds中有2个超出范围的结果进入了结果。

您可以使用以下方法显示边界区域:

new google.maps.Rectangle({
    strokeColor: 'red',
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: 'bulue',
    fillOpacity: 0.6,
    map: map,
    bounds: bounds
});

然后你就可以看到结果了。

查看演示

这可能是Google地图API的一个错误。


是的,这是非常奇怪的行为。当在循环中搜索多个边界时,我会得到重复项。 - CyberJunkie
@CyberJunkie 是的,结果再次落在您的第三个边界内。 - xdazz
你知道这个问题是否有解决方法吗? - CyberJunkie

1

在添加新边界之前,您需要进行检查,因为当您再次单击时,它会在同一位置生成新的标记。使用以下代码...

map.getBounds().contains(marker.getPosition())

请参阅旧帖子

这将在检查后返回truefalse,然后您可以呈现/添加标记。

我已经在fiddle中尝试过了,但仍然没有成功...因为它是JASON语法,而JavaScript需要特定函数来处理用户定义的数据类型...我正在尝试创建自定义函数以消除重复的JSON对象...

一旦准备好更新的fiddle,我会及时通知您,但在此期间,您可以自行尝试。

希望这样做就可以了。


谢谢,确实每次请求时标记都在相同的边界上创建,但问题是重复的标记会在其边界之外创建(在另一个边界内)。 - CyberJunkie
您可以通过将每个标记存储在数组中并在创建新标记时检查其是否存在来检查标记是否已经在地图上。Matt在https://dev59.com/0nPYa4cB1Zd3GeqPhlUe#17139868上发布了一个示例。 - CyberJunkie
是的,我试过了,但由于标记是使用JSON表示法创建的,在将其推入数组之前无法进行比较...我正在处理这个问题,但马特解决了你的问题,所以没事了 :) 虽然我们可以通过比较来改进它...在这里,马特检查数组中的标记是否超过2个,如果超过2个,则不再检查...所以这是基于计数的工作.. :) - MarmiK
你可以在将地图对象“map: map”从JSON符号中移除之前进行检查,然后进行比较/推入数组,最后使用“marker.setMap(map);”将标记放置在地图上。 - CyberJunkie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接