【发布时间】:2012-04-20 08:18:30
【问题描述】:
我想用 sql server 2008 构建包含 gps 坐标列的数据库-
latitude
和
longitude
我想构建一个类似于以下内容的查询:
"Give me all rows that are within 5(for example) metres of this coordinate"
在c#中可以吗??
【问题讨论】:
标签: c# .net sql sql-server
我想用 sql server 2008 构建包含 gps 坐标列的数据库-
latitude
和
longitude
我想构建一个类似于以下内容的查询:
"Give me all rows that are within 5(for example) metres of this coordinate"
在c#中可以吗??
【问题讨论】:
标签: c# .net sql sql-server
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
我用这个公式来计算附近的雷达检查点...
【讨论】: