Сохранение типа данных географии в 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 Используется для отправки пространственных данных по сети. Таким образом, он преобразует экземпляр в байты [], которые могут сохраняться в базе данных.