Ошибка географической широты и долготы SQL Server

Я использую тип данных geography для вычисления кратчайшего расстояния.

CREATE TABLE Landmark (
    Id int,   
    Latitude FLOAT,
    Longitude FLOAT
)

INSERT Landmark VALUES
(1, 49.242458, -123.153465),
(2, 49.249381, -122.866683)

WITH GeographyLandmark AS
(
    SELECT Id, geography::STPointFromText('POINT(' + CAST(Latitude AS VARCHAR(20)) + ' ' + CAST(Longitude AS VARCHAR(20)) + ')', 4326) Location
    FROM Landmark
)

--this query calculates distance between point and localizations in meters
SELECT Id, geography::STPointFromText('POINT(' + CAST(49.2424566 AS VARCHAR(20)) + ' ' + CAST(-123.1534623 AS VARCHAR(20)) + ')', 4326).STDistance(Location) Distance
FROM GeographyLandmark

Но я получаю эту ошибку:

Ошибка .NET Framework произошла во время выполнения определяемой пользователем подпрограммы или агрегированного «географии»: System.FormatException: 24201: значения широты должны находиться в диапазоне от -90 до 90 градусов. System.FormatException: в Microsoft.SqlServer.Types.GeographyValidator.ValidatePoint (Double x, Double y, Nullable1 z, Nullable1 m) в Microsoft.SqlServer.Types.Validator.BeginFigure (Double x, Double y, Nullable1 z, Nullable1 m) в Microsoft.SqpeslServer.Types .ForwardingGeoDataSink.BeginFigure (Двойной x, Двойной y, Nullable1 z, Nullable1 м) в Microsoft.SqlServer.Types.CoordinateReversingGeoDataSink.BeginFigure (Двойной x, Двойной y, Nullable1 z, Nullable1 м) в Microsoft.SqlServer.TownParse.WellanType. .SqlServer.Types.WellKnownTextReader.ParseTaggedText (тип OpenGisType) в Microsoft.SqlServer.Types.WellKnownTextReader.Read (тип OpenGisType, тип Int32 srid) в теге Microsoft.SqlServergedTextlus. Microsoft.SqlServer.Types.SqlGeography.GeographyFromText (тип OpenGisType, SqlChars taggedText, Int32 srid).

В чем проблема?


person bbusdriver    schedule 08.09.2018    source источник


Ответы (1)


Похоже, вы поменяли местами широту и долготу. Пара вещей:

  1. Простая проверка работоспособности - использовать расширенные свойства Lat и / или Long. Вот документ для Long.

  2. Еще одно расширение, которое предоставляет реализация Microsoft, - это Point статический метод создания точек. Поэтому вместо того, чтобы создавать WKT для перехода точки в STPointFromText, вы можете просто сделать geography::Point(Latitude, Longitude, SRID). Вот doc для этого.

person Ben Thul    schedule 09.09.2018