2016-11-26 7 views
3

Я использую R с пакетами maps/mapproject/maptools для построения некоторых карт и заметил поведение, которое кажется противоречащим интуиции меня и фактически ограничивает то, что я могу сделать.Использование проекции с xlim/ylim в R с пакетом «maps» приводит к увеличению карты

Составление карты Европы (с границы, взятые из ETRS89/ETRS-LCC, так что без Исландии, а также обрезаны на Востоке) без указания какой-либо проекции:

library(maps) 
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T) 

Europe map without projection specified

Результат, как и ожидалось , используются лимиты и последующая их карта.

Проекция используется по умолчанию отображений, в соответствии с помощью:

The default is to use a rectangular projection with the aspect ratio 
chosen so that longitude and latitude scales are equivalent at the 
center of the picture. 

Это не является хорошей проекцией для моих потребностей, я буду использовать проекцию LCC с параллелями, как указано в приведенном выше spatialreference .org ссылка:

library(maps) 
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T, projection="lambert", parameters = c(45,65)) 
box() 

Europe map with projection specified

в результате неожиданного в том, что она включает в себя гораздо большую площадь (идет очень далеко на север и вк Россия), что делает карту непригодной для использования.

Что чужак, что при использовании сетки первоначальные пределы четко считаются:

library(maps) 
library(mapproj) 
map("world",xlim=c(-10.67,34.5),ylim=c(31.55,71.05), interior = T, projection="lambert", parameters = c(45,65)) 
map.grid(cex=0.1 , col="grey30") 
box() 

Europe map with LCC projection and grid

То, что я хотел бы иметь (и то, что я предположил бы результатом приведенного выше кода) была прямоугольной культурой, которая включала указанные пределы (скорректированные из-за проекции, используемой так, чтобы иметь больше площади, чем прямоугольная, указанная выше). Кроме того, вокруг карты есть пробел и граница, которая присутствует всякий раз, когда вы используете проекцию с map().

Вопрос: есть ли способ получить этот результат при использовании map/mapproj/maptools? Я попытался искусственно изменить xlim/ylim без хороших результатов, поскольку он, кажется, работает с большими интервалами (т. Е. Их изменение не приводит к эффекту, пока внезапно половина Европы не исчезнет со следующим декретом).

ответ

1

Оценки, данные на пространственной ссылке, приведены как «нижняя левая верхняя правая координата», которая по совпадению приближается к тому, что вы написали. Правильно эти координаты будут следующими:

xlim=c(-10.6700,31.5500), ylim=c(34.5000,71.0500) 

Но это не похоже на проблему.

Параллельно со вторым параметром xlim кажется, что map() пытается включить соседние линии, если некоторые из этих координат линии находятся в пределах. Страна России вписывается (что вызывает огромный скачок около 29-31 по второму параметру xlim), наряду с некоторыми странами Африки и Восточной Европы. Включение и выключение boundary несколько подтверждает это, но это скрывает множество границ страны.

Обходной путь, который я нашел, заключался в том, чтобы вначале исключить из соседних стран, чтобы они были нарисованы. Затем нарисуйте карту второй раз, используя add=T.Используйте col="white" на первом рисунке, чтобы не рисовать в одном и том же месте дважды, он утолщает линии.

library(maps) 
library(mapproj) 
map("world",regions="(?!Russia|Morocco|Algeria|Tunisia|Turkey|Ukraine)",col="white",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), interior=T, projection="lambert", parameters=c(10.44,52.775)) 
map("world",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), interior=T, projection="lambert", parameters=c(10.44,52.775),add=T) 
map.grid(cex=0.1, col="grey30") 
box() 

Там, кажется, некоторые линии отсутствуют все еще из-за xlim и ylim, удаление, который будет включать в себя снова Исландии и других стран и островов. Или, может быть, есть лучший подход.

resulting plot

+0

Привет, я уже принял, но забыл прокомментировать. Это работает для меня, даже если это действительно немного затянуто (но нужно преодолеть способ его работы). Объяснения @ alex-deckmyn в деталях объясняют, почему он работает таким образом, но по существу согласуется с вашим анализом. – fsmunoz

2

Основное поведение «карты()», чтобы извлечь все строки в пределах xlim и ylim, но и линии, которые частично в области извлекаются из базы данных. Когда нет проекции, xlim и ylim также используются в качестве ограничений для графика, но когда прогнозируются данные, которые, очевидно, не будут работать. (Вы не можете просто проецировать xlim и ylim, так как это не будет прямоугольный домен). Код карты недостаточно сложный, чтобы найти хорошее решение и просто устанавливает границы сюжета в диапазон данных (включая любые нежелательные линии). Как (недавний) сторонник «карт», это на самом деле то, что я могу попытаться исправить. К сожалению, mapproj не включает в себя обратные проекции, которые необходимы для правильной работы, как и следовало ожидать. Ограничение карты внизу (вместо продолжения вверху) намного проще.

В качестве обходного пути, вы можете попробовать следующее (используя значение выходного сигнала карты):

mymap <- map("world",xlim=c(-10.6600,31.5500), ylim=c(34.5000,71.0500), projection="lambert", parameters=c(10.44,52.775), plot=FALSE) 

Теперь вы можете посмотреть на диапазон MyMap $ х и MyMap $ у:

range(mymap$x, na.rm=TRUE) 

или просто plot(mymap), чтобы увидеть диапазон и решить, какой интервал вам нужен.

Тогда, наконец, вы можете построить карту с точно пределы, которые вы хотите, например

plot(mymap, type="l", asp=1,xaxt="n",yaxt="n",xlab="",ylab="", xlim=c(-0.2,0.15), ylim=c(-0.75,-0.35)) 

Не идеально, но, надеюсь, достаточно хорошо. «Asp = 1» - сохранить правильное соотношение сторон на карте, даже если вы измените размер окна графика.

+0

Большое спасибо за ваш ответ, теперь я понимаю причины, и это полезно. На самом деле это правильно, но для моих рабочих целей я уже принял @chkri. Я работаю над этим с точки зрения того, кто-то использует его для археологических статей, и было бы здорово, если бы был доступен более прямой путь к нему. – fsmunoz

+0

На карте v3.2 (июнь 2017 г.) map() имеет новый параметр lforce для ограничения принудительного исполнения на проецируемых картах. Значение по умолчанию: «n» (none) ». Если lforce =« e », данные карты ограничены точно до заданных пределов до проецирования. Это влияет на выходное значение карты, а не только на окно графика. Если lforce =" s », проецируются четыре угла, определяемые xlim и ylim, и окно графика ограничено наибольшим прямоугольником внутри этой области.« l »приведет к большему прямоугольнику, который включает в себя четыре угла. Однако части, которые выходят за пределы оригинала пределы могут быть неполными. –

 Смежные вопросы

  • Нет связанных вопросов^_^