2015-05-18 20 views
5

Mamy dużą ilość geografii przechowywanej w tabelach MapInfo, którą chcielibyśmy teraz przechowywać w SQL Server. Napisaliśmy narzędzia C#, aby odczytać geografię z plików MapInfo i zaimportować je do serwera SQL. W większości przypadków działa to dobrze. Jednak po wielu próbach czyszczenia przy użyciu narzędzi, które opracowaliśmy w domu, nadal pozostaje nam znaczna liczba geografii, które są uznawane za nieważne przez SqlGeography.STIsValid().C# SQLGeography: diagnozowanie nieprawidłowych geometrii

Dla większości lub we wszystkich tych przypadkach, metoda .NET SqlGeography.MakeValid() jest w stanie stworzyć poprawną instancję geografii. Jednak dokumentacja na ten temat jest dość słaba, i nie jesteśmy zadowoleni z po prostu akceptując modyfikacje, które MakeValid czyni bez zrozumienia przyczyn geografii są uznane za nieważne, a co MakeValid czyni je skorygować.

Po wywołaniu IsValidDetailed otrzymujemy tajemniczy komunikat o błędzie, który nie jest dobrze udokumentowany. Dla wielu z tych przypadków, ciąg zwracany przez IsValidDetailed wygląda mniej więcej tak:

24404: Nie ważne, ponieważ pierścień wielokąt (1) przecina się lub jakiś inny pierścień. Problem występuje w pozycji (19) w zbiorze geometrii

Wszystkie obiekty geograficzne, które próbujemy zaimportować, są wielobokami. Parsując ten komunikat o błędzie, próbowaliśmy zidentyfikować problematyczne wielokąty i pierścienie w obrębie tych wielokątów. Jednak okazuje się, że indeksy nie wydają się odpowiadać rzeczywistym problematycznym wielokątom/pierścieniom. W wielu przypadkach indeksy wykraczają poza granice tablic wejściowych geometrii.

Czy istnieje lepszy sposób, aby wskazać konkretny powód dla obiektu geometria/Geografia być uznane za nieważne i wskazać, które wielokąty, pierścienie, czy punkty są problematyczne?

Odpowiedz

0

ja wpadłem na ten błąd kilka razy sam. Zwykle wynika to z faktu, że serwer SQL wymaga, aby punkty były wymienione w kolejności przeciwnej do ruchu wskazówek zegara. Gdy punkty są w kolejności zgodnej z ruchem wskazówek zegara, generowany jest wyjątek, który widzisz.

Oto wielki wizualny: http://danielwertheim.se/sqlgeography-in-sql-server-2012-polygon-must-start-on-correct-position-no/

... i praktyczne rozwiązanie, sprawdź ten post na blogu: http://blogs.msdn.com/b/edkatibah/archive/2008/08/19/working-with-invalid-data-and-the-sql-server-2008-geography-data-type-part-1b.aspx

+0

dzięki za odpowiedź. Chociaż orientacja punktu może być przyczyną błędu, w naszym przypadku tak nie jest. Mamy kod, który automatycznie wykrywa orientację i naprawia go, jeśli nie poprawne. Pozostałe nieważne geometrie są nieprawidłowe z innych powodów. – jmcstwm