Сделать большую карту ggmap без нехватки оперативной памяти

Как лучше всего сделать карту большого экстента и высокого разрешения, желательно в ggmap, без нехватки оперативной памяти?

Предыстория: я пытаюсь сделать большую карту своего города с помощью ggmap. Я говорю большой, потому что я хочу, чтобы карта была достаточно подробной, чтобы сохраненный PDF-файл можно было увеличить, а названия улиц все еще можно было прочитать. Я думаю, что уровень масштабирования около 15 сделает это.

Проблема в том, что я продолжаю сбоить свой компьютер из-за нехватки памяти. Есть ли какие-то секреты, как заставить что-то подобное работать? Карта, которую я хочу загрузить, имеет ~ 1100 тайлов. Я могу загрузить его и даже начертить в R, но попытка сохранить его приводит к сбою R. Я мог видеть, что делаю это по частям, а затем сшиваю в чем-то вроде фотошопа, но это кажется глупым. Мне кажется, что ggmap (и ggplot2) много чего делает в памяти, и мне интересно, есть ли способ записать эти файлы прямо на диск.

Спасибо за любую помощь, которую вы можете предложить!


person forlooper    schedule 16.03.2014    source источник
comment
Вы можете использовать object.size для оценки размера объекта R и memory.size для просмотра/увеличения объема памяти, который R использует в вашей системе. Вы также можете попробовать собрать его по частям или использовать облачный сервер.   -  person Rich Scriven    schedule 16.03.2014
comment
Возможно, вы можете построить свою карту прямо в pdf, например. КаирPDF? Это помогло мне с построением огромных файлов shp.   -  person Maciej    schedule 16.03.2014
comment
@RScriv идея использования облачного сервера хороша. Спасибо. Я как бы предварительно выделял память для задач, но мне просто не хватает памяти с моим текущим методом, чтобы это имело значение.   -  person forlooper    schedule 16.03.2014
comment
@Maciej спасибо за это. Я еще не заглядывал в CairoPDF. Я проверю это.   -  person forlooper    schedule 16.03.2014


Ответы (1)


Я думаю, что у вас есть две проблемы:

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

Одним из решений является использование функции ggsave() в ggplot2 для вывода в скалярную векторную графику (.svg).

Например:

library(ggplot2)
# Create dummy data
y=data.frame(matrix(rnorm(10000,5),ncol=2))
paste(object.size(y)/1e6,"mB")

# Save to image file
image=ggplot(data=x,aes(x=X1,y=X2))+geom_point()

# Write image to file
ggsave(filename="test.svg",plot=image,width=10,height=8,units="cm")

Если вам не нужен файл .svg, я бы предпочел файл .png. Вы можете посмотреть атрибут res в png() здесь< /а>

2. Вы одновременно замышляете что-то очень большое.

Здесь все становится интереснее. Вы можете посмотреть на создание изображения, используя многоуровневый подход. То есть: нарисуйте многоугольники/линии/точки из большого набора данных по их идентификатору/группировке (я не уверен, как именно выглядят ваши данные - надеюсь, это поможет). Я дал демонстрацию для некоторого вдохновения:

# Write to .svg
enter code here

# Make dummy data
test_data=data.frame(matrix(c(1,2.5,3,3,1.5,2,2,2,1,1,3,1,0,1),ncol=2))
test_data$id=c('a','a','a','a','b','b','b')

#Plot data
plot(c(1,2),c(3,3),xlim=c(0,4),ylim=c(0,4),pch=15,col='red')

#Plot layers in big dataframe
by(test_data[,c("X1","X2")],INDICES=test_data$id,polygon)

Функция by() очень удобна для создания многослойных графиков. Это значительно быстрее, чем цикл for() в R.

person slimCity    schedule 16.03.2014
comment
Я изначально выводил в формате pdf, поэтому я думаю, что пропускал проблемы с растровой графикой. Хотя это хороший совет. Кроме того, вторая часть вашего ответа действительно помогает! То, что я сделал до того, как люди ответили, сработало, но после этого мой компьютер пришлось перезагрузить, и это заняло ДОЛГОЕ время. Я записал карту напрямую в pdf с помощью ggsave(), затем загрузил ее в фотошоп и заставил масштабировать изображение до размера плаката, затем я вывел его в формате jpg, и полученное изображение было очень подробным и достаточно маленьким для распространения. Ваше решение выглядит лучше, я собираюсь изучить это сейчас. Спасибо! - person forlooper; 16.03.2014