为什么搜索结果不限于边界框?

时间:2013-12-15 22:01:10

标签: here-api

我正在尝试在指定的矩形区域内进行简单的位置搜索。我的假设是findPlaces()方法的boundingBox参数是将搜索结果限制为指定的矩形区域。但是当我使用指定的boundingBox进行搜索时,我会在整个地图上获得结果。

这基本上就是我在做的事情:

//create coordinates
var mapCenter = map.center;
var topLeft = new nokia.maps.geo.Coordinate(mapCenter.latitude + .005, mapCenter.longitude - .01);
var bottomRight = new nokia.maps.geo.Coordinate(mapCenter.latitude - .005, mapCenter.longitude + .01);

//create bounding box
var bBox = new nokia.maps.geo.BoundingBox(topLeft, bottomRight);

//create rectangle
var searchRectangle = new nokia.maps.map.Rectangle(bBox);
map.objects.add(searchRectangle);

//do the search
nokia.places.search.manager.findPlaces({
searchTerm: "Starbucks",
onComplete: processResults,
boundingBox: bBox
});

很遗憾,我无法发布任何图片。但基本上我得到的是地图中心的矩形和内部的许多标记,但也在矩形之外。那是为什么?

编辑:我注意到当我输入像“食物”而不是“星巴克”(其中“食物”显然得到更多结果)的搜索词时,大多数结果实际上都在矩形内。但仍有一些不是。在尝试使用不同的术语后,看起来搜索管理器总是尝试返回20个结果。它只是开始寻找矩形内的位置,但是当它找不到更多的结果时,它也会向外看,直到它找到20.这是正确的吗?如果是,我怎样才能让它只在矩形内搜索?

1 个答案:

答案 0 :(得分:0)

Maps API JavaScript的“地方”部分仅仅是RESTful Places API的包装。您传递到findPlaces()方法的区域边框是设置位置上下文 - 它不会结果限制为某个位置或区域,而只是<强烈的>偏见对它的结果。 Places API的文档更好地描述了这一点,并更详细地使用了location context

对于您所描述的自由文本搜索,在搜索结果的所需区域与搜索匹配的距离之间进行模糊搜索需要权衡你输入的词。有时匹配将赢得该区域。

你有几种方法可以解决这个问题。

  • 首先,您可以使用findPlacesByCategory()方法。在您搜索“food”的示例中,对eat-drink的类别搜索会产生更好的结果(并且还会避免出现“food”的不同单词的问题用英语以外的语言。

  • 其次,您可以过滤您检索到的回复,并仅在首选区域内显示匹配项

示例如下所示:

function onPlaceSearchComplete (data, requestStatus, requestId) {
    if (requestStatus == "OK") {
        // Convert all found locations with view port into a set of markers
        var resultSet = new nokia.maps.map.Container();
        var locations = data.results.items;
        for (i = 0, len = locations.length; i < len; i++) {
            var bbox = nokia.maps.geo.BoundingBox.coverAll([locations[i].position]);
            if(map.getViewBounds().contains(bbox)){
                marker = new nokia.maps.map.StandardMarker(locations[i].position, { text: i+1 });
                resultSet.objects.add(marker);
            }
        }

        map.objects.add(resultSet);
        map.zoomTo(resultSet.getBoundingBox(), false);
    } 
}
  • 第三,您在列表中显示全部结果,但只有zoomTo()会产生首选区域,首先将结果过滤为Container,然后允许用户决定他们真正意味着什么:

类似的东西:

var resultSet = new nokia.maps.map.Container();
for (i = 0, len = locations.length; i < len; i++) {
    var bbox = nokia.maps.geo.BoundingBox.coverAll([locations[i].position]);
    marker = new nokia.maps.map.StandardMarker(locations[i].position, { text: i+1 });
    if(map.getViewBounds().contains(bbox)){
        resultSet.objects.add(marker); // Add to container
    } else {
        map.objects.add(marker); // Add to map only.
    }
}

map.objects.add(resultSet);
map.zoomTo(resultSet.getBoundingBox(), false);