R语言在线地图神器:Leaflet for R包(三) 符号标记
2016-10-16 16:02
579 查看
四、标记
点标记在地图符号化的时候,是最常用的功能之一,一般来说,带有经纬度坐标的点信息,在地图上标志的位置,都会通过一个标记物来实现,很多时候把这个东东称之为“图钉”是非常形象的。
标记的方法名和语法如下:
addMarkers(leaflet地图,数据)
表示把这个数据加载到地图里面,示例如下:
df = data.frame(
latitude = runif(20,min=0,max=70),
longitude = runif(20,min=0,max=160)
)
m <- leaflet(data=df)
m<- addTiles(m)
addMarkers(m,lng=~longitude,lat=~latitude)
#管道操作符写法
df%>%leaflet()%>%addTiles()%>% addMarkers()
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/02d5dccead3514aa9350490704bbef70)
可以看见,如果你的列名直接叫做(lat/latitude 以及 lon/lng/long/longitude)的话,是不用显示去声明的,系统会去自动查找,然后作为经度、纬度来进行使用。
下面我们来加载一批数据看看:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/c8106c286728f16ced99d17b23d29751)
这是一批北京市三级医院的数据,需要这份示例数据的,可以通过公众号获取虾神的邮箱,然后发送邮件给我获取。
bj3H <- read.csv("E:/bj3H.csv")
leaflet(bj3H)%>%addTiles()%>% addMarkers(popup=~mc)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/c3cc0d94cca6484c859e92b44edc0c93)
当我们的坐标字段,就叫做(latitude/longitude)的时候,方法会自动的去匹配,当然,如果你不叫做这个,比较你叫做xy或者中文的啥,也可以进行显式申明,如下:
首先定义一个自定义的数据框,只有三个列,分布是x,y,mc
dh <- data.frame(cbind(x=bj3H$Longitude,y=bj3H$Latitude,mc=as.character(bj3H$mc)))
内容如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/d87980ef9d15ca83ae1b5ec1f00c9db2)
如果还是直接写,会出现错误提示,说找不到经纬度的列
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/c7bd0106e403f94b67fd8354055f0678)
像这种情况,就需要进行显式申明了:(顺便换个背景底图)
leaflet(dh)%>%addProviderTiles("Esri.WorldStreetMap")%>%setView(116.4,39.9,zoom=10)%>%addMarkers(~x,~y,popup=~mc)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/4f0ffe3b0f8aa716dd005328114f6581)
如果你觉得这种默认的图钉样式不好看,还可以定制自己的符号,比如我下面想用红十字来表示医院:
首先用makeIcon这个方法,来定义一个图标,注意里面Url必须是要用http模式,我这里用csdn提供的免费图床,本地硬盘上的图片好像是不能直接用的。(ps:如果不想用互联网的图床,也可以在本地开启一个web服务器,使用url方式来引用)。
makeIcon的语法如下:
iconUrl : 图标的url地址
iconWidth :图标的宽度
iconHeight: 图标的高度
iconAnchorX :图标的中心点x轴偏移(以左上角为0,0)
iconAnchorY :图标的中心点Y轴偏移(以左上角为0,0)
redIcon <- makeIcon(
iconUrl = "https://img-blog.csdn.net/20161015170050664",
iconWidth = 38, iconHeight = 38,
iconAnchorX = 19, iconAnchorY = 19
)
leaflet(bj3H[])%>%addTiles()%>%
addMarkers(popup=~mc,icon = redIcon)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/40e5abeda55df6c641497948bb5a5948)
有时候还需要配置不同的图标来显示不同的内容,当然最简单的方式就是分批次加载不同的数据:先定义两个不同的符号,然后筛选数据,分批次加载,三级医院用传统红十字,三级甲等用镶边红十字,如下:
redIcon1 <- makeIcon(
iconUrl = "https://img-blog.csdn.net/20161015170050664",
iconWidth = 38, iconHeight = 38,
iconAnchorX = 19, iconAnchorY = 19
)
redIcon2 <- makeIcon(
iconUrl = "https://img-blog.csdn.net/20161015173507516",
iconWidth = 38, iconHeight = 38,
iconAnchorX = 19, iconAnchorY = 19
)
leaflet()%>%addTiles()%>%
addMarkers(data=bj3H[bj3H$dj=="三级",],popup=~mc,icon = redIcon1)%>%
addMarkers(data=bj3H[bj3H$dj=="三级甲等",],popup=~mc,icon = redIcon2)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/955bfcd684f348167161d28c9c18b5fa)
这种方法虽然比较容易控制,但是语法稍微显得有些繁琐了,leaflet的makeIcon包还支持r语言提供的ifelse()函数进行设定,如下所示:(为了表示是重新运行过的,换个底图)
leafIcons <- icons(
iconUrl = ifelse(bj3H$dj=="三级",
"https://img-blog.csdn.net/20161015170050664",
"https://img-blog.csdn.net/20161015173507516"
),
iconWidth = 38, iconHeight = 38,
iconAnchorX = 19, iconAnchorY = 19
)
leaflet(bj3H)%>%addProviderTiles("CartoDB.Positron")%>%
addMarkers(popup=~mc,icon = leafIcons)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/3a82e10ea2e32ca217414a6767989367)
当然,以此类推,还可以修改符号大小神马啊,设定符号等级啊神马的,我这里就不一一说明了,大家有兴趣自己玩。
还有同学问,如果我有很多类图标呢?比如二十类……虾神咋办?好吧,如果你有超过3类图标的话,要么用第一种方法筛选加载,要么的话,leaflet还提供了一个叫做iconList的方法来处理。
比如上面这份医疗数据,一共分成10种类型:(用summary方法做个统计)
fl <- summary(bj3H$fl)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/802ef3e7b1effbde33baf7fe521d83ce)
那么下面我用十种不同类型的图标,来进行分类标识:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/aa5c3d015965cccae3154d9304bbcb9b)
yyIcons <- iconList(
中国医科院所属医院 = makeIcon("https://img-blog.csdn.net/20161015181859390", iconWidth =32, iconHeight = 32),
北京区县属医院 = makeIcon("https://img-blog.csdn.net/20161015182217958", iconWidth =32, iconHeight = 32),
北京市卫生局直属医院= makeIcon("https://img-blog.csdn.net/20161015181915828",iconWidth =32, iconHeight = 32),
北京中医药大学= makeIcon("https://img-blog.csdn.net/20161015181934175",iconWidth =32, iconHeight = 32),
卫生部直属医院= makeIcon("https://img-blog.csdn.net/20161015181950879",iconWidth =32, iconHeight = 32),
中国中医科学院= makeIcon("https://img-blog.csdn.net/20161015182031737",iconWidth =32, iconHeight = 32),
驻京武警医院= makeIcon("https://img-blog.csdn.net/20161015182043285",iconWidth =32, iconHeight = 32),
驻京部队医院= makeIcon("https://img-blog.csdn.net/20161015182054598",iconWidth =32, iconHeight = 32),
部属厂矿高校医院= makeIcon("https://img-blog.csdn.net/20161015182109473",iconWidth =32, iconHeight = 32),
北京大学附属医院= makeIcon("https://img-blog.csdn.net/20161015182132521",iconWidth =32, iconHeight = 32)
)
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron") %>%
addMarkers(icon = ~yyIcons[fl],popup=~fl)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/d9fbcf41574ec92bcdab9c07976dd48d)
当数据太多的时候,很容易叠加在一起互相遮盖了,leaflet还提供了空间聚合的方法,可以按照视图对一定范围内的数据进行聚合显示,如下:
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron") %>%
addMarkers(clusterOptions = markerClusterOptions(),icon = ~yyIcons[fl],popup=~fl)
可以看见,随着视图比例尺的变化,会进行聚合以及分离
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/4b4c714651b36ef3a71395c1c5a35667)
而如果不想弄得这么麻烦,就是直接把点显示出来,leaflet提供了最简单的方法:
addCircles()和addCircleMarkers()
addCircles就是直接把点当成一个圆点绘制到地图上:
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron")%>%addCircles()
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/6c93db235e4b12a7ad66ba4ad89452e9)
默认大小为5,颜色为蓝色
当然也可以设置颜色和大小,比如设置为红色,大小为科室数量(等比例的缩小一半):
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron")%>%addCircles(color="red",weight=bj3H$ks/2)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/59d2aa2c940f3cebbf00d552e2020d47)
而addCircleMarkers()是把点作为一个镶边的圆(或者说圆符号)绘制到地图上:
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron")%>%addCircleMarkers()
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/0f2bd57a57a511e9b82a9a06aa52fafe)
当然,同样可以设置大小和颜色:
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron")%>%addCircleMarkers(color="red",weight=bj3H$ks/2)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/208813f5053a4c1ee6b326360bfe62c5)
和绘制图标一样,绘制点和圆也是可以设置分类显示的,方法和绘制不同种类的图标一样,两种方法:
1、采用筛选的方式,多次绘制(这个比较麻烦,数据量大,种类多的时候很繁琐)
leaflet()%>%addTiles()%>%addProviderTiles("CartoDB.Positron")%>%
addCircles(data=bj3H[bj3H$dj=="三级",],popup=~mc,color="green")%>%
addCircles(data=bj3H[bj3H$dj=="三级甲等",],popup=~mc,color="red")
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/a5034ee9c299167dc6c3281994f963c8)
leaflet()%>%addTiles()%>%addProviderTiles("CartoDB.Positron")%>%
addCircleMarkers(data=bj3H[bj3H$dj=="三级",],popup=~mc,color="green")%>%
addCircleMarkers(data=bj3H[bj3H$dj=="三级甲等",],popup=~mc,color="red")
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/489217e68e08526e8b8388c89881965d)
2、就是采用分类设定的方式,预先设定好各种分类:(因为addCircles和addCircleMarkers)两个方法几乎一模一样,我就不把两个都写一遍了,有兴趣的同学自己嗨。
pal <- colorFactor(c("green", "red"), domain = c("三级", "三级甲等"))
leaflet(bj3H) %>% addProviderTiles("Esri.WorldTopoMap") %>%
addCircleMarkers(color = ~pal(dj),stroke = FALSE,fillOpacity = 0.7)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/f03f8f9393de54ba19ffcb8cfe5034a2)
可以看见,我们只写了两个分类,如果要更多的类别,也是可以的。
那么很多时候,我们可能还需要通过通过数值来进行不同等级的颜色渲染,下面根据每个医院的床位数进行颜色渲染,代码如下:(代码具体的意义,在后面讲图例的时候,我们还会详细说明)
cPal <- colorNumeric(palette = c("blue","yellow","red"),domain = bj3H$cws)
leaflet(bj3H) %>% addProviderTiles("Esri.WorldTopoMap") %>%
addCircleMarkers(fillColor = ~cPal(bj3H$cws),stroke = FALSE,fillOpacity = 0.8,popup=~as.character(cws))%>%
addLegend("bottomright", pal = cPal, values = ~cws,title = "床位数",labFormat = labelFormat(suffix = "张"),opacity = 1)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/24847de2ab46201daa0bb1ce1bf953e7)
待续未完。
点标记在地图符号化的时候,是最常用的功能之一,一般来说,带有经纬度坐标的点信息,在地图上标志的位置,都会通过一个标记物来实现,很多时候把这个东东称之为“图钉”是非常形象的。
标记的方法名和语法如下:
addMarkers(leaflet地图,数据)
表示把这个数据加载到地图里面,示例如下:
df = data.frame(
latitude = runif(20,min=0,max=70),
longitude = runif(20,min=0,max=160)
)
m <- leaflet(data=df)
m<- addTiles(m)
addMarkers(m,lng=~longitude,lat=~latitude)
#管道操作符写法
df%>%leaflet()%>%addTiles()%>% addMarkers()
可以看见,如果你的列名直接叫做(lat/latitude 以及 lon/lng/long/longitude)的话,是不用显示去声明的,系统会去自动查找,然后作为经度、纬度来进行使用。
下面我们来加载一批数据看看:
这是一批北京市三级医院的数据,需要这份示例数据的,可以通过公众号获取虾神的邮箱,然后发送邮件给我获取。
bj3H <- read.csv("E:/bj3H.csv")
leaflet(bj3H)%>%addTiles()%>% addMarkers(popup=~mc)
当我们的坐标字段,就叫做(latitude/longitude)的时候,方法会自动的去匹配,当然,如果你不叫做这个,比较你叫做xy或者中文的啥,也可以进行显式申明,如下:
首先定义一个自定义的数据框,只有三个列,分布是x,y,mc
dh <- data.frame(cbind(x=bj3H$Longitude,y=bj3H$Latitude,mc=as.character(bj3H$mc)))
内容如下:
如果还是直接写,会出现错误提示,说找不到经纬度的列
像这种情况,就需要进行显式申明了:(顺便换个背景底图)
leaflet(dh)%>%addProviderTiles("Esri.WorldStreetMap")%>%setView(116.4,39.9,zoom=10)%>%addMarkers(~x,~y,popup=~mc)
如果你觉得这种默认的图钉样式不好看,还可以定制自己的符号,比如我下面想用红十字来表示医院:
首先用makeIcon这个方法,来定义一个图标,注意里面Url必须是要用http模式,我这里用csdn提供的免费图床,本地硬盘上的图片好像是不能直接用的。(ps:如果不想用互联网的图床,也可以在本地开启一个web服务器,使用url方式来引用)。
makeIcon的语法如下:
iconUrl : 图标的url地址
iconWidth :图标的宽度
iconHeight: 图标的高度
iconAnchorX :图标的中心点x轴偏移(以左上角为0,0)
iconAnchorY :图标的中心点Y轴偏移(以左上角为0,0)
redIcon <- makeIcon(
iconUrl = "https://img-blog.csdn.net/20161015170050664",
iconWidth = 38, iconHeight = 38,
iconAnchorX = 19, iconAnchorY = 19
)
leaflet(bj3H[])%>%addTiles()%>%
addMarkers(popup=~mc,icon = redIcon)
有时候还需要配置不同的图标来显示不同的内容,当然最简单的方式就是分批次加载不同的数据:先定义两个不同的符号,然后筛选数据,分批次加载,三级医院用传统红十字,三级甲等用镶边红十字,如下:
redIcon1 <- makeIcon(
iconUrl = "https://img-blog.csdn.net/20161015170050664",
iconWidth = 38, iconHeight = 38,
iconAnchorX = 19, iconAnchorY = 19
)
redIcon2 <- makeIcon(
iconUrl = "https://img-blog.csdn.net/20161015173507516",
iconWidth = 38, iconHeight = 38,
iconAnchorX = 19, iconAnchorY = 19
)
leaflet()%>%addTiles()%>%
addMarkers(data=bj3H[bj3H$dj=="三级",],popup=~mc,icon = redIcon1)%>%
addMarkers(data=bj3H[bj3H$dj=="三级甲等",],popup=~mc,icon = redIcon2)
这种方法虽然比较容易控制,但是语法稍微显得有些繁琐了,leaflet的makeIcon包还支持r语言提供的ifelse()函数进行设定,如下所示:(为了表示是重新运行过的,换个底图)
leafIcons <- icons(
iconUrl = ifelse(bj3H$dj=="三级",
"https://img-blog.csdn.net/20161015170050664",
"https://img-blog.csdn.net/20161015173507516"
),
iconWidth = 38, iconHeight = 38,
iconAnchorX = 19, iconAnchorY = 19
)
leaflet(bj3H)%>%addProviderTiles("CartoDB.Positron")%>%
addMarkers(popup=~mc,icon = leafIcons)
当然,以此类推,还可以修改符号大小神马啊,设定符号等级啊神马的,我这里就不一一说明了,大家有兴趣自己玩。
还有同学问,如果我有很多类图标呢?比如二十类……虾神咋办?好吧,如果你有超过3类图标的话,要么用第一种方法筛选加载,要么的话,leaflet还提供了一个叫做iconList的方法来处理。
比如上面这份医疗数据,一共分成10种类型:(用summary方法做个统计)
fl <- summary(bj3H$fl)
那么下面我用十种不同类型的图标,来进行分类标识:
yyIcons <- iconList(
中国医科院所属医院 = makeIcon("https://img-blog.csdn.net/20161015181859390", iconWidth =32, iconHeight = 32),
北京区县属医院 = makeIcon("https://img-blog.csdn.net/20161015182217958", iconWidth =32, iconHeight = 32),
北京市卫生局直属医院= makeIcon("https://img-blog.csdn.net/20161015181915828",iconWidth =32, iconHeight = 32),
北京中医药大学= makeIcon("https://img-blog.csdn.net/20161015181934175",iconWidth =32, iconHeight = 32),
卫生部直属医院= makeIcon("https://img-blog.csdn.net/20161015181950879",iconWidth =32, iconHeight = 32),
中国中医科学院= makeIcon("https://img-blog.csdn.net/20161015182031737",iconWidth =32, iconHeight = 32),
驻京武警医院= makeIcon("https://img-blog.csdn.net/20161015182043285",iconWidth =32, iconHeight = 32),
驻京部队医院= makeIcon("https://img-blog.csdn.net/20161015182054598",iconWidth =32, iconHeight = 32),
部属厂矿高校医院= makeIcon("https://img-blog.csdn.net/20161015182109473",iconWidth =32, iconHeight = 32),
北京大学附属医院= makeIcon("https://img-blog.csdn.net/20161015182132521",iconWidth =32, iconHeight = 32)
)
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron") %>%
addMarkers(icon = ~yyIcons[fl],popup=~fl)
当数据太多的时候,很容易叠加在一起互相遮盖了,leaflet还提供了空间聚合的方法,可以按照视图对一定范围内的数据进行聚合显示,如下:
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron") %>%
addMarkers(clusterOptions = markerClusterOptions(),icon = ~yyIcons[fl],popup=~fl)
可以看见,随着视图比例尺的变化,会进行聚合以及分离
而如果不想弄得这么麻烦,就是直接把点显示出来,leaflet提供了最简单的方法:
addCircles()和addCircleMarkers()
addCircles就是直接把点当成一个圆点绘制到地图上:
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron")%>%addCircles()
默认大小为5,颜色为蓝色
当然也可以设置颜色和大小,比如设置为红色,大小为科室数量(等比例的缩小一半):
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron")%>%addCircles(color="red",weight=bj3H$ks/2)
而addCircleMarkers()是把点作为一个镶边的圆(或者说圆符号)绘制到地图上:
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron")%>%addCircleMarkers()
当然,同样可以设置大小和颜色:
leaflet(bj3H) %>%addProviderTiles("CartoDB.Positron")%>%addCircleMarkers(color="red",weight=bj3H$ks/2)
和绘制图标一样,绘制点和圆也是可以设置分类显示的,方法和绘制不同种类的图标一样,两种方法:
1、采用筛选的方式,多次绘制(这个比较麻烦,数据量大,种类多的时候很繁琐)
leaflet()%>%addTiles()%>%addProviderTiles("CartoDB.Positron")%>%
addCircles(data=bj3H[bj3H$dj=="三级",],popup=~mc,color="green")%>%
addCircles(data=bj3H[bj3H$dj=="三级甲等",],popup=~mc,color="red")
leaflet()%>%addTiles()%>%addProviderTiles("CartoDB.Positron")%>%
addCircleMarkers(data=bj3H[bj3H$dj=="三级",],popup=~mc,color="green")%>%
addCircleMarkers(data=bj3H[bj3H$dj=="三级甲等",],popup=~mc,color="red")
2、就是采用分类设定的方式,预先设定好各种分类:(因为addCircles和addCircleMarkers)两个方法几乎一模一样,我就不把两个都写一遍了,有兴趣的同学自己嗨。
pal <- colorFactor(c("green", "red"), domain = c("三级", "三级甲等"))
leaflet(bj3H) %>% addProviderTiles("Esri.WorldTopoMap") %>%
addCircleMarkers(color = ~pal(dj),stroke = FALSE,fillOpacity = 0.7)
可以看见,我们只写了两个分类,如果要更多的类别,也是可以的。
那么很多时候,我们可能还需要通过通过数值来进行不同等级的颜色渲染,下面根据每个医院的床位数进行颜色渲染,代码如下:(代码具体的意义,在后面讲图例的时候,我们还会详细说明)
cPal <- colorNumeric(palette = c("blue","yellow","red"),domain = bj3H$cws)
leaflet(bj3H) %>% addProviderTiles("Esri.WorldTopoMap") %>%
addCircleMarkers(fillColor = ~cPal(bj3H$cws),stroke = FALSE,fillOpacity = 0.8,popup=~as.character(cws))%>%
addLegend("bottomright", pal = cPal, values = ~cws,title = "床位数",labFormat = labelFormat(suffix = "张"),opacity = 1)
待续未完。
相关文章推荐
- R语言在线地图神器:Leaflet for R包(三) 符号标记
- R语言在线地图神器:Leaflet for R包(四) 弹出窗口和几何要素
- R语言在线地图神器:Leaflet for R包(一)
- R语言在线地图神器:Leaflet for R包(一)
- R语言在线地图神器:Leaflet for R包(二)基础底图
- R语言在线地图神器:Leaflet for R包(五) GeoJson文件的使用
- R语言在线地图神器:Leaflet for R包(四) 弹出窗口和几何要素
- R语言在线地图神器:Leaflet for R包(五) GeoJson文件的使用
- R语言在线地图神器:Leaflet for R包(六,完结篇)栅格、颜色和图例设置
- R语言在线地图神器:Leaflet for R包(六,完结篇)栅格、颜色和图例设置
- R语言在线地图神器:Leaflet for R包(二)基础底图
- 中国在线互联网地图服务
- 高德地图 鼠标点击后 地图上点标记跟着变化
- 在地图的边界内,随机放置一个标记【GMap 学习笔记】
- GIS-003-在线地图下载及应用
- Html特殊标记符号
- R语言进阶之五:表达式、数学公式与特殊符号
- GIS中点状地图符号-圆的绘制
- Asp.Net 中几种相似的标记符号
- ArcGis 在线地图相关资源