我想用包含 gps 坐标列的 sql server 2008 构建数据库-
latitude
和
longitude
我想建立一个类似的查询:
"Give me all rows that are within 5(for example) metres of this coordinate"
在c#中可以吗??
我想用包含 gps 坐标列的 sql server 2008 构建数据库-
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 m。您可以计算边界圆,但这会增加 SQL 查询的复杂性。
所以 - 简而言之 - 你真的需要一个具有空间支持的数据库。
如果你只有 lats 和 longs,它会有点慢,但是这样的查询应该可以做到:
select latitude, longitude where (latitude - @lat)^2 + (longitude - @long)^2 <= @dist
@lat 和 @long 是坐标,@dist 是允许的最大距离。
编辑: Debracey 和我认为合并我们的两种技术可能更有效。因此,首先您将使用边界框进行查询,这是一个非常快速的计算,然后您将获取通过边界框测试的(希望更小)样本并针对我的查询进行测试。
我知道这是 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
我用这个公式来计算附近的雷达检查点......