Создать многоугольник (прямоугольник) из минимальной и максимальной широт / длинных

Учитывая широту / долготу, представляющую точку на юго-западе, и широту / долготу, представляющую точку на северо-востоке. Когда я создаю многоугольник, он должен работать в SQL 2008...

Вот мой SQL:

   DECLARE @minX varchar(10) = N'49.871159'
    DECLARE @maxX varchar(10) = N'55.811741'
    DECLARE @minY varchar(10) = N'-6.379880'
    DECLARE @maxY varchar(10) = N'1.768960'

    DECLARE @boundingRect varchar(150)
    SET @boundingRect = 'POLYGON((' + @minX + ' '  + @minY + ', ' + @minX + ' ' + @maxY + ', ' + @maxX + ' ' + @maxY + ', ' + @maxX + ' ' + @minY + ', ' + @minX + ' ' + @minY + '))'
    SELECT GEOGRAPHY::Parse(@boundingRect)

Но он дает мне следующую ошибку: "Указанный ввод не представляет допустимый экземпляр географии, потому что он превышает одно полушарие".

Может кто-нибудь сказать мне, что я делаю не так? Ограничительный прямоугольник в моем примере должен примерно охватывать Великобританию, и я предполагаю, что мне нужно указать 5 точек - внизу слева, вверху слева, вверху справа, внизу справа и снова внизу слева.

1 ответ

Решение

Во-первых, это не связано с тем, что вы пересекаете главный меридиан в своем прямоугольнике и находитесь в восточном и западном полушарии. Это просто совпадение.

В SQL Geography используется правило левой руки, так что когда наблюдатель обходит ваше кольцо в указанном порядке, внутренняя часть фигуры всегда находится слева от него. Для внешних колец это означает, что кольцо определено против часовой стрелки. По этому правилу вашим оригинальным прямоугольником является весь мир за пределами Великобритании, который, конечно, больше, чем полушарие.:)

Так что просто измените порядок ваших точек в операторе POLYGON (также я переключил ваши значения X и Y, это не влияет на правильность утверждения, но это заставляет карту выглядеть как long/lat для СОЕДИНЕННОЕ КОРОЛЕВСТВО)

DECLARE @minY varchar(10) = N'49.871159'
DECLARE @maxY varchar(10) = N'55.811741'
DECLARE @minX varchar(10) = N'-6.379880'
DECLARE @maxX varchar(10) = N'1.768960'

DECLARE @boundingRect varchar(150)
SET @boundingRect = 'POLYGON((' + @minX + ' '  + @minY + ', ' + 
                                                   @maxX + ' ' + @minY + ', ' + 
                                                   @maxX + ' ' + @maxY + ', ' + 
                                                   @minX + ' ' + @maxY + ', ' + 
                                                   @minX + ' ' + @minY + '))'
Другие вопросы по тегам