【问题标题】:Determine if one coordinate is in radius of another确定一个坐标是否在另一个坐标的半径内
【发布时间】:2009-12-13 11:21:20
【问题描述】:

假设我有一个包含坐标的行表。

仅拉取位于另一个坐标半径内的坐标行的最佳方法是什么?

为了简化我的问题,我给出以下示例:

Table like:
Columns: Latitude, Longitude.
Row1:    23.44444  24.55555
Row2:    32.44444  28.22222
Row3:    35.11111  32.12345

在SQL语句中,如何获取例如Row3半径内的坐标行?

【问题讨论】:

    标签: sql coordinates latitude-longitude


    【解决方案1】:

    post 展示了如何在 SQL Server 中执行此操作。

    下面是如何在 MySQL 中做到这一点:

    SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + 
             COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon - lon) * 
             PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance 
    FROM members 
    HAVING distance<='10' ORDER BY distance ASC
    

    【讨论】:

    • 谢谢,如何在 Access 数据库中使用它?
    • 据我所知,您无法在 Access 数据库中创建此类函数。您应该尝试第二种方法。 (需要进行一些修改。例如,我认为 access 没有 PI() 函数)
    • 这是英里还是公里?
    • 我知道这是旧的,但 1.1515 告诉我们这是英里。
    • 我知道在这里跟进一个老话题,但想为后代添加,如果使用 SQL Server 2008,有一个内置的GEOGRAPHY 空间数据类型可以轻松计算距离(例如STDistance 方法)在两个坐标之间。我觉得这更好,因为它还考虑了地球的曲率/椭球形状。 (链接在这个答案顶部的文章似乎假设一个平面投影。)如果距离足够短,可能不会太明显,但可能跨越更大的距离。请参阅stackoverflow.com/a/501224/110871 以获取简明示例。
    【解决方案2】:

    看起来距离公式是:

    D = 60* 1.1515 * acos (sin(pi*y/180) * sin(pi*Y/180) +
                           cos(pi*y/180) * cos(pi*Y/180) * cos((z-Z) *pi / 180) 
                     )  * 180 / pi)
    

    其中 Y 和 Z - 是您要测试的每一行的点,y 和 z - 是示例行的点。

    所以你可以做这样的事情:

    1. 选择表格中的每一行并获取其lonlat
    2. this 应用查询,将$lon$lat 更改为数据表单点1。

    我不知道如何在访问中进行此操作。但这种方式既狭窄又慢。

    【讨论】:

      【解决方案3】:

      你所说的半径是什么意思?你想通过一段距离,比如 5 英里,然后找到 x 行 5 英里范围内的所有行吗?

      如果是,请查看http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

      【讨论】:

      • 是的,我会使用公里,但你明白了。问题是我需要它来访问数据库。
      • 使用 VBA 函数,有很多 googleable 代码 sn-ps 可以适应。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2013-05-29
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      相关资源
      最近更新 更多