Пересечение двух четырехугольников долготы широты
[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
. Учитывая произвольную пару входных четырехугольников, существует три возможных результата:
Четырехугольникам не удается пересечься. В этом случае и latlim
и lonlim
являются пустыми массивами.
Пересечение состоит из одного четырехугольника. В этом случае latlim
(как latlim1
и latlim2
) является двухэлементным вектором, который имеет форму [southern-limit northern-limit]
, где southern-limit
и northern-limit
представляют скалярные значения. lonlim
(как lonlim1
и lonlim2
), двухэлементный вектор, который имеет форму [western-limit eastern-limit]
с парой скалярных пределов.
Пересечение состоит из пары четырехугольников. Это может произойти, когда долготы повторяются таким образом, что восточный конец одного четырехугольника перекрывает западный конец другой и наоборот. Например, если 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.
Непересечение четырехугольников:
[latlim, lonlim] = intersectgeoquad( ... [-40 -60], [-180 180], [40 60], [-180 180]) latlim = [] lonlim = []
Пересечение является одним четырехугольником:
[latlim, lonlim] = intersectgeoquad( ... [-40 60], [-120 45], [-60 40], [160 -75]) latlim = -40 40 lonlim = -120 -75
Пересечение является парой четырехугольников:
[latlim, lonlim] = intersectgeoquad( ... [-30 90],[-10 -170],[-90 30],[170 10]) latlim = -30 30 -30 30 lonlim = -10 10 170 -170
Входные параметры и вывод полностью окружают планету:
[latlim, lonlim] = intersectgeoquad( ... [-30 90],[-180 180],[-90 30],[0 360]) latlim = -30 30 lonlim = -180 180
Найдите и сопоставьте пересечение ограничительных рамок смежных штатов США:
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
.