查询GPS坐标

时间:2012-04-19 23:37:22

标签: c# .net sql sql-server

我想用sql server 2008构建包含gps coordinate-

列的数据库
latitude 

longitude

我希望构建一个类似的查询:

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

有可能在c#??

3 个答案:

答案 0 :(得分: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查询的复杂性。

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

答案 1 :(得分:1)

如果你所拥有的只是拉扯和长篇,那就会有点慢,但像这样的查询应该这样做:

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

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

编辑:Debracey,我认为合并我们的两种技术可能更有效。所以首先你要使用边界框进行查询,这是一个非常快速的计算,然后你会采用通过边界框测试的(希望小得多)样本并根据我的查询测试它们。

答案 2 :(得分:1)

我知道这是MySQL,但是1.地球不平坦2.你想要圆形,而不是方形...... @radius应该是公里,5米太精确...... 1度大致 111.2 公里(我的假设)。如果您想要里程,请将其更改为 69 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