2

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

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

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

这是答案

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
4

3 回答 3

0

要回答您的问题:

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

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

祝你好运!

Ps 以下是查找 2 个东/北坐标之间距离的公式:

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

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

于 2013-01-31T19:51:39.977 回答
0

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

以下伪代码显示了数学:

DeltaX = X1-X2 --the length of side 1
DeltaY = Y1-Y2 --the length of side 2
Hypotenuse = SQRT(DeltaX^2 + DeltaY^2)
于 2019-12-04T12:16:32.987 回答
-1

东和北不是要走的路。

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

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

于 2013-01-31T19:40:12.683 回答