Проблема в использовании STIntersects в SQL Server 2008 - PullRequest
6 голосов
/ 23 января 2011

Используя этот пространственный запрос, я пытаюсь получить всю информацию о стране, которая пересекает точку 78,22. Ожидаемый результат - информация об «Индии», но этот запрос не возвращает строк.

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

1 Ответ

7 голосов
/ 23 января 2011

Первое, что нужно прокомментировать, это то, что точки земной поверхности должны храниться с использованием географии, а не геометрии.Существуют различия между хранилищем и тем, как работают функции (даже если они имеют одинаковые имена)

Вот рабочий пример:

Упрощенная таблица:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...