2011-01-23 14 views
6

Używanie tego zapytania przestrzennego Próbuję uzyskać wszystkie informacje o kraju, które przecinają punkt 78,22. Oczekiwany wynik to informacja o "Indiach", ale zapytanie to nie zwraca żadnych wierszy.Problem z używaniem STIntersects w SQL Server 2008

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

Jest to definicja tabeli:

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

jesteś w stanie zrzucić przynajmniej rząd Indii z tabela Kraj, jeśli to możliwe, także jedna inna, aby pokazać ją wybierając tę, a nie drugą. Tks – RichardTheKiwi

Odpowiedz

7

Pierwszą rzeczą, aby skomentować to, że punkty na powierzchni ziemi powinny być przechowywane przy użyciu geografia, nie geometrię. Istnieją różnice w stosunku do składowania i jak funkcjonuje działa (nawet jeśli o podobnej nazwie)

Oto przykład roboczych:

Uproszczona tabela:

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

Włóż coś, co przypomina diament po Indiach

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)); 

Znajdź mecz. Jest UNION-ed do poszukiwanego Punktu. STBuffer zwiększa temperaturę o promieniu 100 km, dzięki czemu będzie on widoczny przy oglądaniu razem z rekordem Geografii znaleziono (zmien na karcie przestrzennego na wyjściu)

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

Dzięki .. Zadziałało. :) –

+0

Podobnie jak przypis, STBuffer() może dodać wiele zasobów. Jeśli potrzebujesz znaleźć rzeczy, które są blisko, rozważ użycie STDistance(), a następnie sprawdź odległości. STBuffer() tworzy heptacontakaihenagon (71 jednostronny wielokąt) z jednego punktu, więc 71x złożoność i ilość punktów, które należy wziąć pod uwagę dla większości algorytmów. STBuffer() z STIntersects() jest przydatny, ale drogi. – radpin