我想用sql server 2008构建包含gps coordinate-
列的数据库latitude
和
longitude
我希望构建一个类似的查询:
"Give me all rows that are within 5(for example) metres of this coordinate"
有可能在c#??
答案 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
我用这个公式来计算附近的雷达检查点......