it-swarm.com.de

MSSQL Geography STIntersects gibt 1 zurück, wenn 0 erwartet wird

Ich habe ein MSSQL-Geografie-Problem, das ich nicht erklären kann. Angenommen, ich bin mathematisch herausgefordert, aber es scheint, dass der folgende Punkt das folgende Polygon NICHT schneiden sollte:

DECLARE @t_point geography;  
DECLARE @t_polygon geography;
set @t_polygon = geography::STPolyFromText('POLYGON((1 1, 5 5, 5 0, 1 1))', 4326);
set @t_point = geography::Point(0, 0, 4326);


select
  @t_polygon.STAsText(), 
  @t_point.STAsText(),
  @t_point.STIntersects(@t_polygon), 
  @t_polygon.STIntersects(@t_point);

Wenn ich dies jedoch ausführe, erhalte ich das folgende Ergebnis:

POLYGON ((1 1, 5 5, 5 0, 1 1))  POINT (0 0) 1   1

Die letzten beiden Spalten sind beide 1, wo ich 0 erwarten würde. Wie kann sich ein Punkt im Raum bei 0,0 mit einem Polygon schneiden, das 0,0 nicht berührt oder umfasst?

-1, -1 hat das gleiche Verhalten wie 100, 100.

Selbst wenn ich den Punkt in ein Polygon in einem völlig anderen Raum ändere, sagt MSSQL, dass sie sich schneiden.

set @t_polygon = geography::STPolyFromText('POLYGON((10 10, 50 50, 50 10, 10 10))', 4326);
set @t_point = geography::STPolyFromText('POLYGON((1 1, 5 5, 5 0, 1 1))', 4326);

Ich habe auch STGeomFromText () ausprobiert.

Ich bin sicher, ich muss etwas falsch machen, aber ich kann mir nicht vorstellen, was das sein könnte.

6
Mike Forget

Der Grund, warum Sie ein Problem haben, ist, dass das Polygon falsch gewickelt ist, was zu einem Polygon führt, das die gesamte Welt mit Ausnahme Ihres Interessengebiets abdeckt.

Versuchen

DECLARE @t_point geography;  
DECLARE @t_polygon geography;
set @t_polygon = geography::STPolyFromText('POLYGON((1 1, 5 0, 5 5, 1 1))', 4326);
set @t_point = geography::Point(0, 0, 4326);

Es ist ein bisschen seltsam, aber angesichts der Tatsache, dass es sich bei Geografien um eine Kugel handelt, muss es eine Möglichkeit geben, zu bestimmen, auf welcher Seite der Grenze sich das Innere des Polygons befindet. Bei SQL Server wird dazu die Außengrenze als gegen den Uhrzeigersinn definiert.

Geometrien kümmern sich nicht darum, in welche Richtung sie gewickelt werden, sondern bevorzugen es gegen den Uhrzeigersinn. Es gibt eine Funktion für Geografien ReorientObject, die die Richtung des Objekts ändern.

9
MickyT