我試圖從交點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;";
當我改變STIntersects
與STContains
或STWithin
得到過濾所得套但這一次;它過多地過濾了太多錯過的地理區域。
沒有樣本數據,很難說出發生了什麼事情。但是在地理空間方面,我通常喜歡在地圖上繪製相關項目,以確保我認爲數據代表的是實際代表的內容。例如,做一個像整個地球上的多邊形減去你真正關心的區域的東西很容易。它看起來像你在'sqlPoly'(我假設是你的邊界框)的定義中解釋了這一點,但我不對數據庫表中的數據做任何這樣的假設。驗證你的假設是很好的。 –
我正在地圖上進行測試。該查詢準備一個正在GeoJson服務上提供的結果集。您明確指出,此服務正根據可見邊界框進行查詢。我試圖驗證所有的假設,但唯一的可能性是一個多邊形的問題,因爲多邊形似乎在STIntersects上過濾,但多邊形不是:( – MrGorki
所有我能想到的是,由於某些原因'STIntersects()'只工作與標量多邊形(即不是MULTIPOLYGON()地理實例),但我只是做了一個簡單的概念證明,我可以證明它的確有用,我仍然懷疑某些特定的數據,而不是STIntersects()的工作方式。但是,如果您無法查看您的數據,將很難診斷。 –