Mam kilkaset kształty ( polygon
S multipolygon
s) każda składająca się z dziesiątków tysięcy punktów, które staram się dostać do SQL 2008.
Niestety kształty, które próbowałem zaimportować, są „praworęczne” (obwód każdego z nich jest narysowany zgodnie z ruchem wskazówek zegara wokół zawartych w nim punktów). Serwer SQL przyjmuje kształty „leworęczne” (przeciwnie do ruchu wskazówek zegara wokół wnętrza), przynajmniej dla geography
typów. Oznacza to, że SQL zakłada, że próbuję wybrać całą ziemię oprócz mojego kształtu. Niektórzy opisują to jako kształty „na lewą stronę”.
Z MSDN , który frustrująco nie mówi, której orientacji pierścienia należy użyć:
Jeśli używamy
geography
typu danych do przechowywania instancji przestrzennej, musimy określić orientację pierścienia i dokładnie opisać lokalizację instancji.
Jeśli użyjesz niewłaściwej orientacji pierścienia w SQL 2008, ulega awarii z następującym błędem (wyróżnienie moje):
Wystąpił błąd programu .NET Framework podczas wykonywania procedury zdefiniowanej przez użytkownika lub agregacji „geografii”: Microsoft.SqlServer.Types.GLArgumentException: 24205: Podane dane wejściowe nie reprezentują prawidłowej instancji geograficznej, ponieważ przekraczają jedną półkulę. Każda instancja geograficzna musi mieścić się na jednej półkuli. Częstą przyczyną tego błędu jest niewłaściwa orientacja wielokąta.
Importowanie kształtów geometry
zamiast geography
działa dobrze, ale chciałbym użyć, geography
jeśli mogę.
W SQL 2012 rozwiązanie tego problemu wydaje się dość trywialne , ale jestem przywiązany do 2008 roku.
Jak konwertować kształty?
źródło
Odpowiedzi:
Blog Spatial Ed miał zwięzłe rozwiązanie. Oto trochę SQL demonstrujący transformację:
I fragment postu Eda:
źródło
W> = SQL Server 2012 metoda ReorientObject () powinna to osiągnąć. Dla <SQL Server 2012 poniżej znajduje się alternatywna metoda.
W przypadku istniejącej geografii SQL @g poniższy kod wyodrębni punkty i ponownie utworzy wielokąt z punktami (wierzchołkami) w odwrotnej kolejności:
(UWAGA 1: działa na proste wielokąty, a nie na wielokąty lub wielokąty z pierścieniami / centroidami)
(UWAGA 2: za pomocą układu współrzędnych SRID 4326 (WGS 84))
źródło
Wygląda na to, że mogę użyć jakiejś bezbożnej hybrydy SQL i C # z SQL Server Spatial Tools , zgodnie z sugestią dotyczącą przepełnienia stosu .
Uwaga: w momencie opublikowania tej odpowiedzi nie było tam zbyt wielu informacji. Nie próbuj tej metody, chyba że potrzebujesz już SQL Server Spatial Tools do czegoś innego. Zamiast tego wypróbuj jedną z pozostałych odpowiedzi tutaj lub w sekcji Przepełnienie stosu .
źródło