2015-12-01 4 views
3

Я изучаю программу в R с пакетом листовка. Я хочу дать угол к иконам, и я пытаюсь его с этим кодом:поворот значка в пакете листовка

m <- leaflet() 
m <- addTiles(m,urlTemplate = "http://xdworld.vworld.kr:8080/2d/Base/201310/{z}/{x}/{y}.png") 
m = m %>% setView(127.074167,34.456806, zoom = 9) 
arrowIcon <- makeIcon(
    iconUrl = "arrow.png" 
    ,iconWidth = 100, iconHeight = 100 
    ,iconAnchorX = 25, iconAnchorY =25 
) 
arrowIcon <- makeIcon(
    iconUrl = "ARROW_B2.png" 
    ,iconWidth = 100, iconHeight = 100 
    ,iconAnchorX = 25, iconAnchorY = 25 
) 
offset = 0.00 # zoom 10-> 0.03, 9->0.06, 8 -> 0.12, 7 -> 0.24 
m_lat = 34.45 + offset 
m_lon = 127.07 - offset 
m <- addMarkers(m, lng=m_lon, lat= m_lat 
      , options = c(markerOptions(), iconAngle= 0) 
      ,icon= arrowIcon) 
m <- addCircles(m, lng=127.07, lat=34.45 , weight = 10,radius = 100) 
m 

Однако, это не работает.

+1

привет Сео нет необходимости добавлять лишний жирный шрифт. А также нет необходимости ставить строку, полную «=» внизу блока кода. – NSNoob

+0

Спасибо NSNoob. Я настолько недостаточен, потому что я здесь впервые. :) – SeoJeonghwa

ответ

1

Это единственный способ заставить его работать. Вы хотите использовать плагин RotatedMarker, доступный here. Чтобы использовать этот плагин с R, я следовал инструкциям here.

Две вещи, чтобы быть в курсе, что я не могу показаться, чтобы выяснить:

  1. Я не могу найти значок, когда она хранится локально - он должен быть доступен через URL. Если вы можете это исправить, сообщите мне.

  2. Вам необходимо скачать javascript-файл и сохранить его локально. В приведенном ниже примере я помещал его в тот же каталог, что и мой R-скрипт. Теоретически вы должны иметь возможность загружать его по URL-адресу, но это не работает. Если вы можете это исправить, сообщите мне.

Так вот рабочий код:

library(htmltools) 
library(htmlwidgets) 
library(leaflet) 

# this is taken from: https://gist.github.com/jcheng5/c084a59717f18e947a17955007dc5f92 
rotatedMarker <- htmlDependency(
    "Leaflet.rotatedMarker", 
    "0.1.2", 
    src = normalizePath("."), 
    script = "leaflet.rotatedMarker.js" 
) 

# this is taken from: https://gist.github.com/jcheng5/c084a59717f18e947a17955007dc5f92 
registerPlugin <- function(map, plugin) { 
    map$dependencies <- c(map$dependencies, list(plugin)) 
    map 
} 

leaflet() %>% 
    addTiles(urlTemplate = "http://xdworld.vworld.kr:8080/2d/Base/201310/{z}/{x}/{y}.png") %>% 
    setView(127.074167,34.456806, zoom = 9) %>% 
    registerPlugin(rotatedMarker) %>% 
    onRender("function(el, x) { 
    var planeIcon = L.icon({iconUrl: 'https://raw.githubusercontent.com/bbecquet/Leaflet.PolylineDecorator/master/example/icon_plane.png', iconAnchor: [16, 16]}); 
    var pathPattern = L.marker([34.45, 127.07], {icon: planeIcon, rotationAngle: 90}).addTo(this); 
    }") %>% 
    addCircles(lng = 127.07, lat = 34.45, weight = 10, radius = 100) 

Который производит: Leaflet in R with rotated icons!

Обратите внимание, что я повернут на значке плоскости на 90 градусов.

+0

Можно ли расширить это решение для большего количества иконок с разным вращением? – Enrique

+0

немного менее хакерским способом, чем обходное решение onRender, заключалось бы в том, чтобы сначала использовать 'planeIcon = makeIcon (...)', а затем установить 'icon = planeIcon' в' addMarkers '). Затем можно добавить поворот с помощью опции: options = markerOptions (rotationAngle = c (90)). Остальное идентично. – Ufos

+0

@ Enrique, если вы сделаете это так, как я описал выше, цикл с '%>%' должен быть возможен, но без векторизованного способа сделать это. Дело в том, что маркер статичен, а ротация - их собственностью. Таким образом, тот же маркер с разными ангелами на самом деле является двумя разными маркерами. Хотя, я думаю, что оригинальный пакет 'leaflet.rotatedMarker.js' может быть расширен. Скорее всего, это ваш лучший выбор, если вам действительно нужно использовать различные вращения массового масштаба. – Ufos

0

Для вашего первого пункта я обнаружил, что вы можете загрузить свое изображение, если оно хранится в каталоге с именем www.

| 
|- app.R 
|- www 
    |- icon_plane.pg 

Тогда вы сможете загрузить его с этой частью кода

onRender("function(el, x) { 
      var planeIcon = L.icon({iconUrl: 'icon_plane.png', iconAnchor:[16, 16]}); 
      var pathPattern = L.marker([34.45, 127.07], {icon: planeIcon, rotationAngle: 90}).addTo(this); 
      }") 

Becareful загрузки правильно ваш файл JS. Я потратил много времени на то, почему мой образ не показывался, и, наконец, это было только потому, что мой сценарий не был в правильном месте.

Смежные вопросы