【问题标题】:Google Maps draw circle around radius search谷歌地图围绕半径搜索绘制圆圈
【发布时间】:2013-07-28 16:07:19
【问题描述】:

我正在画一个半径大小的圆,在该圆上执行附近搜索:

  // Point where to search  
  var searchArea = new google.maps.LatLng(25.435833800555567, -80.44189453125);

  // Draw a circle around the radius
  var circle = new google.maps.Circle({
    center: searchArea,
    radius: parseFloat(document.getElementById("distance").value) * 1609.3, //convert miles to meters
    strokeColor: "#0000FF",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#0000FF",
    fillOpacity: 0.4
   });          
   circle.setMap(map);  

   // Perform search over radius
   var request = {
        location: searchArea,
        radius: parseFloat(document.getElementById("distance").value) * 1609.3, //convert miles to meters
        keyword: "coffee",
        rankBy: google.maps.places.RankBy.PROMINENCE
      };
      service.nearbySearch(request, callback);         
    }

然后我绘制标记。这很好用,但在某些情况下,标记显示在圆圈之外,让我相信它的大小可能与半径不同。

这是我的意思的一个很好的例子。

http://jsfiddle.net/hnPRh/2/

注意标记是如何显示在圆圈之外的。为什么会这样?

【问题讨论】:

    标签: javascript google-maps-api-3 geolocation google-places-api


    【解决方案1】:

    我会这样做的方法是计算到中心点的距离。我已将您的半径设置为一个名为 RADIUS 的变量,请确保将其放置在文档加载后执行的位置。

    我还修改了您的 for 循环以包括距离检查。 distance 函数接受两个类型为 google.maps.LatLng 的参数

    var EARTH_RADIUS = 6378137; // meters
    var RADIUS = (parseFloat(document.getElementById("distance").value) * 1609.3);
    
    function deg2rad(deg) {
        return deg * (Math.PI / 180);
    }
    
    function distance(pos1, pos2) {
        var p1Lat = pos1.lat(),
            p1Lng = pos1.lng(),
            p2Lat = pos2.lat(),
            p2Lng = pos2.lng(),
    
            dLat = deg2rad(p1Lat-p2Lat),
            dLon = deg2rad(p1Lng-p2Lng),
    
            a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(deg2rad(p1Lat)) * Math.cos(deg2rad(p2Lat));
    
        return EARTH_RADIUS * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)));
    }
    
    
    
    for (var i = 0; i < results.length; i++) {
        if (distance(results[i].geometry.location, searchArea) <= RADIUS) {
            createMarker(results[i]);
        }
    }
    

    【讨论】:

    • 哇,数学题真多。半径搜索请求不是已经处理到中心点的距离了吗?我只是想画一个圆圈来代表我正在搜索的半径。
    • 哈哈,这是 haversine 论坛,老实说,我对数学一无所知,但我几乎每天都在我的代码中使用这个函数。我不确定搜索是如何工作的,但根据我在您的示例页面中看到的内容,它可能会根据 latlng 边界获取结果,这是一个正方形,而不是一个圆形。
    • 半径搜索使用一个纬度点并在其周围创建一个以米为单位的半径。出于这个原因,可能不需要公式,因为 API 会进行所有计算。在我的情况下,即使我为半径和相同的纬度输入相同的米数,我为代表半径而绘制的圆似乎与半径本身的大小不同。
    • 确实如此。也许它与一个考虑地球曲率的结果有关,另一个没有,并给出略有不同的输出?
    • 是的,我认为你是对的!在这种情况下,Haversine 公式可能很有用。
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2020-10-11
    • 2019-01-30
    • 1970-01-01
    相关资源
    最近更新 更多