2012-11-08 43 views
0

我已经保存在我的表之一是地理点的格式如下:通过经度和纬度T-SQL优化地理搜索

经度纬度POSTALCODE

的想法是让使用表格中的信息以给定的经度和纬度获得最接近的可用邮政编码。

我的算法如下工作:

  1. 初始化UserLongitude和UserLatitude
  2. 初始化StepVariable为1.0
  3. 从我的表中的所有记录,其中

    longitude>UserLongitude-StepVariable 
    and 
    longitude<UserLongitude+StepVariable 
    and 
    latitude>Userlatitude-StepVariable 
    and 
    latitude<Userlatitude+StepVariable 
    
  4. 如果没有找到记录,使用1.0增加StepVariable并执行步骤3

因为我有read当我们移动到极点时,1.0的经度值更小。因此,当经度和纬度1.0的值不相同时,我的算法将以不正确的方式扩展搜索区域。

是否有一个棘手的方式来将我的可搜索区域扩展为Square,因为现在,在某些地方我有矩形,而我相信这会让我的搜索速度变慢。

回答

0

为了计算特定地理点经纬度的长度有多少米,我使用以下算法:

-- Geograpic Point Cordinates 
DECLARE @LATTIDUDE REAL=45 
DECLARE @LONGITUDE REAL=45 
DECLARE @Distance REAL=10 

-- Constants 
DECLARE @ConvertionConstant AS FLOAT=2*PI()/360 
DECLARE @MetersPerDegree AS FLOAT 

DECLARE @LattidueInRadians AS [email protected]*@LATTIDUDE 

DECLARE @LongitudeParameter1 AS FLOAT=111412.84 
DECLARE @LongitudeParameter2 AS FLOAT=-93.5 
DECLARE @LongitudeParameter3 AS FLOAT=0.118 

SET @MetersPerDegree=(@LongitudeParameter1*COS(@LattidueInRadians))+(@LongitudeParameter2*(COS(3*@LattidueInRadians)))+(@LongitudeParameter3*COS(5*@LattidueInRadians)) 
DECLARE @LongitudeRangeTemp AS [email protected]/(@MetersPerDegree/1000) 

-- Results for longitude 
SELECT @LongitudeRangeTemp AS DegreesForGivenKM 
SELECT @MetersPerDegree AS MetersPerDegreeOfLongitude 

-- Constants 
DECLARE @LatitudeParameter1 AS FLOAT=111132.92 
DECLARE @LatitudeParameter2 AS FLOAT=-559.82 
DECLARE @LatitudeParameter3 AS FLOAT=1.175 
DECLARE @LatitudeParameter4 AS FLOAT=-0.0023 

-- Results for longitude 
SET @MetersPerDegree=(@LatitudeParameter1+(@LatitudeParameter2*COS(2*@LattidueInRadians))+(@LatitudeParameter3*COS(4*@LattidueInRadians))+(@LatitudeParameter4*COS(6*@LattidueInRadians))) 
DECLARE @LatitudeRangeTemp AS [email protected]/(@MetersPerDegree/1000) 
SELECT @LatitudeRangeTemp AS DegreesForGivenKM 
SELECT @MetersPerDegree AS MetersPerDegreeOfLatitude 

为公里增加了一个附加参数 - 代码将计算多少度数等于给定的公里数。

您可以自由地在函数中实现代码。

0

我会建议使用GeographyGeometry数据类型及其相关功能(例如:STDistance

http://msdn.microsoft.com/en-us/library/bb933917(v=sql.100).aspx

如果你不能做到这一点,那么Haversine formula是计算距离

有用
+0

我不认为我可以使用STDistance,因为它给出了两个对象之间的最短距离。我需要一个更好的方法来维护我的StepVariable - 根据当前的UserLongitude值以不同的经度值增加/减少。 – gotqn

+0

@gotqn看起来你是在最短距离之后 - 使用STDistance来计算它们,并且取最小值。 – podiluska

+0

是的,这是真的,但只使用这个功能,意味着我首先应该计算我的点和所有其他点之间的距离,然后得到最短的点。我有大约3百万条记录,我认为这会很慢。这就是为什么,我只想得到新点上的点,但有时在我创建的矩形中没有其他点,而且我正在创建一个更大的点。我想要的不是创建矩形,而是方形 - 矩形是经度不同值的结果。 – gotqn