2014-01-07 2 views
3

У меня есть шейп-файл с амазонкими большими реками. Только шейп-файл содержит 37,9 МБ, а таблица атрибутов - до 42,1 МБ. Я генерирую PNG-изображения всех бразильских Amazon, размером 1260x940 пикселей, и все эти данные в шейп-файле только замедляют рисование каждой карты, поэтому я хочу упростить ее.R упростить шейп-файл

Функция gSimplify в пакете rgeos, кажется, упрощает каждый многоугольник, а не избавляет от меньших. Я пробовал это с точностью до 0,1 и 1000, и всегда получаю длину (shp @ polygons) одинаковое значение: 27633. И последний сюжет занимает почти одно и то же время, чтобы рисовать. Мне нужна функция, о которой я говорю, что окончательный растровый формат будет 1260x940 пикселей, поэтому он может удалить каждую ненужную точку. Есть ли функция для этого?

Заранее спасибо.

+3

Это не R решение, но я бы Рекомендовать mapshaper.org. Очень легко загрузить шейп-файл и поэкспериментировать с различными уровнями упрощения, а затем сохранить. Я нашел это очень полезным для ускорения построения карты в R. – Andy

+0

Спасибо @ Andy! Оно работало завораживающе. И действительно приятно изменить уровень упрощения и увидеть результаты в реальном времени. Но я все же хотел бы использовать R для этого, поскольку вопрос все еще здесь (и в один прекрасный день этот сайт может выйти из досягаемости). – Rodrigo

+0

Не беспокойтесь @Rodrigo, ваше желание понятно, я чувствовал себя аналогичным образом 4 года назад и попытался найти хорошее решение R, в конце концов отказавшись. За это время улучшилась карта. Если вы найдете хорошее решение R, которое я хотел бы услышать. – Andy

ответ

2

Довольно комплексное решение здесь: http://www.r-bloggers.com/simplifying-polygon-shapefiles-in-r/

Таким образом, вы должны получить участки ваших полигонов:

area <- lapply([email protected], function(x) sapply([email protected], function(y) [email protected])) 

, где реки это вы шейпфайл объект в R.

Затем выяснить большие полигоны и хранить их:

sizeth <- 0.001 #size threshold of polygons to be deleted 
    mainPolys <- lapply(area, function(x) which(x > sizeth)) 

    [email protected] <- [email protected][-c(1:2),] 
    [email protected] <- [email protected][-c(1:2)] 
    [email protected] <- 1:length([email protected]) 
    mainPolys <- mainPolys[-c(1:2)] 

    for(i in 1:length(mainPolys)){ if(length(mainPolys[[i]]) >= 1 && 
    mainPolys[[i]][1] >= 1){ 
     [email protected][[i]]@Polygons <- [email protected][[i]]@Polygons[mainPolys[[i]]] 
     [email protected][[i]]@plotOrder <- 1:length([email protected][[i]]@Polygons) } } 

Это может быть не достаточно хорошо, и вы, возможно, не хотите, чтобы удалить все полигоны, в этом случае функция дп() из shapefiles пакета будет делать трюк:

res <- 0.01 #the argument passed to dp() which determines extent of simplification. Increase or decrease as required to simplify more/less  
for(i in 1:length([email protected])){ 
     for(j in 1:length([email protected][[i]]@Polygons)){ 
     temp <- as.data.frame([email protected][[i]]@Polygons[[j]]@coords) 
     names(temp) <- c("x", "y") 
     temp2 <- dp(temp, res) 
     [email protected][[i]]@Polygons[[j]]@coords <- as.matrix(cbind(temp2$x, temp2$y)) 
     } 
    } 
+0

Спасибо за ваш ответ, карнавал, но это совсем не ясно. реки @ данные <- river @ data [-c (1: 2)], это удаляет первые две части данных рек @. Мой шейп-файл имеет 27633 штуки. Он сказал: «Когда мы смотрим на mainPolys, мы видим, что первые две более крупные группы полигонов не имеют в них значительных размеров полигонов». Как он это увидел? Спасибо. – Rodrigo