2015-11-27 52 views
2

我試圖從交點DbGeography列具有MultiPolygons內獲得實體和Polygon這是邊界框路口的MultiPolygon和多邊形的使用DbGeography

var sqlPoly = SqlGeography.Parse(bbox); //bbox is in WKT format 

if (sqlPoly.EnvelopeAngle() >= 90) 
    sqlPoly = sqlPoly.ReorientObject(); 

var box = DbGeography.FromBinary(sqlPoly.STAsBinary().Value); //resulting bbox is OK and tested by parsing WKT 

var query = from ls in _mdb.Listings where box.Intersects(ls.Geo) select ls; 

所以結果是非常奇怪的。我選擇離db結果集有千里之外的bbox,但這個查詢仍然返回結果。

我認爲這是一個關於MultiPolygons的問題。

編輯:

我想消滅實體框架和使用原始SQL,但結果是一樣的:

var q = "DECLARE @g geography; SET @g = geography::Parse('" + box.AsText() + "'); SELECT * FROM Listings WHERE @g.STIntersects(Geo) = 1;"; 

當我改變STIntersectsSTContainsSTWithin得到過濾所得套但這一次;它過多地過濾了太多錯過的地理區域。

+1

沒有樣本數據,很難說出發生了什麼事情。但是在地理空間方面,我通常喜歡在地圖上繪製相關項目,以確保我認爲數據代表的是實際代表的內容。例如,做一個像整個地球上的多邊形減去你真正關心的區域的東西很容易。它看起來像你在'sqlPoly'(我假設是你的邊界框)的定義中解釋了這一點,但我不對數據庫表中的數據做任何這樣的假設。驗證你的假設是很好的。 –

+0

我正在地圖上進行測試。該查詢準備一個正在GeoJson服務上提供的結果集。您明確指出,此服務正根據可見邊界框進行查詢。我試圖驗證所有的假設,但唯一的可能性是一個多邊形的問題,因爲多邊形似乎在STIntersects上過濾,但多邊形不是:( – MrGorki

+1

所有我能想到的是,由於某些原因'STIntersects()'只工作與標量多邊形(即不是MULTIPOLYGON()地理實例),但我只是做了一個簡單的概念證明,我可以證明它的確有用,我仍然懷疑某些特定的數據,而不是STIntersects()的工作方式。但是,如果您無法查看您的數據,將很難診斷。 –

回答

1

使用您給我的示例數據,許多對象具有所謂的環定向問題。簡單地說,您指定地理多邊形物體的角落的順序。也就是說ABCDA <> ADCBA。幸運的是修復很簡單。我跑樣品臺以下更新:

update l 
set Geo = Geo.ReorientObject() 
from Listele as l 
where Geo.EnvelopeAngle() = 180 

,現在當我在數據上運行一個選擇,它似乎代表了一個城市與一些河流(或者街道)流過。我猜的是更多你要找的東西。

+0

你救了我的一天!非常感謝你!!! – MrGorki

相關問題