icon rotation in leaflet package

后端 未结 2 1755
有刺的猬
有刺的猬 2021-01-13 06:58

I\'m learning to program in R with the leaflet package. I want to give an angle to the icons, and am trying it with this code:

m <- leaflet()
m <- ad         


        
相关标签:
2条回答
  • 2021-01-13 07:09

    This is the only way I could get it to work. You want to use the RotatedMarker plugin, available here. To use this plugin with R, I followed instructions here.

    Two things to be aware of that I can't seem to figure out:

    1. I can't seem to find the icon when it's stored locally - it needs to be accessible via URL. If you can fix that, please let me know.

    2. You need to download the javascript file and save it locally. In the example below I've put it in the same directory as my R script. Theoretically you should be able to load it via a URL but that doesn't work. If you can fix that, please let me know.

    So here's the working code:

    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)
    

    Which produces:

    Notice that I've rotated the plane icon 90 degrees.

    0 讨论(0)
  • 2021-01-13 07:18

    For your first point, I've found that you can load your image if it's stored in a directory named www.

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

    Then you'll be able to load it with this piece of code

    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 of loading correctly your js file. I spent a lot of time looking why my image wasn't showing and finally it was only because my script wasn't in the correct place.

    0 讨论(0)
提交回复
热议问题