2011-01-23 5 views
6

Uso di questa query spaziale Sto cercando di ottenere tutte le informazioni sui paesi che intersecano il punto 78,22. Il risultato atteso è l'informazione "India", ma questa query non restituisce righe.Problema nell'utilizzo di STIntersects in SQL Server 2008

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

Questa è la definizione della tabella:

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

Siete in grado di scaricare almeno la fila per l'India da la tabella Paese, se possibile, anche un'altra per mostrarla selezionando quella e non l'altra. Tks – RichardTheKiwi

risposta

7

La prima cosa da commento è che i punti della superficie terrestre devono essere conservate usando Geografia, non geometria. Ci sono differenze per lo stoccaggio e come funziona il lavoro (anche se dal nome simile)

Ecco un esempio di lavoro:

tabella semplificata:

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

Inserire qualcosa che assomiglia ad un diamante intorno India

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

Trova la partita. È UNION-ed al punto che si cerca. STBuffer aumenta il punto ad un raggio di 100 km, in modo che verrà visualizzato se visto insieme con il record Geografia trovato (Passare alla scheda territoriale nella uscita)

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

Grazie .. Ha funzionato. :) –

+0

Proprio come una nota a piè di pagina, STBuffer() può aggiungere un sacco di risorse. Se hai solo bisogno di trovare cose che sono vicine, considera l'utilizzo di STDistance() e poi esamina le distanze. STBuffer() crea un heptacontakaihenagon (poligono a 71 lati) da un singolo punto, quindi 71x la complessità e la quantità di punti che devono essere considerati per la maggior parte degli algoritmi. STBuffer() con STIntersects() è comodo ma costoso. – radpin