确定范围内的经度和纬度

发布于 2024-09-27 04:42:22 字数 480 浏览 4 评论 0原文

我的数据库中有位置。位置具有纬度和经度属性(取自谷歌地图,例如:48.809591)。 是否有任何查询可以帮助我检索另一个位置范围内的位置?

例子: 我的位置 A 的纬度 = 48.809591,经度 = 2.124009,并且想要检索数据库中距离位置 A 5 英里以内的所有位置对象

。 A.latitude + 5 英里和 location.latitude > A.latitude - 5 英里且 location.longitude < A.经度 + 5 英里且 location.经度 > A.longitude - 5 英里,然后借助 http://www.movable-type.co.uk/scripts/latlong.html

有什么想法吗?

I have locations in my database. A location has the attributes latitude and longitude (taken from google maps, example: 48.809591).
Is there any query that could help me retrieve the locations within a range of another location?

Example:
I have the location A with latitude = 48.809591, and longitude = 2.124009 and want to retrieve all location objects in my database that are within 5 miles of location A

My first thought was to retrieve the locations in a square where location.latitude < A.latitude + 5 miles and location.latitude > A.latitude - 5 miles and location.longitude < A.longitude + 5 miles and location.longitude > A.longitude - 5 miles, and then remove the irrelevant locations from the returned array with the help of something like http://www.movable-type.co.uk/scripts/latlong.html

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

自由范儿 2024-10-04 04:42:22

如果您使用 MySQL 作为 DBMS1,您可能有兴趣查看以下演示文稿:

作者介绍了如何使用 MySQL 中的半正弦公式可按邻近度对空间数据进行排序,并将结果限制在定义的半径内。更重要的是,他还描述了如何使用纬度和经度列上的传统索引来避免此类查询的全表扫描。


1 即使您不是,这仍然很有趣且适用。
2 该演示文稿还有一个 pdf 版本

Just in case you're using MySQL as your DBMS1, you may be interested in checking out the following presentation:

The author describes how you can use the Haversine Formula in MySQL to order spatial data by proximity and limit the results to a defined radius. More importantly, he also describes how to avoid a full table scan for such queries, using traditional indexes on the latitude and longitude columns.


1 Even if you aren't, this is still interesting and applicable.
2 There is also a pdf version of the presentation.

友谊不毕业 2024-10-04 04:42:22

我认为,您想要的计算称为大圆距离:

http://en.wikipedia。 org/wiki/Great-circle_distance

The calculation you want, i think, is called the great circle distance:

http://en.wikipedia.org/wiki/Great-circle_distance

梦里人 2024-10-04 04:42:22

你需要一个距离函数。

对于SQL Server,它看起来像这样(注意距离以公里为单位),

    CREATE FUNCTION distance
    (
      @startLatitude float, 
      @startLongitude float, 
      @endLatitude float,
      @endLongitude float
    )
    RETURNS float
    AS
    BEGIN

      DECLARE @distance float;

      set @distance = 
        6371 * 2 * atn2(sqrt(power(sin(pi() / 180 * (@endLatitude - @startLatitude) / 2), 2) +
        power(cos(@startLatitude * pi() / 180), 2) *
        power(sin(pi() / 180 * (@endLongitude - @startLongitude) / 2), 2)),
        sqrt(1 - power(sin(pi() / 180 * (@endLatitude - @startLatitude) / 2), 2) +
        power(cos(@startLatitude * pi() / 180), 2) *
        power(sin(pi() / 180 * (@endLongitude - @startLongitude) / 2), 2)));
      RETURN @distance
    END

You would need a distance function.

For SQL Server it would look something like this (note that distance is in kilometers),

    CREATE FUNCTION distance
    (
      @startLatitude float, 
      @startLongitude float, 
      @endLatitude float,
      @endLongitude float
    )
    RETURNS float
    AS
    BEGIN

      DECLARE @distance float;

      set @distance = 
        6371 * 2 * atn2(sqrt(power(sin(pi() / 180 * (@endLatitude - @startLatitude) / 2), 2) +
        power(cos(@startLatitude * pi() / 180), 2) *
        power(sin(pi() / 180 * (@endLongitude - @startLongitude) / 2), 2)),
        sqrt(1 - power(sin(pi() / 180 * (@endLatitude - @startLatitude) / 2), 2) +
        power(cos(@startLatitude * pi() / 180), 2) *
        power(sin(pi() / 180 * (@endLongitude - @startLongitude) / 2), 2)));
      RETURN @distance
    END
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文