0

有人可以確認這是一個錯誤還是我做錯了?SQL Server地理中的錯誤?

我有這個存儲過程(SQL Server 2008中)

ALTER PROCEDURE [dbo].[Distance] 
@origin varchar(50),@destination varchar(50),@unit varchar(5) 
as 
    declare @or geography, @dest geography 
    SET @or = (select Location from [dbo].Promotion where [email protected]) 
    SET @dest = (select Location from [dbo].Promotion where [email protected]) 
IF @unit='miles' 
SELECT @or.STDistance(@dest)/1609.344 
ELSE 
--Else show the distance in km 
SELECT @or.STDistance(@dest)/1000 

位置是在數據庫

地理數據類型,而且我在數據庫

 Latitude  Longitude 
1 -34.612654 -58.463586 
2 -34.592802 -58.454317 
3 -34.597889 -58.617949 

已經這個地址,然後運行這個:

execute dbo.Distance 'Number 1','Number 2','km' 
returns 2653.49845233371 kms 

execute dbo.Distance 'Number 1','Number 3','km' 
returns 17.2155414117145 kms 

如果您在第一種情況下訪問Google地圖,那麼座標距離這些座標約爲4公里,而第二個比較似乎沒有問題。

爲什麼第一個是如此錯誤?這是SQL Server中的錯誤嗎?

在此先感謝。吉列爾莫。

+1

使用大型應用程序的第一條規則是數百萬人使用 - 該錯誤在您的代碼中。第二條規則 - 該錯誤在您的代碼中。第三條規則....你有這個想法;) – Jamiec

+0

我假設位置是一個計算列,基於緯度和經度列?如果是這樣,你能給它的定義嗎? (如果你可以創建一個簡單的表,使用INSERT來填充你的樣本數據,並且用一個簡單的查詢來產生結果,那麼其他人就可以重現這個結果會容易得多) –

回答

0

好吧,我已經找到了問題是什麼,是的,當然這是我的錯:)

我插入表中的記錄是這樣

INSERT INTO [dbo].[TestLocation]([Name],[Location],[Latitude],[Longitude]) VALUES('Location1', geography::STGeomFromText('POINT(-34.612654 -58.463586)', 4326),-34.612654,-58.463586); 

然後我意識到首先,經度和緯度都是倒置的,所以我已經按順序改變了,但只是最後兩個字段而忘了改變「geography :: STGeomFromText」中的順序。運行後

SELECT 
    Ubicacion.Lat, 
    Ubicacion.Long 
FROM 
    Promotion 

我意識到錯誤是什麼。衛生署!

注意這一點作爲

SELECT 
    Ubicacion.Lat, 
    Ubicacion.Long 
FROM 
    Promotion 

要知道這是作爲地理數據類型保存爲二進制文件,所以它不是人類可讀的,所以,除非你運行上面的查詢,你會不知道的源問題。

謝謝!吉列爾莫。

+1

這是一個很好的理由將'Location'的定義從'Location geography not null'改爲'Location AS geography :: Point(Latitude,Longitude,4326)'。或換句話說,不要*存儲*計算值。 (可選地,添加'持久化非空',它甚至應該允許它被索引) –

+0

我會檢查。謝謝! – polonskyg