2016-07-28 14 views
0

Ich versuche, einige Koordinaten in ein Geografieobjekt zu konvertieren. Unten ist ein einfacher Testkabelbaum, der das Problem dupliziert.Warum beschwert sich MS Geography über dieses Polygon?

Da MS Geography die Koordinaten im Gegenuhrzeigersinn benötigt und ich keine Ahnung habe, welche Geozonen ich habe, erhalte ich die Koordinaten und bereite dann einen zweiten Satz in absteigender Reihenfolge vor. Dies ist nicht lat/long zu lang/lat, nur 1,2,3,4,5 zu 5,4,3,2,1:

DECLARE @MyPolygon geography 
DECLARE @FwdCoords varchar(max) = 'POLYGON((-33.871090 150.823941, -33.878274 150.823941, -33.878274 150.831348, -33.871090 150.831348, -33.871090 150.823941))' 
DECLARE @RevCoords varchar(max) = 'POLYGON((-33.871090 150.823941, -33.871090 150.831348, -33.878274 150.831348, -33.878274 150.823941, -33.871090 150.823941))' 

BEGIN TRY 
    RAISERROR('Attempt to make polygon from forward string', 0, 1) 
    SET @MyPolygon = geography::STPolyFromText(@FwdCoords, 4326) 
    PRINT @MyPolygon.ToString() 
END TRY 
BEGIN CATCH 
    RAISERROR('Attempt failed. Try with reversed coordinates', 0, 1) 
    IF @@ERROR <> 0 
    BEGIN 
     PRINT 'Proc: ' + ERROR_PROCEDURE() 
     PRINT 'Line: ' + CONVERT(VARCHAR(10), ERROR_LINE()) 
     PRINT 'Number: ' + CONVERT(VARCHAR(10), ERROR_NUMBER()) 
     PRINT 'Message: ' + ERROR_MESSAGE() 
    END 
    BEGIN TRY 
     RAISERROR('Attempt to make polygon from reversed string', 0, 1) 
     SET @MyPolygon = geography::STPolyFromText(@RevCoords, 4326) 
     PRINT @MyPolygon.ToString() 
    END TRY 
    BEGIN CATCH 
     IF @@ERROR <> 0 
     BEGIN 
      PRINT 'Proc: ' + ERROR_PROCEDURE() 
      PRINT 'Line: ' + CONVERT(VARCHAR(10), ERROR_LINE()) 
      PRINT 'Number: ' + CONVERT(VARCHAR(10), ERROR_NUMBER()) 
      PRINT 'Message: ' + ERROR_MESSAGE() 
     END 
    END CATCH 
END CATCH 

erhalte ich folgende Fehler

Line: 22 
Number: 6522 
Message: A .NET Framework error occurred during execution of user-defined routine or aggregate "geography": 
System.FormatException: 24201: Latitude values must be between -90 and 90 degrees. 
System.FormatException: 
    at Microsoft.SqlServer.Types.GeographyValidator.ValidatePoint(Double x, Double y, Nullable`1 z, Nullable`1 m) 
    at Microsoft.SqlServer.Types.Validator.BeginFigure(Double x, Double y, Nullable`1 z, Nullable`1 m) 
    at Microsoft.SqlServer.Types.ForwardingGeoDataSink.BeginFigure(Double x, Double y, Nullable`1 z, Nullable`1 m) 
    at Microsoft.SqlServer.Types.CoordinateReversingGeoDataSink.BeginFigure(Double x, Double y, Nullable`1 z, Nullable`1 m) 
    at Microsoft.SqlServer.Types.OpenGisWktReader.ParseLineStringText() 
    at Microsoft.SqlServer.Types.OpenGisWktReader.ParsePolygonText() 
    at Microsoft.SqlServer.Types.OpenGisWktReader.ParseTaggedText(OpenGisType type) 
    at Microsoft.SqlServer.Types.OpenGisWktReader.Read(OpenGisType type, Int32 srid) 
    at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid) 

Das Polygon ist ein Quadrat. Letzte Koordinate stimmt mit erster Koordinate überein. Mit Blick auf die Koordinaten sind sie alle in lat/lng, mit allen Lats = -33.etwas, gut innerhalb der -90 bis 90 Grenze

Von dem, was ich sehen kann, habe ich kein Problem mit ungültigen Lats oder Longs. Warum glaubt MS Geografie das?

Antwort

2

Sie haben Ihre Breiten- und Längengradwerte umgestellt. Wie können Sie das selbst beweisen?

DECLARE @g GEOGRAPHY = geography::STPointFromText('POINT(10 20)', 4326) 

SELECT @g.[Lat]; --returns 20 

Also, die WKT-Darstellung wird in (Länge, Breite) Paare sein.

+0
Verwandte Themen