2013-12-18 18 views
6

Ich möchte meine geographischen Daten nicht in Geometrie umwandeln, damit sie in STIntersect den Wert true zurückgibt. HierSQL-Geography-Punkt innerhalb eines Polygons, das bei STIntersect nicht True zurückgibt (aber True mit Geometry zurückgibt)

ist der Code 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) 

Der folgende Code gibt false (0), aber wenn ich benutze:

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) 

Es gibt true zurück, gibt es etwas, das ich fehle? Alles, was ich weiß, ist Geographie ist 3D-Ebene und Geometrie ist eine flache Karte, aber ich verwende die Erde für die Berechnung, wenn der Punkt im Polygon ist.

PS: Es funktioniert nicht so gut mit STContains, STWithin, STOverlaps

mit Microsoft SQL Server 2012

Antwort

8

Dies funktioniert:

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) 

Sie müssen mit vorsichtig sein, die " Richtung ", in der Sie ein Polygon für geography beschreiben - betrachten Sie ein Polygon, das als ein Kreis um den Äquator definiert ist - hatten Sie vor, die nördliche Hemisphäre oder die südliche zu spezifizieren?

Siehe here:

In einem Ellipsoid-System, ein Polygon keine Bedeutung hat, oder ist nicht eindeutig, ohne Orientierung. Zum Beispiel, beschreibt ein Ring um den Äquator die nördliche oder südliche Hemisphäre? Wenn wir den geografischen Datentyp zum Speichern der räumlichen Instanz verwenden, müssen wir die Ausrichtung des Rings angeben und den Standort der Instanz genau beschreiben. Das Innere des Polygons in einem ellipsoiden System wird durch die linke Regel definiert.

+0

Danke, arbeitete für mich. – MilkTea027

+1

Dies ist ein schöner Blogeintrag, der die _left-hand_ Regel erklärt: http://danielwertheim.se/2012/12/03/sqlgeography-in-sql-server-2012-polygon-must-start-on-correct-position- no/ Beispiel: Wenn ein Punkt zu den _left_ aller Linien des Polygons gehört, wird das Polygon _intersect_. – bounav

+0

Die URL zu dem obigen Blogbeitrag zur Erläuterung der Linke-Hand-Regel sollte lauten: http://danielwertheim.se/sqlgeography-in-sql-server-2012-polygon-must-start-on-corrfect-position-no/ – Daniel