如何使用tmap和sf基于特征旋转符号(表示空间点数据)?

时间:2019-01-11 11:24:03

标签: r leaflet geospatial sf tmap

我也想以互动方式(基于传单的方法)在地图上表示2艘船,其中也包含一些元数据。自然地,船舶的元数据通常包含船舶的航向,最容易理解的表示方法是相应地旋转点数据的符号。

经过一些初步的尝试,我设法通过遵循icon rotation in leaflet package来重新创建它,使用了纯粹的传单和一个允许我用rotationAngle=~T_heading这样的流畅语法编写的插件。这样的结果如下所示。enter image description here

但是,我正在寻找一种使用sf和tmap包作为语法的方法(tmap的交互式视图也基于传单),因为它们是用于管理和可视化地理空间信息的更加完善和完善的框架。

让我们再次重新创建两个容器的样本数据并绘制它们。

aship<-c(23.622333,37.937489,'Santa Maria',8,300)
bship<-c(23.621303,37.937430,'Vancouver CC',10,35)
shipdata<-data.frame(rbind(aship,bship))
colnames(shipdata)<-c('long','lat','VesselName','sog','T_heading')
shipdata$long<-as.numeric(as.character(shipdata$long))
shipdata$lat<-as.numeric(as.character(shipdata$lat))
shipdata$sog<-as.numeric(as.character(shipdata$sog))
shipdata$T_heading<-as.numeric(as.character(shipdata$T_heading))
#Simple features transformation 
ship_sf<-shipdata%>%
st_as_sf(coords=c('long','lat'))%>%
st_set_crs(4326)
# Use tmap and plot the vessels using a vessel_icon of my own
map_s1<-tm_basemap(leaflet::providers$OpenStreetMap)+
tm_shape(ship_sf)+
tm_markers(shape = vessel_icon)+
tm_view(set.view=c(lon=23.622333,lat=37.937489,zoom=17))

enter image description here

到目前为止,我还没有找到一种以tmap方式旋转标记的方法。有什么简单的解决方案我会错过吗?

非常感谢

1 个答案:

答案 0 :(得分:1)

这是基于leaflet的解决方案。可能并不十分令人满意,但是在我看来,它比其他解决方案(thisthis)更没有特色。如您所说,tmap使用了leaflet,所以一个简单的解决方案是使用addAwesomeMarkers并稍微调整一下图标。像以前一样使用tmap构建地图,并使用tmap_leaflet()用它制作一个传单。请注意,这是类似的情况:R Leaflet plot ship direction

您的数据和tmap对象:

library(tmap)
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(leaflet)

tmap_mode("view")
#> tmap mode set to interactive viewing

# Your data
shipdata <- data.frame(long = c(23.622333, 23.62130),
                       lat = c(37.93749, 37.93743),
                       VesselName = c("Santa Maria", "Vancouver CC"),
                       sog = c(8, 10),
                       T_heading = c(300, 35))
ship_sf <- st_as_sf(x = shipdata, 
                    coords = c('long', 'lat'), 
                    crs = "+proj=longlat +datum=WGS84")

# Make use of tmap functionality to produce the map as you posted
map_s1 <-
  tm_basemap(leaflet::providers$OpenStreetMap) +
  tm_shape(ship_sf) +
  tm_symbols(size = 0) + # need to add a layer after tm_shape(), so add "empty" points
  tm_view(set.view = c(lon = 23.622333, lat = 37.937489, zoom = 17))

现在,伪造一些图标;另请参见https://ionicons.com。在给定的旋转角度下,只有向上箭头图标才能正常工作;其他箭头已经有自己的旋转,可以使事情混乱。然后将tmap对象传送到tmap_leaflet()中以创建一个传单小部件。最后,添加自定义图标:

shipIcon <- makeAwesomeIcon(icon = "arrow-up",
                            iconRotate = shipdata$T_heading,
                            squareMarker = TRUE,
                            markerColor = "black")

map_s1 %>% 
  tmap_leaflet() %>% 
  addAwesomeMarkers(lng = shipdata$lon, 
                    lat = shipdata$lat, 
                    icon = shipIcon, 
                    popup = shipdata$VesselName)

额外的想法

另一个想法是使用iconList()函数(例如,提到here),该函数定义了一系列对应于多个旋转类别的旋转图像/图标。 here提出了这个方向的另一种方法。

reprex package(v0.2.1)于2019-01-21创建