2013-12-18 17 views
6

Non voglio ricorrere alla conversione dei dati geografici in geometria solo per restituire true in STIntersect.Punto di geografia SQL all'interno del poligono che non restituisce true su STIntersect (ma restituisce true utilizzando Geometry)

Ecco il codice in SQL:

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(1, 1, 4326) 
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 4326) 

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon) 

Le seguenti dichiarazioni false (0), se io uso:

DECLARE @point GEOMETRY = GEOMETRY::Point(1, 1, 4326) 
DECLARE @polygon GEOMETRY = GEOMETRY::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 4326) 

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon) 

restituisce vero, c'è qualcosa che mi manca? Tutto quello che so è che la geografia è un piano 3D e la geometria è una mappa piatta, tuttavia sto usando la terra per il calcolo se il punto è nel poligono.

PS: Non funziona così con STContains, STWithin, STOverlaps

utilizza Microsoft SQL Server 2012

risposta

8

Questo funziona:

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(1, 1, 4326) 
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))', 4326) 

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon) 

Bisogna stare attenti con il " direction "in cui descrivi un poligono per geography - considera un poligono definito come un cerchio attorno all'equatore - hai intenzione di specificare l'emisfero settentrionale o quello meridionale?

Vedere here:

In un sistema ellissoidale, un poligono non ha significato, o è ambiguo, senza un orientamento. Ad esempio, un anello attorno all'equatore descrive l'emisfero settentrionale o meridionale? Se utilizziamo il tipo di dati geografici per memorizzare l'istanza spaziale, dobbiamo specificare l'orientamento dell'anello e descrivere accuratamente la posizione dell'istanza. L'interno del poligono in un sistema ellissoidale è definito dalla regola della mano sinistra.

+0

Grazie, ha funzionato per me. – MilkTea027

+1

Questo è un bel post sul blog che spiega la regola _left-hand_: http://danielwertheim.se/2012/12/03/sqlgeography-in-sql-server-2012-polygon-must-start-on-correct-position- no/ Ad esempio: se un punto si trova su _left_ di tutte le linee del poligono, esegue _intersect_ il poligono. – bounav

+0

L'URL del post del blog in alto che spiega la regola della mano sinistra dovrebbe essere: http://danielwertheim.se/sqlgeography-in-sql-server-2012-polygon-must-start-on-correct-position-no/ – Daniel

Problemi correlati