2011-01-23 14 views
6

この空間クエリを使用して、ポイント78,22と交差するすべての国情報を取得しようとしています。期待される結果は "India"の情報ですが、この問合せは行を戻しません。SQL Server 2008でSTIntersectを使用する際の問題

select * from countryspatial 
where 
geom.STIntersects((geometry::STGeomFromText('POINT (78 22)', 4326)))>0; 

これは、テーブル定義です:

CREATE TABLE [dbo].[CountrySpatial](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[ObjectID] [bigint] NULL, 
[FIPS_CNTRY] [nvarchar](255) NULL, 
[GMI_CNTRY] [nvarchar](255) NULL, 
[ISO_2DIGIT] [nvarchar](255) NULL, 
[ISO_3DIGIT] [nvarchar](255) NULL, 
[ISO_NUM] [int] NULL, 
[CNTRY_NAME] [nvarchar](255) NULL, 
[LONG_NAME] [nvarchar](255) NULL, 
[ISOSHRTNAM] [nvarchar](255) NULL, 
[UNSHRTNAM] [nvarchar](255) NULL, 
[LOCSHRTNAM] [nvarchar](255) NULL, 
[LOCLNGNAM] [nvarchar](255) NULL, 
[STATUS] [nvarchar](255) NULL, 
[POP2005] [bigint] NULL, 
[SQKM] [float] NULL, 
[SQMI] [float] NULL, 
[COLORMAP] [smallint] NULL, 
[geom] [geometry] NULL, 
PRIMARY KEY CLUSTERED 
(
[ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[CountrySpatial] WITH CHECK ADD CONSTRAINT [enforce_srid_geometry_CountrySpatial] CHECK (([geom].[STSrid]=(0))) 
GO 

ALTER TABLE [dbo].[CountrySpatial] CHECK CONSTRAINT [enforce_srid_geometry_CountrySpatial] 
GO 
+0

はあなたからインドのために少なくとも行をダンプすることはできます見つけます可能であれば、カントリーテーブルをもう1つ選んで、それを選択して、それ以外を選択しないようにします。 Tks – RichardTheKiwi

答えて

7

コメントする最初のものは、その地表面のポイントは地理ではなく、ジオメトリを使用して格納されるべきです。テーブルを簡素化

:ストレージとどのような機能を動作させるに違い(似た名前も)ここで

は実施例であるがありますインドの周りのダイヤモンドに似ている

CREATE TABLE CountrySpatial(
ID int IDENTITY(1,1) NOT NULL PRIMARY KEY, 
geog geography NULL) 
GO 

挿入何かが

INSERT INTO CountrySpatial(geog) 
VALUES (geography::STGeomFromText('POLYGON((' + 
'77.22702 28.67613, ' + -- new delhi (top) 
'72.566071 23.059516, ' + -- ahmedabad (left) 
'77.593689 13.005227, ' + -- bengaluru (bottom) 
'88.374023 22.614011, ' + -- kolkata (right) 
'77.22702 28.67613))', 4326)); 

一致するものを見つけます。それは求められているポイントとのユニオンです。地理レコードと一緒に見たとき、それが表示されるようにSTBufferは、100キロ半径にポイントを増加(出力の空間タブに切り替え)

select geog 
from countryspatial 
where geog.STIntersects(geography::STGeomFromText('POINT (78 22)', 4326))>0 
union all 
select geography::STGeomFromText('POINT (78 22)', 4326).STBuffer(100000) 
+0

ありがとう..それは働いた。 :) –

+0

脚注と同様に、STBuffer()は多くのリソースを使用できます。近いものを見つける必要がある場合は、STDistance()を使用して距離を調べることを検討してください。 STBuffer()は、単一の点からヘプタコンタカナイファゴン(71面ポリゴン)を作成するので、ほとんどのアルゴリズムで考慮する必要がある複雑さとポイントの量が71倍になります。 STIntersects()を使用したSTBuffer()は便利ですが高価です。 – radpin

関連する問題