2014-04-14 58 views
1

我使用geometry::STPointFromText從文本中獲取點,並使用geometry :: STGeomFromText創建多邊形。 我現在已經在一個表中設定的我的Area多邊形與這樣的描述:哪些多邊形包含點

Id  int  PK 
Name  varchar 
Polygon varchar 

哪個區域包含STPointFromText( 'POINT(12月31日)',4326)? 我需要爲此目的的查詢。

回答

0

我找到了一個解決方案:

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; 
+0

Blech!如果你的Area表達到任何合理的大小,那麼這不會很好。讓我們看看我們是否可以做出基於集合的查詢。 –

1

如果添加計算列到表代表實際的幾何對象,你可以在基於集合的方式做到這一點(這應該規模比好多了上面的基於光標的方法)。保持該列是可選的,但是將防止引擎每次運行查詢時都必須立即創建幾何對象。例如:

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 
+0

POINT(539749 3953079)是例如,該字段對於我的過程必須是可變的... –

+0

是的。你會發現這個點仍然是一個變量。關鍵是不要在運行時轉換表的幾何實例值並避免遊標。 –

相關問題