按距离对结果列表进行排序

时间:2013-01-31 16:50:52

标签: sql asp-classic distance latitude-longitude

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

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

动态创建新recodset的最佳方法是做距离计算然后按距离排序还是有更好的方法在网站上使用更少的资源?

以下是答案

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

3 个答案:

答案 0 :(得分:0)

回答你的问题:

去年,我做了几乎相同的事情,但是使用了lat / long。并且实时计算了距离。距离是使用海峡数学计算的,因此速度很快,而且没有使用大量资源 不熟悉Easting和Northing coords,所以它可能会,或者可能不会更快,首先将它们永久地转换为数据库中的lat / long或其他坐标系。

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

祝你好运!

P.S。这是找到2 Easting / Northing coords之间距离的公式:

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

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

答案 1 :(得分:0)

晚一点参加聚会,但是UK Eastings / Northings只是覆盖该国家的1km x 1km网格,因此要获得两点之间的距离的数学运算只是毕达哥拉斯定理,您要在该定理中从另一方获得斜边两侧。

下面的伪代码显示了数学公式:

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

答案 2 :(得分:-1)

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

你必须首先转换坐标(无论它们是东方,北方等) 到纬度,经度十进制度WGS84。
这是整个世界使用的cooridnate系统,现在你可以开始计算了:

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