2013-06-03 2 views
0

Рассмотрим есть некоторые области, и несколько точек сохраняются в двух таблицах в SQL Server:SQL Server: Пространственный запрос

CREATE TABLE [dbo].[Areas](
    [Id] [int] NOT NULL, 
     [Location] [geometry] NOT NULL) 


     CREATE TABLE [dbo].[Points](
    [Id] [int] NOT NULL, 
     [Location] [geometry] NOT NULL) 

Я знаю, что функция STIntersects использует, чтобы проверить, если многоугольник содержит точку или нет.
Есть ли способ найти точки в областях для каждой области, используя один запрос?
Я не знаю, как найти точки в областях, потому что есть несколько областей. следует ли использовать курсор или для итерации? Если да, то как?

ответ

2

Интересно. Я никогда не использовал тип данных геометрии. Но вот мое первое предположение.

Вы можете использовать метод геометрии STWithin поля геометрии точки и передать в объект геометрии Area, чтобы увидеть или не точка «в» зоне

declare @Areas table (AreaID int identity(1,1), Description varchar(50), Area geometry) 
declare @Points table (PointID int identity(1,1), Description varchar(50), Point geometry) 

insert @Areas (Description, Area) 
select 'Area 1', geometry::STGeomFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0))', 0) 

insert @Areas (Description, Area) 
select 'Area 2', geometry::STGeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))', 0) 

insert @Points (Description, Point) 
select 'Point 1', geometry::STPointFromText('POINT(2 2)', 0) 

insert @Points (Description, Point) 
select 'Point 2', geometry::STPointFromText('POINT(4 4)', 0) 

insert @Points (Description, Point) 
select 'Point 3', geometry::STPointFromText('POINT(12 13)', 0) 


select a.Description, p.Description, case when p.Point.STWithin(a.Area) = 1 then 'Yes' else 'No' end as PointWithin 
from @Areas a, @Points p 

Результаты:

Description Description PointWithin 
----------- ----------- ----------- 
Area 1  Point 1  Yes 
Area 2  Point 1  No 
Area 1  Point 2  No 
Area 2  Point 2  No 
Area 1  Point 3  No 
Area 2  Point 3  Yes 

Надеюсь, это поможет

+0

Что это за методы: методы и где их документация? – WiteCastle

1

Вам нужен способ сравнить каждую точку с каждой областью. Это достигается крестным объединением. Итак, что-то вроде этого:

select a.Id as [AreaId] 
    , p.Id as [PointId] 
from dbo.Areas as a 
cross join dbo.Points as p 
where a.Location.STContains(p.Location) = 1 
+0

Спасибо. = 1 был упущен, с которого – Unforgiven

+0

Ха ... вы правы! –

Смежные вопросы