Popup when hover with leaflet in R?

前端 未结 2 477
小鲜肉
小鲜肉 2021-01-31 19:18

My leaflet map looks something like this:

library(sp)
library(leaflet)
circleFun <- function(center = c(0,0),diameter = 1, npoints = 100){
  r = diameter / 2
         


        
相关标签:
2条回答
  • 2021-01-31 20:04

    Here is an alternative:

    library(leaflet)
    library(htmltools)
    library(htmlwidgets)
    
    yourmap <- leaflet(height = "400px") %>% 
      addTiles() %>%
      addPolygons(data = Circle.Town, color = 'green',  fillOpacity = .7) %>%
      addCircleMarkers(data = df1, lat = ~lat, lng =~long, 
                       radius = ~VAM, popup = ~as.character(X), 
                       fillColor = ~pal(VAM),
                       stroke = FALSE, fillOpacity = 0.8,
                       clusterOptions = markerClusterOptions()) %>% 
      addLegend(position = "topright",
                pal = pal, values = df1$VAM,
                title = "VAM",
                opacity = 1
      ) %>% 
      setView(lng = 1, lat = -1, zoom = 8)
    
    setwd("~/Desktop/")
    saveWidget(yourmap, file="yourmap.html")
    

    In your desktop, you will have an html and a folder saved under yourmap. Open the leaflet.js file located in /pathTo/yourmap_files/leaflet-binding-1.0.1.9002. In leaflet.js, scroll down to var popup = df.get(i, 'popup'); and paste just below:

              marker.on('mouseover', function (e) {
        this.openPopup();
    });
    marker.on('mouseout', function (e) {
        this.closePopup();
    });
    

    Save and reopen yourmap.html file. Hover on one of your point!!

    0 讨论(0)
  • 2021-01-31 20:18

    This may have been added to the leaflet package since this question was posed a year ago, but this can be done via the label argument. I am using leaflet R package version 1.1.0.

    Read the data in as above:

    library(sp)
    library(leaflet)
    library(dplyr)
    
    circleFun <- function(center = c(0,0),diameter = 1, npoints = 100){
      r = diameter / 2
      tt <- seq(0,2*pi,length.out = npoints)
      xx <- center[1] + r * cos(tt)
      yy <- center[2] + r * sin(tt)
      Sr1 = Polygon(cbind(xx, yy))
      Srs1 = Polygons(list(Sr1), "s1")
      SpP = SpatialPolygons(list(Srs1), 1:1)
      return(SpP)
    }
    Circle.Town <- circleFun(c(1,-1),2.3,npoints = 100)
    
    df1 <- data.frame(long=c(0.6,1,1.4), lat=c(-2, -.8, -0.2), other=c('a', 'b', 'c'), VAM=c(10,8,6), 
      type=c('Public', 'Public', 'Private'), id=c(1:3)) %>% 
      mutate(X=paste0('<strong>id: </strong>', 
        id,
        '<br><strong>type</strong>: ',
        type,
        '<br><strong>VAM</strong>: ',
        VAM))
    
    # Create a continuous palette function
    pal <- colorNumeric(
      palette = "RdYlBu",
      domain = df1$VAM
    )
    

    But create a list of labels instead of vector:

    labs <- as.list(df1$X)
    

    And then lapply the HTML function over that list within the label argument. Note to use label instead of popup.

    library(htmltools)
    leaflet(height = "400px") %>% 
      addTiles() %>%
      addPolygons(data = Circle.Town, color = 'green',  fillOpacity = .7) %>%
      addCircleMarkers(data = df1, lat = ~lat, lng =~long, 
        radius = ~VAM, label = lapply(labs, HTML), 
        fillColor = ~pal(VAM),
        stroke = FALSE, fillOpacity = 0.8,
        clusterOptions = markerClusterOptions()) %>% 
      addLegend(position = "topright",
        pal = pal, values = df1$VAM,
        title = "VAM",
        opacity = 1
      ) %>% 
      setView(lng = 1, lat = -1, zoom = 8)
    

    This method is described in an an answer to this SO question: R and Leaflet: How to arrange label text across multiple lines

    There is more info on HTML in labels in leaflet documentation: https://rstudio.github.io/leaflet/popups.html

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