Это решение на основе leaflet
. Не может быть супер удовлетворительным, но мне кажется менее хакерским, чем другие решения ( это или это ). Как вы сказали, tmap
использует leaflet
, поэтому простым решением является использование addAwesomeMarkers
и небольшая настройка значков. Создайте свою карту с помощью tmap
, как вы сделали, и создайте из нее виджет листовки с tmap_leaflet()
. Обратите внимание, что это аналогичный случай: R Листовка с указанием направления корабля .
Ваши данные и объект 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)
![](https://i.imgur.com/jih0AHp.png)
Дополнительные мысли
Другая идея заключается в использовании функции iconList()
(упомянутой здесь , например), определяющей серию повернутых изображений / значков, соответствующих нескольким классам вращения. Другой подход в этом направлении представлен здесь .
Создано в 2019-01-21 с помощью представительного пакета (v0.2.1)