/ / SQL Server: query spaziale - sql-server, geometria, geospaziale

SQL Server: query spaziale - sql-server, geometria, geospaziale

Considera di avere alcune aree e più punti sono memorizzati in due tabelle in 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)

Conosco la funzione utilizzata da STIntersects per verificare se un poligono contiene o meno un punto.
C'è un modo per trovare punti nelle aree per ogni area utilizzando una singola query?
Non so come trovare punti nelle aree perché ci sono più aree, dovrei usare il cursore o per l'iterazione? Se sì, come?

risposte:

2 per risposta № 1

Interessante. Non ho mai usato il tipo di dati geometrici, ma qui è la mia prima ipotesi.

È possibile utilizzare il metodo di geometria STWithin del campo della geometria Punto e passare nell'oggetto Geometria area per vedere se il punto è "all'interno" dell'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

risultati:

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

Spero che questo ti aiuti


1 per risposta № 2

Hai bisogno di un modo per confrontare ogni punto con ogni area. Un cross join lo realizza. Quindi qualcosa del genere:

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