Сохранение типа данных географии в sql

Я пытаюсь добавить данные в поле географии в SQL, используя C# ASP. сеть.

При добавлении POINt или LINESTRING я не получаю ошибок, но при добавлении POLYGON я получаю следующую ошибку;

  Message: [DataConnection.HandleError]: Query: Proc_CSA_AssetUpdateLocation: caused exception: A .NET Framework error occurred during execution of user-defined routine or aggregate "geography": 
System.ArgumentException: 24200: The specified input does not represent a valid geography instance.
System.ArgumentException: 
at Microsoft.SqlServer.Types.SqlGeography.ConstructGeographyFromUserInput(GeoData g, Int32 srid)
at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)
at Microsoft.SqlServer.Types.SqlGeography.Parse(SqlString s)

Данные, которые я передаю (например);

POLYGON((54.40854093377361 -6.197662353515625, 54.422126065167866 -6.212425231933594, 54.43011521616425 -6.164703369140625, 54.41093863702367 -6.128997802734375, 54.40094728183984 -6.150970458984375, 54.40854093377361 -6.197662353515625))

сохраненный процесс:

@Name nvarchar(20),
    @ModifiedWhen DateTime,
    @itemGUID UniqueIdentifier,
    @GeoLocs nvarchar(max),
    @Type int

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    UPDATE dbo.csa_AssetGeoData 
    Set ItemModifiedWhen = @ModifiedWhen,GeoCord = @GeoLocs,GeographyTypeItemID = @Type, Name = @Name
    WHERE ItemGUID = @itemGUID

К сожалению, где бы я ни смотрел, я не могу найти причину ошибки в моих данных.

У меня вопрос, что может быть причиной этой ошибки?

Я могу предоставить больше информации, если это необходимо, извините, если это слишком расплывчато (неинформативно).

3 ответа

Решение

ОК, я понял это. Это не нравится, когда ваши линии многоугольника пересекаются. Не уверен, почему, но это спасает не перекрещенные и не скрещенные.

Вы можете попытаться передать строковое представление и проанализировать его в скрипте, подобно этому:

SET @g = geometry::Parse('POLYGON((1 3, 1 3, 1 3, 1 3))');

Я взял эту строку со страницы многоугольника MSDN.

Согласно этому блогу, кольцевая ориентация SQL Spatial MSSQL является левшей. Есть много способов проверить правильность функции. Вот пример

        if (polygon.MakeValidIfInvalid().EnvelopeAngle() > 90)
        {

            region.Shape = polygon.ReorientObject().Serialize().Value;
        }
        else
        {
            region.Shape = polygon.Serialize().Value;
        }

Сериализация в SQLGeography Используется для отправки пространственных данных по сети. Таким образом, он преобразует экземпляр в байты [], которые могут сохраняться в базе данных.

Другие вопросы по тегам