Короплет TopoJSON в R/Leaflet?

Можно ли стилизовать файл TopoJSON на основе его функций для хороплета с помощью R/leaflet? Пробовал несколько вещей, и я не уверен, что это невозможно с пакетом leaflet или у меня просто нет правильного синтаксиса, особенно доступа к свойствам для входа в функцию pal(). Вот что у меня есть:

pal<-colorNumeric(palette ="YlOrRd",domain = USAdata$GINI) #USAdata data frame I merged with the spdf before converting it to shp/topojson

map<-leaflet() %>% 
  addTiles(options=tileOptions(minZoom = 3)) %>% 
  setMaxBounds(-167.276413,5.499550,-52.233040, 83.162102) %>%
  setView(93.85,37.45,zoom =3) %>%
  #addGeoJSON(geojson = jso5)
  addTopoJSON(topojson=jso, fillColor = ~pal("GINI"))
#addPolygons(data=poly)

это выдает ошибку:

"Error in UseMethod("doResolveFormula") : 
  no applicable method for 'doResolveFormula' applied to an object of class "NULL""

Я также попытался преобразовать его в объект R в топожсон с помощью fromJSON() и добавить элементы стиля, но это не загрузится после того, как я попытаюсь отправить его обратно с помощью toJSON().

Не уверен, что уместно, но топоджсон был создан из шейп-файла, созданного в соответствии с инструкциями United-States-Census-Bureau-in">здесь:

с кл:

topojson -o 'USApuma.json' --shapefile-encoding utf8 --id-property=+GEOID10 -p GINI,+STATEFP10,+GEOID10 -- 'usaetest.shp'

затем прочитайте вместе с readLines().

В конце концов, пытаясь бросить это в блестящее приложение. Вот некоторые примеры, которые я подписка.


person Nathan Thompson    schedule 13.12.2015    source источник


Ответы (1)


Вам нужно использовать TopoJSON? Если нет, рассмотрите возможность использования пакета tigris (раскрытие информации: я создал и поддерживаю пакет). Он предоставит вам доступ практически к любому набору географических данных переписи населения, который вам нужен, и отлично сочетается с листовкой. Вот краткий пример в соответствии с тем, что вы делаете. Например, вы можете получить все PUMA в континентальной части США с помощью следующего кода:

library(readr)
library(tigris)
library(leaflet)

us_states <- unique(fips_codes$state)[1:51]

continental_states <- us_states[!us_states %in% c("AK", "HI")]

pumas_list <- lapply(continental_states, function(x) {
  pumas(state = x, cb = TRUE)
})

us_pumas <- rbind_tigris(pumas_list)

Я создал образец набора данных, который измеряет средний доход домохозяйства PUMA для этого примера; функция geo_join из пакета tigris может объединить набор данных с фреймом пространственных данных us_pumas:

puma_income <- read_csv('http://personal.tcu.edu/kylewalker/data/puma_income.csv')

joined_pumas <- geo_join(us_pumas, puma_income, 'GEOID10', 'GEOID')

Затем мы можем построить с помощью Leaflet:

pal <- colorQuantile(palette = 'YlOrRd', domain = joined_pumas$hhincome, n = 7)

leaflet(joined_pumas) %>% 
  addProviderTiles('CartoDB.Positron') %>% 
  addPolygons(weight = 0.5, fillColor = ~pal(hhincome), 
              color = 'lightgrey', fillOpacity = 0.75, 
              smoothFactor = 0.2) %>% 
  addLegend(pal = pal, 
            values = joined_pumas$hhincome)

Средний доход домохозяйства PUMA

Если вы планируете создать приложение Shiny, я бы порекомендовал сначала сохранить PUMA, полученные от tigris, в виде файла .rda и прочитать его с помощью скрипта Shiny, чтобы вам не пришлось rbind_tigris каждый раз.

person kwalkertcu    schedule 26.12.2015
comment
Мотивация использования TopoJSON — скорость. Я реализовал это с помощью SPDF, как вы сделали выше, но это очень медленно. re: tigris Мне нравится пакет, просто у меня уже есть данные и файлы .shp на моем диске. Я использую geo_join для объединения spdf и данных, затем конвертирую в TopoJSON с помощью утилиты командной строки. Листовка отлично рисует Topo, но я не могу раскрасить его атрибутами Topo - передача функции ~pal в аргумент fillColor addTopoJSON не работает. Опять же, я не уверен, что это синтаксис или это невозможно с addTopoJSON - person Nathan Thompson; 23.01.2016