exponenta event banner

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