Вам удалось запустить STBuffer на MULTIPOLYGONS?С SQL Server? - PullRequest
1 голос
/ 03 июня 2019

В геопространственном SQL Server я не могу запустить STBuffer для MULTIPOLYGONS.

DECLARE @g geography = geography::STMPolyFromText('MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 1)))', 4326);  

SELECT @g   -- no problem to run
SELECT @g.ToString()  -- no problem to run
SELECT @g.STBuffer(1).ToString();  -- error

Возвращенная ошибка:

Сообщение 6522, уровень16, состояние 1, строка 64
Ошибка .NET Framework при выполнении пользовательской подпрограммы или совокупной «географии»:

System.ArgumentException: 24144: эта операция не может быть завершена, поскольку экземпляр являетсянедействительный.Используйте MakeValid для преобразования экземпляра в допустимый экземпляр.Обратите внимание, что MakeValid может вызвать незначительное смещение точек экземпляра геометрии.System.ArgumentException:

1 Ответ

0 голосов
/ 03 июня 2019

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

Выполнение того же кода с geometry типом данных, похоже, работает.

DECLARE @g geometry = geometry::STMPolyFromText('MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 1)))', 4326);  

select 
    geoMultiPolys = @g, 
    geoMultiPolysString = @g.ToString(),
    buffered = @g.STBuffer(1),
    bufferedString = @g.STBuffer(1).ToString(),
    IsValid = @g.STIsValid()

Results

Buffered Spatial Polygon

Точно так же этот работает для географии

DECLARE @g geography = geography::STMPolyFromText('MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))', 4326);  

select 
    geoMultiPolys = @g, 
    geoMultiPolysString = @g.ToString(),
    buffered = @g.STBuffer(1),
    bufferedString = @g.STBuffer(1).ToString(),
    IsValid = @g.STIsValid()

valid SQL geography

...