Leaflet in R: SetView based on range of latitude and longitude from dataset

微笑、不失礼 提交于 2019-12-11 02:35:48

问题


In ggmap, you can set the view of the map based on longitude and latitude of input data, where two columns of csv are Longitude and Latitude, i.e.

sep <- read.csv("31R_SEP_assets_csv.csv")

# get the map
bbox <- make_bbox(sep$Longitude, sep$Latitude, f = 0.3)
map <- get_map(bbox)

I am searching for similar function in leaflet, but so far, I only find setView() that takes in an actual value for latitude and longitude, i.e.

m <- leaflet() %>% setView(lng = -71.0589, lat = 42.3601, zoom = 12)
m %>% addTiles()

What function to use?

Here's my code so far

library(ggmap)
library(ggplot2)
library(historydata)
library(leaflet)
library(rgdal)

setwd("d:/GIS/31R")
sep <- read.csv("31R_SEP_assets_csv.csv")

Sub1 <- sep[grep("SEP.12", names(sep))]
sep$newCol <- 100*rowSums(Sub1)/rowSums(sep[4:7])

# create a new grouping variable
Percent_SEP12_Assets <- ifelse(sep[,8] <= 33, "Less than 33%", ifelse(sep[,8] >= 66, "More than 66%", "Between 33% and 66%"))


leaflet(data = sep[]) %>% addTiles() %>%
  addMarkers(~Longitude, ~Latitude,  popup = ~as.character(paste(Site, Percent_SEP12_Assets , sep=", "))) 

and output is zoomed out all the way

dput(sep)
structure(list(Site = structure(1:5, .Label = c("Staten Island\\31R001", 
"Staten Island\\31R002", "Staten Island\\31R003", "Staten Island\\31R004", 
"Staten Island\\31R005"), class = "factor"), Latitude = c(40.508874, 
40.577256, 40.520825, 40.552373, 40.529697), Longitude = c(-74.244048, 
-74.100135, -74.211845, -74.195516, -74.187532), Windows.SEP.11 = c(63L, 
174L, 11L, 85L, 163L), Mac.SEP.11 = c(0L, 1L, 4L, 0L, 0L), Windows.SEP.12 = c(124L, 
185L, 9L, 75L, 23L), Mac.SEP.12 = c(0L, 1L, 32L, 1L, 0L), newCol = c(66.3101604278075, 
51.5235457063712, 73.2142857142857, 47.2049689440994, 12.3655913978495
)), .Names = c("Site", "Latitude", "Longitude", "Windows.SEP.11", 
"Mac.SEP.11", "Windows.SEP.12", "Mac.SEP.12", "newCol"), row.names = c(NA, 
-5L), class = "data.frame")

Update

Tried

addTiles(do.call(fitBounds, args = c(list(map = leaflet()), as.list(setNames(make_bbox(sep$Longitude, sep$Latitude, f = 0.3), c("lng1", "lat1", "lng2", "lat2")))))

and map is blank

then tried

leaflet(data = sep[]) %>% addTiles()  %>%
  fitBounds(~min(sep$Longitude), ~min(sep$Latitude), ~max(sep$Longitude), ~max(sep$Latitude)) %>%
  addMarkers(~Longitude, ~Latitude,  popup = ~as.character(paste(Site, Percent_SEP12_Assets , sep=", "))) 

And map is still zoomed out ...

Workaround

I am using setView that uses average of Longitude and Latitude

leaflet(data = sep[]) %>% 
  setView(lng = mean(sep$Longitude), lat = mean(sep$Latitude), zoom = 12) %>% addTiles()  %>%
  addMarkers(~Longitude, ~Latitude,  popup = ~as.character(paste(Site, Percent_SEP12_Assets , sep=", "))) 

Seems to work so far ....


回答1:


Use

fitBounds(lng1 = min(table$lng), 
          lat1 = min(table$lat), 
          lng2 = max(table$lng), 
          lat2 = max(table$lat))


来源:https://stackoverflow.com/questions/31406598/leaflet-in-r-setview-based-on-range-of-latitude-and-longitude-from-dataset

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!