获取谷歌地图搜索结果的大小/面积

Posted

技术标签:

【中文标题】获取谷歌地图搜索结果的大小/面积【英文标题】:Get size/area of google maps search result 【发布时间】:2013-10-01 10:42:03 【问题描述】:

我正在开发一个业务目录网站,其搜索将由 Google 地图驱动。用户将能够根据各种标准搜索他们所在地区的企业,但主要的想法是,如果您搜索例如“新泽西州的管道工”,您将获得新泽西州所有管道工的结果。但是,如果您搜索“泽西海岸的管道工”,您应该只得到在泽西海岸工作的管道工,在本示例中,这将是新泽西州的郊区或其他类型的细分。顺便说一句,我去掉了“管道工”,只传递了实际的地理搜索词,所以我实际的谷歌地图搜索只有“新泽西”或“泽西海岸”。所以不要关注实际的搜索文本本身。

这是我的搜索 sn-p:

var latlng = results[0].geometry.location;//results is google maps search result for address
console.log(results[0]);
map.setCenter(latlng.lat(), latlng.lng());
map.addMarker(
    lat: latlng.lat(),
    lng: latlng.lng(),
    icon: 'https://maps.google.com/mapfiles/kml/shapes/schools_maps.png'
);

var closestmarkers = [];
var MAXDISTANCE = 5;//radius of our search area in km
closestmarkers = find_n_closest_markers(latlng, n, MAXDISTANCE);//see below snippet for function definition

这是找出最接近搜索的标记的 javascript

function find_n_closest_markers(latlng, n, MAXDISTANCE)
    var lat = latlng.lat();
    var lng = latlng.lng();
    var R = 6371; // radius of earth in km
    var distances = [];
    var closest = -1;
    for (i = 0; i < map.markers.length; i++) 
        var mlat = map.markers[i].position.lat();
        var mlng = map.markers[i].position.lng();
        var dLat = rad(mlat - lat);
        var dLong = rad(mlng - lng);
        var a = Math.sin(dLat / 2)
              * Math.sin(dLat / 2)
              + Math.cos(rad(lat))
              * Math.cos(rad(lat))
              * Math.sin(dLong / 2)
              * Math.sin(dLong / 2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        var d = R * c;

        distances[i] =  distance: d, index: i ;
    
    distances.sort(comparedistances);

    //remove all distances greater than MAXDISTANCE
    toofarindex = -1;
    for (j = 0; j < distances.length; j++)
    
        if(distances[j].distance >= MAXDISTANCE)
        
            toofarindex = j;
            break;
        
    

    if (toofarindex != -1)
    
        distances = distances.splice(0, toofarindex - 1);
    

    //return first n + 1 items(the closest marker is the one indicating the user's current/preferred location. which doesn't count)
    if (distances.length > n + 1)
    
        distances = distances.splice(0, n + 1);
    
    return distances;

我不关心实际功能。这100%有效。我正在寻找的是如何根据搜索词找出 MAXDISTANCE 的值应该是什么。 5 现在只是一个很好的折衷常数,但我需要知道新泽西是例如直径 20 英里,而泽西海岸只有 5 英里(这些数字直接来自我的耳朵,而不是实际地图)。

【问题讨论】:

【参考方案1】:

geocoder 还返回结果的视口和边界。如果您需要直径,您可以将其中一个转换为距离(边界的宽度或高度将为您提供直径,如果不使用该边界来限制您的搜索。

【讨论】:

这听起来很有希望。 这一切都是正确的,但不提供拒绝预期区域之外的任何无关结果(由于基于地址的搜索的变幻莫测),这可能是 OP 的“腰带” -and-braces”的方法旨在实现。 其实,差不多。如果我知道该区域的中心和边界是什么,我可以计算 MAXDISTANCE,因此我可以过滤掉该半径之外的结果。除非我不理解你的反对意见? 胡安,是的,你可以过滤掉圆外的任何东西,但我的意思是,通过使用返回结果集的边界来计算圆的半径,你并没有真正过滤掉任何东西(也许是几个边缘案例)。使用独立派生半径来过滤掉任何严重不适当的结果(例如泽西岛、海峡群岛的管道工)会更有意义。不要问我怎么做,我只是说...... 我建议他使用地理编码器返回的视口/边界直接或转换为直径来确定他的标记中的哪些在感兴趣的区域中。跨度>

以上是关于获取谷歌地图搜索结果的大小/面积的主要内容,如果未能解决你的问题,请参考以下文章

从谷歌地图API位置搜索框的示例中获取坐标? [重复]

谷歌地图嵌入搜索不显示结果?

如何在谷歌地图上显示搜索地址。?

如何将ajax结果传递给谷歌地图

谷歌地图距离矩阵API提供不可能短的duration_in_traffic结果,结果也不同于谷歌地图

从谷歌地图的地理位置获取邮政编码