2012-06-14 21 views
6

我們在這個問題上有點內部衝突,似乎無法得出一個滿意的結論。我應該使用SqlGeometry還是SqlGeography?

我們只會存儲緯度和經度,也可能只是存儲簡單的多邊形。我們所需要的只是計算兩點之間的距離(並且可能要查看某點是否在多邊形內),並且整個數據非常靠近以使平面估計可接受。

由於我們的要求非常寬鬆,一半的開發團隊建議使用SqlGeometry類型,這顯然更簡單。儘管如此,我無法接受這個問題,因爲我們正在存儲地理數據,這似乎是將它們存儲在SqlGeography中是正確的。另外,我還沒有找到任何實質性證據表明SqlGeometry數據類型比SqlGeography類型更容易使用。

有沒有人有建議,哪種類型更適合這種相對簡單的情況?

+0

您的應用程序是否有可能增長到球形數據成爲需求的可能性? – swasheck

+0

嗯......我還沒有做足夠的空間數據在SQL Server中有一個明智的意見。對兩種方式描述的內容進行編碼,看看哪個更容易。如果是洗衣服,我會說地理類型更合適。但是你可能會在扣球過程中發現他們的恐懼。 –

回答

5

這不是比較功能,準確性或簡單性的問題 - 兩種空間數據類型適用於不同類型的數據。

作爲一個類比,假設您爲包含每行唯一標識的列選擇最佳數據類型。如果該UID只包含整數值,則使用int,而如果它是6個字符的字母數字值,則使用char(6)。如果它具有可變長度的unicode值,則可以使用nvarchar代替,對吧?

相同的邏輯適用於空間數據 - 根據該列包含的值選擇適當的數據類型;如果您使用的是地理座標(即經度/緯度)座標,請使用數據類型SqlGeography。就這麼簡單。

可以使用SqlGeometry存儲緯度/經度值,但它會像使用爲nvarchar(最大)來存儲整數......我向你保證這會導致問題進一步向下行(例如,當你所有的面積計算出來的時候,以平方爲單位)

+1

儘管我同意你的看法,OP所描述的問題似乎很簡單。他甚至提到整個數據非常接近,所以距離計算誤差應該可以忽略不計。難道你沒有在經緯度 - >地理方面做出例外嗎?我這樣問是因爲我遇到了SqlGeography和ogr2ogr,NH Spatial,QGIS,Sharpmap等問題,有時候,特別是當空間數據不是解決方案的核心,而是一些附屬的東西時,使用SqlGeography似乎不值得麻煩(恕我直言)。 – psousa

+0

@psousa,你有什麼鏈接可以與你關於SqlGeography類型的具體問題分享嗎? –

+0

我的頭頂沒有任何鏈接,但例如:ogr2ogr有時在導入地理數據時翻轉緯度/經度字段(在其中一個較新版本中),QuantumGIS(最新版本)不打開SQL地理信息數據,SharpMap不支持SQL地理數據,NH Spatial需要一些特殊的覆蓋來處理地理數據,難以創建多邊形,因爲您必須提供正確的環定位......無論如何,Alastair有一個觀點,理論上這似乎符合邏輯使用SqlGeography。只要衡量利弊即可。 – psousa

5

SqlGeography類型的可用方法比SqlGeometry少(特別是在Sql 2008中)。

SqlGeography reference

SqlGeometry reference

例如,假設你想在SQL2008多邊形的質心。你在幾何體中有一個本地方法,但不是在地理學方面。

此外,它具有以下限制:

  • 創建多邊形時

你也不能有超過地理學一個半球

  • 環順序的問題,大多數API和我可以使用的庫(我知道)可以比地理更好地處理幾何圖形。

    也就是說,如果距離計算必須精確,那麼您的距離很遠,並且在世界各地都有座標,地理可能會更合適。否則,根據你對這個問題的描述,你可以很好地處理幾何類型。

    關於你的問題:「工作起來容易多少?」。這取決於。無論如何,作爲一個經驗法則,對於簡單場景,我通常選擇SqlGeometry。

    無論如何,恕我直言,你不應該太擔心這個決定。使用其他類型創建新列並在必要時遷移數據相對容易。

  • +0

    感謝,@psousa,這個實用主義的論點。我想知道,將計算的純幾何結果轉換爲適當的度量單位需要做些什麼?例如,計算兩個「點」之間的距離或計算「多邊形」的面積? –

    +0

    我不確定我是否理解你的問題... – psousa

    +0

    例如,計算點​​(1,2)和(2,2)之間的距離將爲幾何返回'1',但會返回地理'〜111,252' (爲了舉例,我使用僞座標)。 Sql Server爲您提供米(或任何您指定的)距離而非必須將純幾何結果轉換爲您想要的任何東西似乎非常好。在對幾何數據進行計算時,是否還有其他問題需要關注,然後需要進行轉換? –

    1

    四年後,很明顯我們應該將數據存儲在SqlGeometry而不是SqlGeography

    爲什麼?

    我們從立法區地圖導入信息,其數據存儲在SqlGeometry。當確定特定經緯度是否在某個立法區邊界內時,當該點接近兩個邊界時,我們會得到不一致的結果。

    這需要我們做額外的工作來識別「接近」邊界的位置,並手動確認它們被分配到適當的區域。不理想。

    道德故事:如果您依賴任何數據,請考慮存儲哪種類型以幫助指導您的決定。

    相關問題