我使用geometry::STPointFromText
從文本中獲取點,並使用geometry :: STGeomFromText創建多邊形。 我現在已經在一個表中設定的我的Area
多邊形與這樣的描述:哪些多邊形包含點
Id int PK
Name varchar
Polygon varchar
哪個區域包含STPointFromText( 'POINT(12月31日)',4326)? 我需要爲此目的的查詢。
我使用geometry::STPointFromText
從文本中獲取點,並使用geometry :: STGeomFromText創建多邊形。 我現在已經在一個表中設定的我的Area
多邊形與這樣的描述:哪些多邊形包含點
Id int PK
Name varchar
Polygon varchar
哪個區域包含STPointFromText( 'POINT(12月31日)',4326)? 我需要爲此目的的查詢。
我找到了一個解決方案:
DECLARE @polygon geometry
DECLARE @selectedId int
DECLARE @point geometry = geometry::STPointFromText('POINT(539749 3953079)', 4326)
DECLARE geo_cur CURSOR FOR
SELECT geometry::STGeomFromText('POLYGON(('+Polygon+'))', 4326),id FROM Area where Polygon is not null
OPEN geo_cur
FETCH NEXT FROM geo_cur
INTO @polygon,@selectedId
WHILE @@FETCH_STATUS = 0
BEGIN
IF @polygon.STIntersects(@point) = 1
BEGIN
PRINT @selectedId
END
FETCH NEXT FROM geo_cur
INTO @polygon,@selectedId
END
CLOSE geo_cur;
DEALLOCATE geo_cur;
如果添加計算列到表代表實際的幾何對象,你可以在基於集合的方式做到這一點(這應該規模比好多了上面的基於光標的方法)。保持該列是可選的,但是將防止引擎每次運行查詢時都必須立即創建幾何對象。例如:
alter table [Area] add g as as geometry::STGeomFromText([Polygon], 4326) persisted
DECLARE @point geometry = geometry::STPointFromText('POINT(539749 3953079)', 4326)
select * from [Area] where g.STIntersects(@point) = 1
POINT(539749 3953079)是例如,該字段對於我的過程必須是可變的... –
是的。你會發現這個點仍然是一個變量。關鍵是不要在運行時轉換表的幾何實例值並避免遊標。 –
Blech!如果你的Area表達到任何合理的大小,那麼這不會很好。讓我們看看我們是否可以做出基於集合的查詢。 –