intersectgeoquad

Пересечение двух четырёхугольников широты и долготы

Синтаксис

[latlim, lonlim] = intersectgeoquad(latlim1, lonlim1, latlim2, lonlim2)

Описание

[latlim, lonlim] = intersectgeoquad(latlim1, lonlim1, latlim2, lonlim2) вычисляет пересечение четырехугольника, заданное пределами широты и долготы latlim1 и lonlim1, с четырехугольником, заданным пределами широты и долготы latlim2 и lonlim2. latlim1 и latlim2 являются двухэлементными векторами вида [southern-limit northern-limit]. Точно так же lonlim1 и lonlim2 являются двухэлементными векторами вида [western-limit eastern-limit]. Все входные и выходные углы указаны в единицах степеней. Результаты пересечения приведены в выходе массивах latlim и lonlim. Учитывая произвольную пару входа четырёхугольников, существует три возможных результата:

  1. Четырехугольники не пересекаются. В этом случае оба latlim и lonlim являются пустыми массивами.

  2. Перекресток состоит из одного четырехугольника. В этом случае latlim (например latlim1 и latlim2) - двухэлементный вектор, имеющий вид [southern-limit northern-limit], где southern-limit и northern-limit представляют скалярные значения. lonlim (например lonlim1 и lonlim2), является двухэлементным вектором, который имеет вид [western-limit eastern-limit], с парой скалярных пределов.

  3. Перекресток состоит из пары четырёхугольников. Это может произойти, когда долготы обернуты таким образом, что восточный конец одного четырехугольника перекрывает западный конец другого и наоборот. Для примера, если lonlim1 = [-90 90] и lonlim2 = [45 -45], существует два интервала перекрытия: [-90 -45] и [45 90]. Эти пределы возвращаются в lonlim отдельными строками, образуя массив 2 на 2. В нашем примере (принимая, что пределы широты перекрываются) lonlim равен бы [-90 -45; 45 90]. У него все еще есть форма [western-limit eastern-limit], но western-limit и eastern-limit являются 2 на 1, а не скалярными. Два выходных четырехугольника имеют одинаковые пределы широты, но они реплицированы так, что latlim также является 2 на 2.

    Чтобы продолжить пример, если latlim1 = [0 30] и latlim2 = [20 50], latlim равен [20 30; 20 30]. Форма все еще [southern-limit northern-limit], но в данном случае southern-limit и northern-limit 2 на 1.

Примеры

Пример 1

Неинтерсекционные четырехугольники:

[latlim, lonlim] = intersectgeoquad( ...
                   [-40 -60], [-180 180], [40 60], [-180 180])
latlim =
     []

lonlim =
     []       

Пример 2

Перекресток является одним четырехугольником:

[latlim, lonlim] = intersectgeoquad( ...
                   [-40 60], [-120 45], [-60 40], [160 -75])

latlim =
   -40    40

lonlim =
  -120   -75

Пример 3

Пересечение - это пара четырёхугольников:

[latlim, lonlim] = intersectgeoquad( ...
                   [-30 90],[-10 -170],[-90 30],[170 10])
 
latlim =
   -30    30
   -30    30

lonlim =
   -10    10
   170  -170

Пример 4

Входы и выход полностью окружают планету:

[latlim, lonlim] = intersectgeoquad( ...
                   [-30 90],[-180 180],[-90 30],[0 360])

latlim =
   -30    30

lonlim =
  -180   180

Пример 5

Найдите и отобразите пересечение ограничивающих рамок смежных состояний США:

usamap({'Minnesota','Wisconsin'})
S = shaperead('usastatehi','UseGeoCoords',true,'Selector',...
    {@(name) any(strcmp(name,{'Minnesota','Wisconsin'})), 'Name'});
geoshow(S, 'FaceColor', 'y')
textm([S.LabelLat], [S.LabelLon], {S.Name},...
    'HorizontalAlignment', 'center')
latlimMN = S(1).BoundingBox(:,2)'

latlimMN =
   43.4995   49.3844

lonlimMN = S(1).BoundingBox(:,1)'

lonlimMN =
  -97.2385  -89.5612

latlimWI = S(2).BoundingBox(:,2)'

latlimWI =
   42.4918   47.0773

lonlimWI = S(2).BoundingBox(:,1)'

lonlimWI =
  -92.8892  -86.8059

[latlim lonlim] = ...
    intersectgeoquad(latlimMN, lonlimMN, latlimWI, lonlimWI)

latlim =
   43.4995   47.0773

lonlim =
  -92.8892  -89.5612

geoshow(latlim([1 2 2 1 1]), lonlim([1 1 2 2 1]), ...
    'DisplayType','polygon','FaceColor','m')

Совет

latlim1 и latlim2 обычно следует указывать в порядке увеличения числового значения. Никакая ошибка не возникнет, если, например, latlim1(2) < latlim1(1), но выходы будут пустыми массивами.

Никакие такие ограничения не применяются к lonlim1 и lonlim2. Первый элемент всегда интерпретируется как западный предел, даже если он превышает второй элемент (восточный предел). Кроме того, intersectgeoquad правильно обрабатывает любое соглашение о обертывании долготы, которое могло быть применено к lonlim1 и lonlim2.

С точки зрения выхода, intersectgeoquad обертывает lonlim так, что все элементы попадают в закрытый интервал [-180 180]. Это означает, что если (один из) выходного четырёхугольника (ов) пересекает 180 ° меридиан, его западный предел превышает его восточный предел. Результат был бы таким, что

lonlim(2) < lonlim(1)
если перекресток содержит один четырехугольник или
lonlim(k,2) < lonlim(k,1)
где k равен 1 или 2, если пересечение содержит пару четырехугольников.

Если abs(diff(lonlim1)) или abs(diff(lonlim2)) равен 360, его четырехугольник интерпретируется как широтная зона, которая полностью окружает планету, ограниченную только одной параллелью на юге и другой параллелью на севере. Если два таких четырёхугольника пересекаются, lonlim установлено в [-180 180].

Если вы хотите отобразить географические четырёхугольники, сгенерированные этой функцией или любыми другими, которые имеют более чем одна или две степени в длину, они могут не очень хорошо следовать изогнутым меридианам и параллелям. Степень отправления зависит от степени четырехугольника, проекции карты и шкалы карты. В таких случаях можно интерполировать промежуточные вершины вдоль ребер четырёхугольника с outlinegeoquad функция.

См. также

|

Введенный в R2008a