2012-04-19 303 views
1

我想建立与SQL Server 2008数据库,其中包括GPS的列coordinate-查询GPS坐标

latitude 

longitude 

,我想建立一个查询,将是这样的:

"Give me all rows that are within 5(for example) metres of this coordinate" 

这是可能的C#?

回答

4

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查询的复杂性。

所以 - 简而言之 - 你确实需要一个具有空间支持的数据库。

+0

您有这方面的任何recomended教程? – MTA 2012-04-19 23:44:27

+0

在发布的链接中途滚动,它解释了如何找到落在另一个点的给定范围内的点。 – 2012-04-19 23:50:26

+0

c^2 = a^2 + b^2 = 25 + 25 = sqrt(50)= 7,07 ... – 2012-04-20 00:09:51

1

如果你已经是拉特和渴望,这会是一种缓慢的,但像这样的查询应该这样做:

select latitude, longitude where (latitude - @lat)^2 + (longitude - @long)^2 <= @dist

@lat和@long为坐标,并@dist是允许的最大距离。

编辑:Debracey和我认为合并我们的两种技术可能更有效。因此,首先您将使用边界框进行查询,这是一个非常快速的计算,然后您会选择通过边界框测试的样本(希望小得多),并针对我的查询进行测试。

+0

这是一个有趣的方法,没有想到这一点。 – debracey 2012-04-19 23:54:13

+0

这两种方法的融合可能会更有效率,现在我想到了。你可以通过你的方法快速估算,减少清单,然后通过这个运行剩下的成员。 – SomeGuy 2012-04-19 23:57:32

+0

是的,你可以把边框放在限制数据库必须做的计算次数。这实际上是一个非常好的答案....太糟糕了,我再也不能高举... – debracey 2012-04-19 23:59:15

1

我知道这是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 

我用这个公式来计算雷达附近的检查站...

enter image description here