2012-11-08 41 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