使用 Leaflet 的交互式美国县地图

Posted

技术标签:

【中文标题】使用 Leaflet 的交互式美国县地图【英文标题】:Interactive United sates county map using Leaflet 【发布时间】:2018-02-25 15:34:10 【问题描述】:

我有所有州的美国县数据集。仅提供外观样例,

county   state   value_x
Adair    Oklahoma  5
Adair    Missouri  2
Adair    Kentucky  10
Adair    lowas     1

我可以使用 plotly 绘制这个,方法是使用 map_data 向数据集添加经纬度坐标。但是我发现在绘制整个美国州时,plotly 太慢了,无法悬停/缩放功能。

所以我想尝试使用传单。我在网上浏览了一些代码。有趣的是,他们都没有纬度/经度坐标。我想了解如何将它们用于我的数据集。因为有些县似乎有相同的名称,但在不同的州都有。没有任何坐标怎么画?

这是我尝试过的代码。 value_x 未按照县正确绘制。这很奇怪。请帮助解决这个问题。我想放大县,并希望 value_x 在我点击时弹出。

library(raster)
library(leaflet)
library(tidyverse)

# Get USA polygon data
USA <- getData("GADM", country = "usa", level = 2)

### Get data. I can't provide the date set. It has county, state and value _x as shown above 
mydata <- county,state,value_x

### Check counties that exist in USA, but not in mydata
### Create a dummy data frame and bind it with mydata

mydata <- data.frame(county= setdiff(USA$NAME_2, mydata$county),
                     value_x = NA,
                     stringsAsFactors = FALSE) %>%
          bind_rows(mydata)

### Create a color palette
mypal <- colorNumeric(palette = "viridis", domain = mydata$value_x)

leaflet() %>% 
addProviderTiles("OpenStreetMap.Mapnik") %>%
setView(lat = 39.8283, lng = -98.5795, zoom = 4) %>%
addPolygons(data = USA, stroke = FALSE, smoothFactor = 0.2, fillOpacity = 0.3,
            fillColor = ~mypal(mydata$value_x),
            popup = paste("Region: ", USA$NAME_2, "<br>",
                          "Value X: ", mydata$value_x, "<br>")) %>%
 addLegend(position = "bottomleft", pal = mypal, values = mydata$value_x,
           title = "Value X",
           opacity = 1)

【问题讨论】:

看到你的代码,我觉得你在使用bind_rows()时做错了什么。您在第一个数据集中有 county。您在第二个数据集中有 COUNTY_NAME。当你绑定它们时,我认为你没有三列。你可能有四个。在第二个数据集中,您缺少state。这可能是您需要检查的另一件事。 @jazzurro 抱歉,这是一个错字。我已将 COUNTY_NAME 更正为县。这是我尝试过的参考代码。它在第二个数据集中没有任何状态信息。 [链接] (***.com/questions/17243031/…)。 拜托,你能分享mydata的至少前20行吗?使用dput(mydata[1:20,])。谢谢。 @Harish 我在那篇文章中的代码需要一些修改。我现在没有时间处理它。我稍后会照顾它。同时,您想考虑如何区分这些同名的地方,阿代尔。您必须同时使用州和县信息。 【参考方案1】:

我不知道你的数据是什么样的。因此,我在您拥有仅具有相同名称的县的数据点的条件下定制了以下演示。您可能需要修改以下代码。

这里的关键是将您的数据集与多边形数据(即USA)合并。使用小册子时,有两种填充多边形的方法。您可以在多边形数据或包含该变量的另一个数据框中有一个填充变量。当您有同名的县时,我认为在多边形数据集中使用填充变量可能会更好。这种方法确保将正确的填充值分配给正确的多边形。为此,您需要将数据集(即mydata)与多边形数据(即USA)合并。合并它们时,您需要指定用于操作的列。

在这种情况下,您有两个名称相同的县(即 Adair)。 USAmydata 中有不同的列名。您需要告诉 R 哪些列与哪些列匹配。例如,NAME_1state 匹配。你在merge() 处理这个。以下地图仅填充了 Adair。俄克拉荷马州的价值是 100,而不是 20;合并过程顺利。我希望这可以帮助你。 (顺便说一句,我可以在 Adair 名下只有两个县。)

library(raster)
library(leaflet)
library(viridis)

# Get USA polygon data
USA <- getData("GADM", country = "usa", level = 2)

# Prepare data

mydata <- data.frame(state = c("Iowa", "Oklahoma"),
                     county = "Adair",
                     value = c(20, 100),
                     stringsAsFactors = FALSE)

# I do not know how your actual data is like. In this demonstration,
# I have data points for Adair in Iowa and Oklahoma. So 

temp <- merge(USA, mydata,
              by.x = c("NAME_1", "NAME_2"), by.y = c("state", "county"),
              all.x = TRUE)

# Create a color palette
mypal <- colorNumeric(palette = "viridis", domain = temp$value, na.color = "grey")

leaflet() %>% 
addProviderTiles("OpenStreetMap.Mapnik") %>%
setView(lat = 39.8283, lng = -98.5795, zoom = 4) %>%
addPolygons(data = USA, stroke = FALSE, smoothFactor = 0.2, fillOpacity = 0.3,
            fillColor = ~mypal(temp$value),
            popup = paste("Region: ", temp$NAME_2, "<br>",
                          "Value: ", temp$value, "<br>")) %>%
addLegend(position = "bottomleft", pal = mypal, values = temp$value,
          title = "Value",
          opacity = 1)

【讨论】:

非常感谢!有效。我无法使用viridis 包。它有一些错误。所以我只给了palette = "Blues"。但是地图中的一切都变成了单一的蓝色。尽管Value 在县上被正确绘制,但我没有得到一个干净的图表,因为Value 没有区分颜色。有什么帮助吗? @Harish 我不能说什么,因为我不知道你的实际数据。

以上是关于使用 Leaflet 的交互式美国县地图的主要内容,如果未能解决你的问题,请参考以下文章

R+大地图时代︱ leaflet/leafletCN 动态交互式绘制地图(遍地代码图)

leaflet的使用

将地图的一部分从openstreet加载到folium/leaflet

如何将 Angular JS 与 Leaflet.js 一起使用

D3+Leaflet

esri-leaflet入门教程- 动态要素加载