Почему MS Geography жалуется на этот полигон?

Я пытаюсь преобразовать некоторые координаты в объект географии. Ниже приведена простая тестовая программа, воспроизводящая проблему.

Из-за того, что MS Geography требует координаты в направлении против часовой стрелки, и я понятия не имею, в каких геозонах я нахожусь, я получаю координаты, а затем готовлю второй набор, отсортированный в порядке убывания. Это не широта/долгота в долготу/широта, а просто 1,2,3,4,5 в 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

Я получаю следующую ошибку

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)

Многоугольник представляет собой квадрат. Последняя координата соответствует первой координате. Глядя на координаты, они все в широте/долготе, со всеми широтами = -33.что-то, в пределах от -90 до 90.

Из того, что я вижу, у меня нет проблем с недопустимыми латами или длинными. Почему MS Geography считает, что я знаю?


person Hecatonchires    schedule 28.07.2016    source источник


Ответы (1)


У вас поменялись местами значения широты и долготы. Как вы могли доказать это себе?

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

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

Итак, представление WKT будет в парах (долгота, широта).

person Ben Thul    schedule 28.07.2016