Ich habe ein paar hundert Formen ( polygon
s und multipolygon
s), die jeweils aus Zehntausenden von Punkten bestehen, die ich in SQL 2008 einführen möchte.
Leider sind die Formen, die ich zu importieren versucht habe, "rechtshändig" (der Umfang jeder Form wird im Uhrzeigersinn um die darin enthaltenen Punkte gezogen). SQL Server nimmt zumindest für geography
Typen "linkshändige" Formen an (gegen den Uhrzeigersinn im Inneren) . Dies bedeutet, dass SQL davon ausgeht, dass ich versuche, die gesamte Erde mit Ausnahme meiner Form auszuwählen . Einige Leute beschreiben dies als "Inside-Out" -Formen.
Von MSDN , das frustrierend nicht sagt, welche Ringorientierung man verwenden soll:
Wenn wir den
geography
Datentyp zum Speichern der räumlichen Instanz verwenden, müssen wir die Ausrichtung des Rings angeben und den Ort der Instanz genau beschreiben.
Wenn Sie in SQL 2008 die falsche Ringausrichtung verwenden, stürzt der folgende Fehler ab (Hervorhebung von mir):
Während der Ausführung einer benutzerdefinierten Routine oder einer aggregierten "Geografie" ist ein .NET Framework-Fehler aufgetreten: Microsoft.SqlServer.Types.GLArgumentException: 24205: Die angegebene Eingabe stellt keine gültige Geografieinstanz dar, da sie eine einzelne Hemisphäre überschreitet. Jede Geografieinstanz muss in eine einzelne Hemisphäre passen. Ein häufiger Grund für diesen Fehler ist, dass ein Polygon die falsche Ringausrichtung hat.
Das Importieren der Formen als geometry
statt geography
funktioniert einwandfrei, aber ich würde es gerne verwenden, geography
wenn ich kann.
In SQL 2012 scheint es ziemlich trivial zu sein, dieses Problem zu beheben, aber ich bin an 2008 gebunden.
Wie soll ich die Formen konvertieren?
quelle
Antworten:
Spatial Eds Blog hatte eine prägnante Lösung. Hier ist etwas SQL, das die Transformation demonstriert:
Und ein Auszug aus Eds Post:
quelle
In> = SQL Server 2012 sollte die ReorientObject () -Methode dies erreichen. Für <SQL Server 2012 ist unten eine alternative Methode.
Für eine vorhandene SQL-Geografie @g extrahiert der folgende Code die Punkte und erstellt ein Polygon mit Punkten (Scheitelpunkten) in umgekehrter Reihenfolge neu:
(HINWEIS 1: Funktioniert für einfache Polygone, nicht für Multipolygone oder Polygone mit Ringen / Zentroiden)
(HINWEIS 2: Verwenden des Koordinatensystems SRID 4326 (WGS 84)
quelle
Es sieht so aus, als könnte ich eine unheilige Mischung aus SQL und C # aus den SQL Server Spatial Tools verwenden , wie unter Stapelüberlauf vorgeschlagen .
Hinweis: Zum Zeitpunkt der Veröffentlichung dieser Antwort gab es nicht viele Informationen. Versuchen Sie diese Methode nur, wenn Sie bereits SQL Server Spatial Tools für etwas anderes benötigen . Versuchen Sie stattdessen eine der anderen Antworten hier oder bei Stack Overflow .
quelle