2017-08-07 121 views
0

我有一張大約有400行地理數據的表格,我使用STWithin方法來確定某個點是否存在於其中一行的邊界內。在一臺服務器上出現幾何錯誤,而在另一臺服務器上出現幾何錯誤

在我的測試服務器上,它工作正常。但是,對於最新版本的數據集,查詢在其中一行數據上的實時服務器上失敗。如果我從查詢中排除該行,那麼它會成功。

錯誤是:

消息6522,級別16,狀態1,第3行

用戶定義 例程或聚合 「幾何」 的執行過程中發生

一個.NET Framework錯誤:系統.ArgumentException:24144: 此操作無法完成,因爲該實例無效。 使用MakeValid將實例轉換爲有效的實例。請注意,MakeValid可能會導致幾何實例的點略有偏移。

查詢的簡化版本是:

DECLARE @Point GEOMETRY = GEOMETRY::Point(416420, 345058, 0) 

SELECT * 
FROM PolygonData 
WHERE @Point.STWithin(GeoField) = 1 

的測試服務器的SQL Server 2012(11.0.2100.60),現場服務器的SQL Server 2012(11.0.6544.0)。

我看不出爲什麼相同的數據會在一臺服務器上成功並在另一臺服務器上失敗?非常感謝任何幫助,謝謝。

+0

你能否提供WKT的「壞」實例?此外,代碼異味是您正在使用幾何數據類型(而不是地理位置)來存儲地理數據。 –

+0

當然,我已經在這裏發佈了WKT數據https://gist.github.com/dannyshisler/66da21b345038d4238be92e925490aa5謝謝。 使用SharpGIS使用名爲shape2sql.exe的工具從Shapefile(.shp)導入數據,這就是爲什麼數據採用格式的原因。我還沒有找到另一種將.shp數據導入SQL Server的方法。 –

+1

我可以看到它爲什麼不是一個有效的地理實例(地理假設座標是緯度/經度,這些不是)。但至於你的實際問題,當我把它加載到我的本地實例時,我有一個奇怪的行爲。如果我確實聲明瞭@g geometry = geometry :: STGeomFromText(「你的WKT」,0);選擇@g;'一切正常。但是如果我試圖在'@ g'上調用一個方法(比如'STNumGeometries()'),它就會抱怨。在它上調用'MakeValid()'使得一切都好。我的懷疑是你有一個內部環定位問題。也就是說,第一個多邊形在其中定義了「孔」... –

回答

1

原來表中有無效的數據。添加這個作爲答案,但也增加了一種方法來修復表中的數據。

update t 
set g = g.MakeValid() 
from dbo.yourTable as t 
where t.g.STIsValid() = 0; 

(分別與實際的表和列的名稱替換yourTableg)通過更新壞數據作爲一個時間的操作,就不會產生在選擇時調用MakeValid()的開銷(如推測讀取比寫入更頻繁)。對於後續的任何數據加載,您也可以實施類似上述的操作。

相關問題