我想建立与SQL Server 2008数据库,其中包括GPS的列coordinate-查询GPS坐标
latitude
和
longitude
,我想建立一个查询,将是这样的:
"Give me all rows that are within 5(for example) metres of this coordinate"
这是可能的C#?
我想建立与SQL Server 2008数据库,其中包括GPS的列coordinate-查询GPS坐标
latitude
和
longitude
,我想建立一个查询,将是这样的:
"Give me all rows that are within 5(for example) metres of this coordinate"
这是可能的C#?
C#真的不是问题,问题是数据库本身。 MS SQL Server 2008和更高的具有这篇文章中描述的空间支持:
http://msdn.microsoft.com/en-us/magazine/dd434647.aspx
不使用空间的扩展,你必须手动计算边框自己(这可能会包括百分点>5米)然后,你必须限制结果,以确保它们距离问题点的5米之内。
这里的手动(即有些痛苦的。)计算的小图:
---------------------
| ^ |
| +5m lat |
| |
|-5m lon * +5m lon|
| |
| -5m lat |
| v |
---------------------
的(*
)是有问题的点。手动进行计算的问题在于,距离(*
)点(距离)大于5米的方框附近的角点。您可以计算边界圆,但这会增加SQL查询的复杂性。
所以 - 简而言之 - 你确实需要一个具有空间支持的数据库。
如果你已经是拉特和渴望,这会是一种缓慢的,但像这样的查询应该这样做:
select latitude, longitude where (latitude - @lat)^2 + (longitude - @long)^2 <= @dist
@lat和@long为坐标,并@dist是允许的最大距离。
编辑:Debracey和我认为合并我们的两种技术可能更有效。因此,首先您将使用边界框进行查询,这是一个非常快速的计算,然后您会选择通过边界框测试的样本(希望小得多),并针对我的查询进行测试。
我知道这是MySQL,但是1.地球不是平的2.你想要圈,而不是平方... @radius应该是千米,5米太精确...... 1度是大概111.2公里(我的假设)。如果您需要里程,请将其更改为。 http://en.wikipedia.org/wiki/Latitude#Meridian_distance_on_the_sphere
SELECT *,
(SQRT(POW((lat - @lat), 2) + POW((lon - @lon), 2)) * 111.2) AS radius
FROM table
WHERE POW((lat - @lat), 2) + POW((lon - @lon), 2) < POW((@radius/111.2), 2)
ORDER BY radius ASC
我用这个公式来计算雷达附近的检查站...
您有这方面的任何recomended教程? – MTA 2012-04-19 23:44:27
在发布的链接中途滚动,它解释了如何找到落在另一个点的给定范围内的点。 – 2012-04-19 23:50:26
c^2 = a^2 + b^2 = 25 + 25 = sqrt(50)= 7,07 ... – 2012-04-20 00:09:51