【问题标题】:Sort a list of results by distance按距离对结果列表进行排序
【发布时间】:2013-01-31 16:50:51
【问题描述】:

我创建了一个网站,用于在本地销售商品,如果免费供所有人使用。但是我现在遇到了一个小问题!现在,来自更远地方的人们正在加入我希望他们能够根据与他们的距离搜索和点亮所有项目和/或查看他们所在区域内的所有项目。

我一直在收集每个人的邮政编码,并将它们转换为东向和北向坐标,而不是纬度-经度。

动态创建新记录集的最佳方法是计算距离然后按距离排序,还是有更好的方法可以使用更少的网站资源?

这就是答案

strSQL = "SELECT *, ( 3959 * acos( cos( radians( " & strMyLat & 
    ") ) * cos( radians(Latitude) ) * cos( radians(Longitude) - radians(" & strMyLng & 
    ") ) + sin( radians( " & strMyLat & 
    ") ) * sin( radians(Latitude) ) ) ) AS distance FROM TABLE WHERE HAVING distance < 3;" '## 3 Miles

【问题讨论】:

  • 我想知道这个已经很久了。好问题 +1
  • 就个人而言,我更喜欢纬度/经度坐标,因为这些坐标通常更“标准”(尤其是通过各种基于网络的地图等常见的曝光)。此外,根据网格规模,您可能会出现扭曲。你的数据库后端是什么?一些 RDBMS 具有内置的地理类型(或扩展),因此您可以利用数据库的全部功能进行选择/排序。
  • 这是一个使用 PHP 的类似帖子:stackoverflow.com/questions/2296087/…
  • 感谢您的回复。后端是 MySQL,我使用东移和北移的原因是因为皇家邮政针对 E&N 对英国的所有邮政编码进行免费导出。忘了添加我有所有我需要的计算来获得距离只需要一种按最近的方式动态列出的方法。

标签: sql asp-classic distance latitude-longitude


【解决方案1】:

回答你的问题:

我去年做了几乎同样的事情,但使用纬度/经度。并实时计算距离。距离是使用海峡数学计算的,因此速度很快,并且使用的资源不多。
不熟悉东向和北向坐标,因此在您的数据库或其他坐标系中首先将它们永久转换为纬度/经度可能会更快,也可能不会更快。

现在,如果您决定尽可能快地进行查询,并且您正在处理一个非常小的邮政编码列表,您可以创建一个查找表,其中已经包含任意 2 个邮政编码之间的距离计算。
但是,您的列表越大,它就越笨拙。例如,根据 Wikipedia,英国大约有 1,700,000 个邮政编码,因此这样的表需要它的平方,即 2,890,000,000,000 条记录。

祝你好运!

附:这是查找 2 个东/北坐标之间距离的公式:

d = squareroot(square(E1-E2)+square(N1-N2))/1000  

1000 假设您的坐标以米为单位,而您想要以公里为单位的答案。否则,请相应地调整此数字。

【讨论】:

  • 1,755,212 我目前正在将它们导入到我的数据库中。谢谢。正如我上面所说,我将尝试使用 MySQL geo 的东西来做这件事,我会在完成后发布代码
  • 看起来将其保持在东向和北向坐标中会更快。这样您就不必在数学过程中将纬度/经度转换为径向线。
【解决方案2】:

派对迟到了,但英国东/北只是覆盖在该国上的 1 公里乘 1 公里的网格,因此计算两点之间距离的数学只是毕达哥拉斯定理,您想从其中得到斜边两侧。

以下伪代码显示了数学:

DeltaX = X1-X2 --the length of side 1
DeltaY = Y1-Y2 --the length of side 2
Hypotenuse = SQRT(DeltaX^2 + DeltaY^2)

【讨论】:

    【解决方案3】:

    东移和北移不是要走的路。

    您必须首先转换坐标(无论它们是 Easting、Northing 等) 转为经纬度十进制度 WGS84。
    这是全世界都在使用的坐标系,现在可以开始计算了:

    然后简单地计算两个 lat,lon 对之间的距离,例如使用 hasrsine-Distance 公式(参见 Google 或 Wiki)。

    【讨论】:

    • 感谢您的回复,我必须即时执行此操作,并且之前的 cmets 让我深思熟虑使用 MySQL 进行调用。
    • 这与 MySQl 无关:您需要纬度 WGS84 的坐标,就像您在谷歌地图或谷歌地球上输入和接收一样。如果您有一个带东向北的数据库,您应该将其转换为纬度/经度 WGS84
    • Haversine-Distance 公式首先将纬度/经度转换为距离单位,然后计算两点之间的距离。 Easting 和 Northing 坐标已经是一个距离单位,因此需要做的数学运算就更少了。
    猜你喜欢
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2011-07-27
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多