SQL Räumliches Polygon von innen nach außen

9

Ich erlaube Benutzern, ein Polygon in Silverlight zu zeichnen, indem Sie klicken, um zu zeichnen. Dann durchlaufe ich die Punkte, konvertiere sie in Längen- und Breitengrade und speichere sie dann in SQL (in einer geography -Spalte).

Das Problem ist, dass es wegen der runden Welt und all dem nur funktioniert, wenn der Benutzer im Uhrzeigersinn zieht. Andernfalls versucht es, das Polygon um die Welt herum zu machen und versagt.

Wie mache ich das richtig? Muss ich herausfinden, auf welche Weise sie zeichnen, und wenn ja, wie?

    
Matt 10.12.2010, 14:44
quelle

5 Antworten

3

Sie können überprüfen, ob das Ergebnis der Methode EnvelopeAngle() für die Geographie 180 ist, und dann die Funktion ReorientObject() verwenden, um sie zu korrigieren.

Hier ist das Beispiel:

%Vor%     
Hossein Narimani Rad 22.05.2015 07:14
quelle
1

Wenn Sie an die RTM-Version von SqlServer 2008 gebunden sind, können Sie immer sqlspatial-Tools von Codeplex verwenden, die frei verteilbar sind und aus dieser Bibliothek stammen Verwenden Sie die Methode "makevalid".

Wenn Sie Zeit haben, mit CTP1 von SqlServer Denali zu spielen, können Sie einfach neue räumliche Typen aufnehmen, die Objekte akzeptieren können, die größer als eine Halbkugel sind und die ReorientObject-Methode verwenden, um Objekt bei Bedarf neu auszurichten:)

    
Newanja 11.01.2011 16:10
quelle
1

Ich habe kürzlich eine ähnliche Frage beim GIS StackExchange gestellt. Ich glaube, ich habe eine SQL-only-Lösung gefunden, die im Folgenden wiedergegeben wird:

Schließlich fand sich die Antwort unter Blog von Spatial Ed .

SQL demonstriert die Transformation:

%Vor%

Und Auszug aus Eds Post:

  

Der Schlüssel zu diesem Verhalten ist die Methode STUnion() . Da es sich um eine OGC-basierte Methode handelt, die die gesamte Geometrie für ein bestimmtes Feature bearbeitet, zwingt es Polygone in die für die Methode erforderliche Ausrichtung - die zufällig für die Geography type verwendet wird [...]. Diese dargestellte Methode ist sehr effizient und hält den Overhead gering [...].

    
Michael 22.07.2013 15:10
quelle
0

Dies ist ein gebräuchliches Konzept innerhalb von Geo-Geography-Datentypen. Ein Polygon wird durch eine Anzahl von Scheitelpunkten und die Kanten zwischen diesen Scheitelpunkten definiert. Sie müssen jedoch unterscheiden können, was sich innerhalb und außerhalb des Polygons befindet. Dies geschieht, indem das System annimmt, dass eine Seite der Kante immer die Innenseite definiert (Unterschiedliche Standards verwenden linke oder rechte Seite)

In einer Richtung hast du einen kleinen Kreis gezeichnet, in der anderen Richtung hast du eine Kugel gezeichnet, die die ganze Welt bis auf einen kleinen Kreis umfasst. Letzteres würde geografische Grenzen sprengen und eine Ausnahme auslösen.

Wenn Sie versuchen, einen Donut zu zeichnen, haben Sie 2 Polygone und müssen die Punkte im Uhrzeigersinn / gegen den Uhrzeigersinn haben, um das "Loch" in der Mitte zu definieren.

    
Andrew 10.12.2010 16:56
quelle
0

Die Linke-Hand-Regel bestimmt dies ... während Sie den Umfang Ihres Polygons "durchwandern", muss Ihre linke Hand immer innen sein ... also sollten Dinge "erscheinen", um gegen den Uhrzeigersinn digitalisiert zu werden. das gilt auch für Donuts und Polys mit Löchern.

Wenn Sie Ihre linke Hand "innerhalb" des Polygonbereichs halten, an dem Sie interessiert sind, werden sie im Uhrzeigersinn digitalisiert.

Ein einfacher Weg, um zu bestimmen, welcher korrekt ist, ist immer den mit dem KLEINEREN Bereich zu nehmen ... in so gut wie jedem Arbeitsablauf kann ich keine Polygone digitalisieren, die größer als die Hälfte der Welt sind ...

Der Arbeitsablauf würde folgendermaßen aussehen: Lassen Sie Ihre Benutzer ihre Polygone erstellen, erstellen Sie ein anderes Polygon mit der entgegengesetzten Ausrichtung (ReorientObject () in SQL Server) und vergleichen Sie ihre Bereiche ... Logischerweise ist die kleinste korrekt.

Nur eine andere Möglichkeit, dies zu lösen.

    
Chris Williams 21.04.2017 21:23
quelle