【问题标题】:TopoJSON choropleth in R/Leaflet?R /传单中的TopoJSON choropleth?
【发布时间】:2015-12-13 04:55:45
【问题描述】:

是否可以使用 R/leaflet 从其特征为 choropleth 设置 TopoJSON 文件的样式?尝试了一些事情,我不确定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""

我还尝试使用 fromJSON() 将其转换为 R 对象 topojson 并添加样式元素,但是在我尝试使用 toJSON() 将其发送回后,它不会加载。

不确定是否相关,但 topojson 是从按照说明 here 制作的 shapefile 创建的:

与 cl:

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

然后使用readLines() 阅读。

最终尝试将其放入闪亮的应用程序中。这是some 我一直在following 的例子。

【问题讨论】:

    标签: r leaflet topojson choropleth census


    【解决方案1】:

    你需要使用 TopoJSON 吗?如果不考虑使用 tigris 包(披露:我创建并维护了该包)。它可以让您访问几乎任何您需要的人口普查地理数据集,并且与 leaflet 配合得很好。这是一个与您正在做的事情一致的简短示例。例如,您可以使用以下代码获取美国大陆的所有 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 家庭收入中位数的样本数据集; tigris 包中的geo_join 函数可以将数据集合并到空间数据框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)
    

    如果您打算构建一个 Shiny 应用程序,我建议您首先将您从 tigris 获得的 PUMA 保存为 .rda 文件,然后使用您的 Shiny 脚本读取它,这样您就不用不必每次都rbind_tigris

    【讨论】:

    • 使用 TopoJSON 的动机是速度。正如您在上面所做的那样,我已经使用 SPDF 实现了它,但是它非常慢。回复:tigris 我喜欢这个包,我只是碰巧有数据和 .shp 已经在我的驱动器上。我使用geo_join 合并 spdf 和数据,然后使用命令行实用程序转换为 TopoJSON。 Leaflet 可以很好地绘制 Topo,但我似乎无法使用 Topo 的属性对其进行着色——将 ~pal 函数传递给 addTopoJSONfillColor 参数不起作用。同样,我不确定这是语法问题还是addTopoJSON 不可能
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多