【问题标题】:check if a coordinate is contained within a circle in google maps?检查坐标是否包含在谷歌地图的圆圈内?
【发布时间】:2018-10-24 19:59:54
【问题描述】:

我正在尝试制作一个应用程序来告诉我坐标是否包含在circle 中。

每次我点击地图上的一个点时,我都会得到坐标。我想知道这个新坐标是否包含在圆圈内

我也想知道如何让一个圆圈占据一个坐标周围 5 米的范围。在我的示例中,半径为:50000,但我不知道如何执行转换以设置以米为单位的值。

这是我的代码:

http://plnkr.co/edit/OI4sjcuS526rFYxPnvDv?p=preview

function initMap() {
    var map = new google.maps.Map(document.getElementById('map'), {
        center: {lat:4.624335 , lng: -74.063644 },
        zoom: 5,
    });

    //circle coordinates
    var circle = new google.maps.Circle({
        map: map,
        radius: 50000,    
        fillColor: '#FFFFFF',
        opacity:0,
        center:{lat:4.624335 , lng: -74.063644 }
    });   

    google.maps.event.addListener(map, 'click', function(e) {
        //I get new coordinates ( e.latLng)
    });
}

谢谢!

更新

他们已使用此解决方案将此问题标记为重复 (http://jsfiddle.net/kaiser/wzcst/embedded/result/)

但这并不能真正解决我的问题,因为正如您在图像中看到的那样,解决方案失败了。

【问题讨论】:

  • @geocodezip 我的问题没有重复,那个答案不能解决我的问题。我需要知道坐标是否包含在圆内,在您给我的示例中,您可以清楚地看到坐标在圆外的情况并标记为包含。
  • 请在答案中使用小提琴,而不是在你说它不起作用之前的问题。
  • 我可以看到同样的事情发生。看起来距离计算(computeDistanceBetween)和实际的圆半径相差几米。你试过小圈子吗?我想知道这是否可能是由于地球曲率(?)。圆始终是测地线吗?那么计算距离的方法呢?也就是说,您的问题仍然是重复的,已标记。
  • @MrUpsidown 发生的事情是,由于某种原因,圆圈似乎被包围在一个矩形中。这就是为什么在这一点上,标记似乎在那个矩形内。也许这个问题可以重复,但答案不能满足我的需要。你能帮帮我吗?
  • @geocodezip 这个“解决方案”并不准确。您可以在我的图像中清楚地看到标记未包含在圆圈中,并且表示它已包含在内。这是因为在圆内创建了一种矩形,因此它不在圆内。如果您能帮我解决这个问题,我会非常高兴。

标签: google-maps google-maps-api-3


【解决方案1】:

根据我在你的问题中的理解,你想要做的是

  1. 显示地图
  2. 在地图中创建一个圆圈
  3. 点击地图后, 确定该点是在圆外还是在圆内

在 SO:Check if a latitude and longitude is within a circle google maps 中有一篇关于此的帖子。如果您检查接受的答案(天才算法归功于Guffa),他使用此功能检查该点是否在半径内:

// credits to user:69083 for this specific function
function arePointsNear(checkPoint, centerPoint, km) { 
   var ky = 40000 / 360;
   var kx = Math.cos(Math.PI * centerPoint.lat / 180.0) * ky;
   var dx = Math.abs(centerPoint.lng - checkPoint.lng) * kx;
   var dy = Math.abs(centerPoint.lat - checkPoint.lat) * ky;
   return Math.sqrt(dx * dx + dy * dy) <= km;
}

现在,至于您想要实现的目标,您只需将其添加到您的点击事件中即可。这是我所做的:

google.maps.event.addListener(map, 'click', function(event) {
  var click = event.latLng;
  var locs = {lat: event.latLng.lat(), lng: event.latLng.lng()};
  var n = arePointsNear(user, locs, diameter);

然后我添加了条件,如果函数返回true,标记将有一个标签“I”(inside的缩写)。

  if(n){
    marker = new google.maps.Marker({
      map: map,
      position: locs,
      label: {
        text:"I", //marking all jobs inside radius with I
        color:"white"
      }
    });

如果没有,那么标记将被标记为“O”(outside 的缩写)...

  }else{
    marker = new google.maps.Marker({
      map: map,
      position: locs,
      label: {
        text:"O", //marking all jobs outside radius with O
        color:"white"
      }
    });
  }
});

这是我创建的示例应用程序,以防您想查看它的实际效果: http://jsbin.com/hujusod/edit?js,output

这可能与Check if a latitude and longitude is within a circle google maps 重复。或How To Display Content Based on Closest Lat/Long to Entered Address

但是由于函数以不同的方式使用,我发布了我的答案来帮助你做你最初打算做的事情。如果您只需要这个,请随意对 arePointsNear 函数的来源进行投票。

我希望这会有所帮助!

【讨论】:

  • Geometry Library 具有计算距离的功能 (computeDistanceBetween)。如果知道圆的半径和圆心点,就很容易计算出距离并与半径进行比较。
猜你喜欢
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
相关资源
最近更新 更多