2014-01-07 3 views
3

나는 아마존 강이있는 형태 파일을 가지고 있습니다. shapefile 단독으로 37.9 MB, 속성 테이블과 함께 42.1 MB까지 올라갑니다. 저는 각 1260x940 픽셀의 모든 브라질 아마존의 PNG 이미지를 생성하고 있으며, shapefile의 모든 데이터는 각지도의 드로잉 속도를 늦추기 때문에 단순화하고 싶습니다.R 모양 파일 단순화

gSimplify 함수는 rgeos 패키지에서 각 폴리곤을 단순화하는 것처럼 보이며 더 작은 폴리곤을 제거하지 않는 것처럼 보입니다. 나는 그것을 0.1과 1000의 허용 오차로 시도했다. 그리고 항상 길이 (shp @ polygons)에 같은 값인 27633을 얻는다. 그리고 마지막 플롯은 그릴 때 거의 같은 시간이 걸린다. 최종 래스터가 1260x940 픽셀이 될 것이라고 말하는 함수가 필요하므로 모든 불필요한 점을 제거 할 수 있습니다. 거기에 할 수있는 기능이 있습니까?

미리 감사드립니다. 여기

+3

이는 R 솔루션 아니지만 내가 좋겠 mapshaper.org를 추천하십시오. 셰이프 파일을로드하고 다른 레벨의 단순화로 실험하고 다시 저장하는 것은 매우 쉽습니다. 나는 이것을 매우 유용하게 사용하여 R에서지도 작성 속도를 높일 수 있었다. – Andy

+0

Thanks @Andy! 그것은 매력처럼 작동했습니다. 그리고 단순화 수준을 변경하고 결과를 실시간으로 확인하는 것이 좋습니다. 하지만 질문은 여전히 ​​여기에 있기 때문에 (그리고 언젠가는 사이트가 멀어 질 수도 있으므로) R을 사용하여 계속하고 싶습니다. – Rodrigo

+0

걱정하지 마십시오 @Rodrigo, 당신의 소원은 이해할 수 있습니다, 나는 4 년 전에 비슷한 느낌과 좋은 R 솔루션을 찾으려고 노력, 결국 포기. mapshaper는 그 시간 동안 더 좋아졌습니다. 당신이 좋은 R 해결책을 찾으면 나는 듣고 싶을 것이다. – Andy

답변

2

꽤 포괄적 인 솔루션 :

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

을 다음

알아낼 강 R.

에서 Shape 파일 객체는 당신입니다 : http://www.r-bloggers.com/simplifying-polygon-shapefiles-in-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 패키지에서 DP() 함수는 트릭을 할 것입니다 경우에 어떤 다각형을 삭제할되지 않을 수 있습니다

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

답장을 보내 주셔서 감사합니다,하지만 그것은 명확하지 않습니다. rivers @ data <- rivers @ data [-c (1 : 2),] 이것은 첫 번째 두 조각의 강을 제거합니다. 내 셰이프 파일은 27633 개입니다. 그는 "우리가 mainPolys를 볼 때 처음 두 개의 큰 폴리곤 그룹에는 큰 폴리곤이 없다는 것을 알 수있다"고 말했다. 어떻게 보았 니? 고맙습니다. – Rodrigo