2015-06-21 7 views
10

Mein Merkzettel Karte sieht wie folgt aus etwas:Popup beim Schweben mit Flugblatt in R?

library(sp) 
library(leaflet) 
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 
) 

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) 

Gerade jetzt, ich ein Popup-Fenster, wenn ich einen der Kreise klicken. Ist es möglich, Informationen zu erhalten, wenn ich mit der Maus klicke anstatt zu klicken? Im Idealfall möchte ich etwas wie this.

Danke! Hier

Antwort

6

Dies wurde möglicherweise zum Prospektpaket hinzugefügt, da diese Frage vor einem Jahr gestellt wurde, aber dies kann über das Argument label erfolgen. Ich verwende die Broschüre R-Paket Version 1.1.0.

Lesen Sie die Daten in wie oben:

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 
) 

Aber eine Liste von Etiketten anstelle von Vektor erstellen:

labs <- as.list(df1$X) 

Und dann lapply die HTML Funktion über diese Liste im label Argument. Hinweis zu verwenden label anstelle von 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) 

Diese Methode in einer Antwort auf diese Frage SO beschrieben: R and Leaflet: How to arrange label text across multiple lines

Es gibt mehr Informationen über HTML in Etiketten in Beilage Dokumentation ist: https://rstudio.github.io/leaflet/popups.html

0

ist eine 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 Ihrem Desktop erhalten Sie eine html haben und einen Ordner unter yourmap gespeichert. Öffnen Sie die Datei "leaflet.js" in /pathTo/yourmap_files/leaflet-binding-1.0.1.9002. In leaflet.js, nach unten scrollen zu var popup = df.get(i, 'popup'); und fügen Sie direkt unter:

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

Speichern und yourmap.html Datei öffnen. Schwebe auf einen deiner Punkte !!

+0

ich diese Lösung mit Karte meiner Broschüre versucht und bekomme keinen Ordner mit "yourmap", wenn ich die saveWidget-Funktion verwende. Alles, was ich bekomme, ist die .html-Datei. Wenn ich dies in Brackets öffne (mein Texteditor der Wahl), ist 'var popup = ...' nicht vorhanden. Irgendwelche Vorschläge? – Lauren

+0

@Lauren, es tut mir leid, aber ich habe keinen Zugriff auf meine R-Codes; Ich habe keinen Computer mehr! Aber wenn Sie auf die HTML-Datei klicken, haben Sie Ihre Broschüre? Wenn Sie den Code ausführen, haben Sie irgendwelche Warnungen? – MLavoie

+0

Ja, meine Karte erscheint, wenn ich auf die .html-Datei klicke. Wenn ich es mit meinem Texteditor öffne, gibt es ein paar super lange (scheinbar) Kauderwelsch-Strings, eine Tonne Koordinaten und dann scheinbar Popup-Informationen. Mit meiner relativ begrenzten Erfahrung mit Leaflet in Javascript, ich verstehe nicht wirklich die Syntax als JS. Keine Warnungen, wenn ich es öffne! – Lauren