Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Sql Server 2008 geografische LineString-Größenbeschränkungen

Ich habe noch nichts von Größenbeschränkungen für LINESTRING gehört (sicherlich nicht so kurz wie 567 Punkte).

Ich habe gerade ein Beispiel ausprobiert

DECLARE @geom GEOGRAPHY
SET @geom = GEOGRAPHY::STGeomFromText(
  'LINESTRING (142.98873903132778 -11.006193013241768
   , 142.9891970000001 -11.005916999999954
   -- SNIP 1,119 points
   , 142.04362479801711 -11.629451936538608 )', 4326)
SELECT @geom, @geom.STNumPoints()

was gut funktioniert hat (erzeugt den LINESTRING und zählt 1.122 Punkte).

Schlägt Ihr Beispiel mit IRGENDWELCHEN 567 Punkten fehl - oder nur mit einer bestimmten Menge von Punkten (können Sie sie uns mitteilen?). Ich frage mich wohl, ob Ihr 568. Punkt Ihre GEOGRAPHY-Instanz größer als eine Halbkugel macht? Wenn ich zum Beispiel mein Beispiel ändere, indem ich einen weiteren Punkt (0,0) hinzufüge, wodurch die GEOGRAPHIE zu groß wird:

DECLARE @geom GEOGRAPHY
SET @geom = GEOGRAPHY::STGeomFromText(
  'LINESTRING (142.98873903132778 -11.006193013241768
   , 142.9891970000001 -11.005916999999954
   -- SNIP 1,119 points
   , 142.04362479801711 -11.629451936538608
   , 0 0 )', 4326)         -- ADDED ANOTHER POINT !
SELECT @geom, @geom.STNumPoints()

Ich erhalte ArgumentException 24205:Die angegebene Eingabe stellt keine gültige geografische Instanz dar, da sie eine einzelne Hemisphäre überschreitet. Jede geografische Instanz muss in eine einzelne Hemisphäre passen. Ein häufiger Grund für diesen Fehler ist, dass ein Polygon die falsche Ringausrichtung hat. was offensichtlich nicht genau derselbe Fehler ist wie Sie - aber ich dachte, ich würde es trotzdem ansprechen [Springen Sie zum UPDATE am Ende für eine bessere Idee]

Meine zweite Frage an Sie lautet:Funktioniert es mit dem GEOMETRY-Datentyp? Z.B. Wenn ich mein obiges "brechendes" Beispiel ändere, um GEOMETRY zu verwenden, funktioniert es gut:

DECLARE @geom GEOMETRY    -- using GEOMETRY type instead
SET @geom = GEOMETRY::STGeomFromText(
  'LINESTRING (142.98873903132778 -11.006193013241768
   , 142.9891970000001 -11.005916999999954
   -- SNIP 1,119 points
   , 142.04362479801711 -11.629451936538608
   , 0 0 )', 4326)         -- THIS POINT BREAKS GEOGRAPHY but works now!
SELECT @geom, @geom.STNumPoints()

Wenn Sie weitere Details zu Ihrem spezifischen Problem posten können, deutet dies möglicherweise auf das zugrunde liegende Problem hin. Könnten Sie auch hinzufügen, ob Sie die Punkte in SQL Management Studio oder über Code eingeben (ist es eine C#- und SQL-Datentyp-Assemblierung)? Wie lautet der vollständige Text der Fehlermeldung, die Sie erhalten (wenn es mehr als das gibt, was Sie oben zitiert haben, sehen Sie sich meinen Fehler an).

Aber die kurze Antwort lautet "Ich glaube nicht, dass es eine 567-Punkte-Grenze gibt".

AKTUALISIERUNG: Eds Beitrag enthält genau den Fehler, den Sie erhalten (System.ArgumentException:24200) - wenn Sie also Ihre Daten stattdessen in GEOMETRY zum Laufen bringen können, könnte dies einen Versuch wert sein: