2017-05-19 3 views
0

나는 R과 반짝 이는 꽤 초보자입니다. 나는 origin-destination 흐름 데이터를 탐색 할 수있는 응용 프로그램을 만들려고 노력해 왔습니다. 원산지 영역 번호, 대상 영역 번호 및 정보 필드 묶음과 함께 영역의 모양 파일을 폴리곤으로 가지고있는 CSV를 가져 와서 특정 영역으로 또는 특정 영역에서의 흐름을 묘사 할 수 있습니다. 실제로 작동하는 반짝 이는 애플 리케이션을 가지고 있지만 너무 비효율적이거나 어쩌면이 작업에 적합한 도구가 아닐 수도 있습니다. 아래 코드를 붙여 넣습니다.셰이프 파일 및 CSV에서 전단지를 생성하는 반짝이는 앱입니다. 대형 shapefiles와 충돌

내 문제는 너무 많은 메모리를 사용하는 것 같습니다. 적은 수의 영역에서는 작동하지만 속도가 매우 느립니다 (처음에는로드가 오래 걸리고 입력 중 하나가 변경 될 때마다 업데이트됩니다). 더 큰 문제는 내가 수백 또는 수천 개의 영역을 가진 대용량 영역 시스템에서 일반적으로 수백만 개의 정점을 가지고 작업한다는 것입니다. 이 큰 영역 시스템 중 하나에이 기능을 적용하려고하면 초기에로드되지만 두 개 또는 세 개의 이동 (확대/축소 또는 패닝) 또는 한 번의 입력 변경 후에 RStudio가 충돌합니다.

이렇게하면 더 효율적으로 만들 수있는 방법이 있는지 또는 RStudio/Shiny가 이와 같은 용도로 사용되지는 않을지 궁금합니다. 최적화에 대해서는 꽤 우둔한 점을 염두에 두십시오. 설명을 약간 어리둥절하게 만들면 고맙겠습니다.

library(shiny) 
library(rgdal) 
library(sp) 
library(leaflet) 
library(RColorBrewer) 

shape <- readOGR(dsn=".", layer="zones") 
shape <- spTransform(shape, CRS("+init=EPSG:4326")) 

다음, 데이터를 Shape 파일 읽기 :

가 작동하는 응용 프로그램입니다. 'i'와 'j'는 출발지와 목적지 존 번호입니다. 지도를 만들 수있는 필드 목록이 필요하며 숫자로 된 필드로 구성되어야합니다. 루프없이 부분 집합하는 방법을 찾지 못했습니다. 그것에 대한 도움을 주시면 감사하겠습니다.

values <- read.csv("values.csv") 
zonelist <- sort(unique(c(values$i, values$j))) 
zones <- length(zonelist) 
fieldlist <- as.vector(character()) 
fields <- 0 
for (valname in colnames(values)){ 
    if (valname != "i" & 
     valname != "j" & 
     is.numeric(values[[valname]]) 
    ) { 
     fields <- fields + 1 
     fieldlist[fields] <- valname 
     } 
} 

그리고 저는 그것을 매트릭스 mm에 넣을 것입니다. 다시 말하지만, 이렇게하는 더 효율적인 방법은 환영받을 것입니다.

mm <- array(numeric(), dim=c(fields,zones,zones)) 
mm[,,] <- 0 
valarray <- array(numeric(), dim=fields*zones*zones) 
valarray[] <- 0 
for (k in 1:length(values)){ 
    if (colnames(values)[k] %in% fieldlist) { 
    valarray[(values$j - 1) * zones * fields 
      + (values$i - 1) * fields 
      + which(colnames(values)[k] == fieldlist) 
      ] <- values[[k]] 
    } 
} 
mm[,,] <- valarray 

인터페이스는 간단합니다. 참조 영역에서 /로 선택하고 참조 영역을 선택하고 매핑 할 숫자 필드를 선택하십시오. 흐름의 전단지를 보여줍니다.

ui <- fluidPage(
    titlePanel("Interzonal values mapping"), 
    sidebarLayout(
     sidebarPanel(
     selectInput(inputId = "ft", label = "From/to zone", choices = c("from", "to")), 
     selectInput(inputId = "zn", label = "Reference zone", choices = zonelist), 
     selectInput(inputId = "fl", label = "Field to map", choices = fieldlist), 
     width = 2 
    ), 
    mainPanel(leafletOutput("mapped_zonelist", height = 800), 
      width = 10) 
    ) 
) 

는 서버의 입력에 따라 매트릭스 mm에서 벡터로서 전압 (Vs) 맵핑하는 흐름을 포착하고, 흐름 값에 따른 존 맵 포맷.

server <- function(input, output) { 
    m <- reactive({ 
    if (input$ft == "from"){ 
     vs <- mm[which(input$fl == fieldlist), as.numeric(input$zn), ] 
     } else { 
     vs <- mm[which(input$fl == fieldlist), , as.numeric(input$zn)] 
     } 

    c_weight <- numeric() 
    c_weight[1:zones] <- 1 
    c_weight[as.numeric(input$zn)] <- 2 
    c_color <- character() 
    c_color[1:zones] <- "blue" 
    c_color[as.numeric(input$zn)] <- "black" 

    leaflet() %>% 
     addTiles() %>% 
     addPolygons(data=shape, 
        fillOpacity = 0.7, 
        opacity = 0.8, 
        weight = c_weight[[email protected]$n], 
        color = c_color[[email protected]$n], 
        fillColor = colorNumeric(palette = brewer.pal(10, "RdBu"), domain = vs)(vs[[email protected]$n]), 
        popup = paste0("Zone ", input$zn, " to zone ", as.character([email protected]$n), 
            "<br>", 
            input$fl, " = ", vs) 
       ) 
    }) 
    output$mapped_zonelist <- renderLeaflet(m()) 
} 

shinyApp(ui = ui, server = server) 

도움이 될 것입니다. 감사!

+0

이 코드를 반짝이는 외부에서 실행하면 제대로 작동합니까? –

+0

예제 파일을 제공하여 재현 할 수 있습니까? – Sab

답변

0

shapefile의 크기/복잡성에 따라 먼저 할 일은 단순화하는 것입니다. 모양 파일을 정상적으로로드 한 다음

install.packages("rmapshaper") 
shape_simp <- rmapshaper::ms_simplify(shape, keep = 0.05) 

인수로 실험하십시오. keep = 인수로 실험하십시오. 숫자가 클수록 결과 모양 파일의 복잡성이 커집니다. 이렇게하면 문제가 완전히 해결되지 않을 수도 있지만 시작일뿐입니다.

+0

우수 아이디어! shapefile을 읽은 후 처음에 수표를 추가했습니다. 10MB보다 크면 10MB를 목표로 단순화했습니다. 불행히도 단순화를 수행하는 데 약간의 시간이 걸리지 만 그렇지 않은 경우에는 효과가 좋습니다! –

+0

@ArlinConio 전단지에로드하기 전에 모양 파일을 단순화합니다. 또한 10MB보다 훨씬 더 낮게 갈 수 있습니다.귀하의 필요에 따라 심지어 1MB 미만이 될 수도 있습니다 - 필 55 분 전 – Phil

+0

맞습니다 - 1MB에서도 작동합니다. 당신의 도움을 주셔서 감사합니다! –