【问题标题】:Finding all latlong inside a circle in google map [closed]在谷歌地图中找到一个圆圈内的所有 latlong [关闭]
【发布时间】:2016-03-20 20:40:07
【问题描述】:

假设我在数据库中保存了中心点 LatLong,给定半径为 20 米。以及所有其他靠近该中心位置的LatLong,但不一定在中心20米内。有没有办法我可以在不绘制地图的情况下找到距离中心 20 米半径内的所有纬度。只是使用一些 api 或数学公式?

【问题讨论】:

  • 你想找回多少?
  • 我要回多少,对不起,我没有得到你?
  • 而不是枚举所有可能的坐标,这些坐标会填充大量坐标并且您可能不会使用所有坐标,为什么不从给定的中心计算 lat,lng 的框架和而是从数据库中查询位于该框架内的点?
  • @TaoP.R.我认为当他说“半径 20 米内的所有纬度”时,他的意思是他的数据库中所有 存储的坐标。不是所有可能的点,这当然是不可能的。

标签: javascript c# google-maps asp.net-mvc-4 google-maps-api-3


【解决方案1】:

您可以在循环中迭代标记,然后使用 API 函数

computeDistanceBetween()

这将为您提供在 Google API 中称为测地线的最短距离。

你也可以使用该功能

computeLength()

【讨论】:

  • 这是给定的点。问题是根据距离获取点,我认为是相反的
  • 我理解的答案是,经纬度保存在数据库中,这将是这里的标记。并且函数的值以 mts 为单位给出结果,因此通过检查它是否在范围内。如果我错了,请纠正我。
  • 是的,你是对的很有用
【解决方案2】:

你可以使用Haversine公式

https://en.wikipedia.org/wiki/Haversine_formula

这是一个很好的解释

http://www.movable-type.co.uk/scripts/latlong.html

对于 JavaScript:

var R = 6371000; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();

var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
        Math.cos(φ1) * Math.cos(φ2) *
        Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

var d = R * c;

有了这个,您可以迭代您的点并获取距离是否低于 20 米。

【讨论】:

    【解决方案3】:

    这是一个 MySQL 查询(用 PHP 编写),它允许您检索给定距离内的所有点:

    $sql = "SELECT *, ( 3959 * acos( cos( radians(" . $lat . ") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(" . $lng . ") ) + sin( radians(" . $lat . ") ) * sin( radians( lat ) ) ) ) AS distance FROM your_table HAVING distance < 5";
    

    其中$lat 和$lng 是您的点的坐标,lat/lng 是您的表格列,your_table 是您的表格名称。以上将列出 5 nm 范围内的位置。将 3959 替换为 6371 以更改为公里。

    它使用Haversine 公式,正如@scaisEdge 在他的回答中指出的那样。

    【讨论】:

      【解决方案4】:

      毕达哥拉斯在 20 米以内就足够了。

      下面是返回以米为单位的距离的 javascript 函数。我相信你可以转换成 Java'

      function Pyth(lat1,lat2,lng1,lng2){
      x = toRad(lng2-lng1) ;
      y = toRad(lat2-lat1);
      R = 6371000; // gives d in metres
      d = sqrt(x*x + y*y) * R;
      return d;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-11
        • 2016-07-30
        • 2021-03-06
        • 1970-01-01
        • 2016-07-23
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多