Я создаю приложение Shiny-листовка, для которого хочу использовать векторную карту ESRI из моей организации. Я вижу, что листовка связана с ним, поскольку атрибуция точна. Однако плитки не загружаются. Я пробовал использовать различные параметры в пакете esri.leaflet и даже безуспешно пытался импортировать плагины JavaScript.
library(shiny)
library(leaflet)
library(sf)
library(dplyr)
library(here)
library(leaflet.extras)
library(leaflet.esri)
library(bcmaps)
library(rmapshaper)
library(htmltools)
library(htmlwidgets)
ha <- bcmaps::health_ha() %>%
ms_simplify(., keep = 0.05, keep_shapes = TRUE) %>%
rename_with(tolower, everything()) %>%
select(ha_code = hlth_authority_code,
ha_name = hlth_authority_name,
geometry) %>%
st_transform(crs = 4326) %>%
mutate(color = c("#3891A7",
"#C3860D",
"#C42E2E",
"#67A63C",
"#914FAB"))
ui <- fluidPage(
leafletOutput("main_map")
)
server <- function(input, output, session) {
output$main_map <- renderLeaflet({
leaflet() %>%
addEsriFeatureLayer(
url = "https://tiles.arcgis.com/tiles/ubm4tcTYICKBpist/arcgis/rest/services/BC_BASEMAP_20240307/VectorTileServer",
useServiceSymbology = TRUE
) %>%
addPolygons(data = ha,
stroke = TRUE,
weight = 1,
color = ~color,
opacity = 0.5,
fillColor = ~color,
fillOpacity = 0.3)
})
}
shinyApp(ui, server)
Основываясь на комментариях G.Cocca, я попытался адаптировать код после просмотра этого вопроса.
library(dplyr)
library(leaflet)
library(htmltools)
library(htmlwidgets)
esriLeafletPlugin <- htmlDependency(
"esri-leaflet", "3.0.12",
src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/esri-leaflet.min.js",
script = "EsriLeaflet.min.js")
esriVectorTilesPlugin <- htmlDependency(
"esri-leaflet-vector", "4.2.3",
src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/esri-leaflet-vector-debug.min.js",
script = "VectorTileLayer.min.js")
registerPlugin <- function(map, plugin) {
map$dependencies <- c(map$dependencies, list(plugin))
map}
leaflet() %>%
registerPlugin(esriLeafletPlugin) %>%
registerPlugin(esriVectorTilesPlugin) %>%
onRender("function(el, x) {
L.esri.Vector.vectorTileLayer(
'https://tiles.arcgis.com/tiles/ubm4tcTYICKBpist/arcgis/rest/services/BC_BASEMAP_20240307/VectorTileServer'
).addTo(this);
}")
Однако это не совсем правильно
Failed to load resource: the server responded with a status of 404 (Not Found)
VM13:3 Uncaught TypeError: Cannot read properties of undefined (reading 'Vector')
at e.eval (eval at tryEval (htmlwidgets.js:252:16), <anonymous>:3:15)
at Object.eval (eval at tryEval (htmlwidgets.js:252:16), <anonymous>:6:11)
at htmlwidgets.js:240:18
at Array.forEach (<anonymous>)
at forEach (htmlwidgets.js:55:14)
at evalAndRun (htmlwidgets.js:230:7)
at htmlwidgets.js:653:11
at Array.forEach (<anonymous>)
at forEach (htmlwidgets.js:55:14)
at htmlwidgets.js:574:7
Потрясающе, спасибо!
Я думаю, ваш код должен работать, если вы измените ссылку на src
. Я думаю, вы выбрали не тот плагин. Смотрите мой ответ.
Следующий код импортирует векторный элемент. Как я уже говорил, вам необходимо зарегистрировать 2 плагина ESRI: подробнее: []https://developers.arcgis.com/esri-leaflet/install-and-setup/
library(leaflet)
library(sf)
library(dplyr)
library(leaflet.extras)
library(leaflet.esri)
library(rmapshaper)
library(bcmaps)
library(htmltools)
library(htmlwidgets)
VectorTilePlugin <- htmlDependency("esri-leaflet-vector", "4.2.3",
src = c(href = "https://unpkg.com/esri-leaflet-vector@4/dist/"),
script = "esri-leaflet-vector.js")
esriPlugin <- htmlDependency("leaflet.esri", "1.0.3",
src = c(href = "https://cdn.jsdelivr.net/leaflet.esri/1.0.3/"),
script = "esri-leaflet.js")
registerPlugin <- function(map, plugin) {
map$dependencies <- c(map$dependencies, list(plugin))
map}
ha <- bcmaps::health_ha() %>%
ms_simplify(., keep = 0.05, keep_shapes = TRUE) %>%
rename_with(tolower, everything()) %>%
select(ha_code = hlth_authority_code,
ha_name = hlth_authority_name,
geometry) %>%
st_transform(crs = 4326) %>%
mutate(color = c("#3891A7",
"#C3860D",
"#C42E2E",
"#67A63C",
"#914FAB"))
leaflet() %>%
registerPlugin(esriPlugin) %>%
registerPlugin(VectorTilePlugin)%>%
onRender("function(el, x){L.esri.Vector.vectorTileLayer('https://tiles.arcgis.com/tiles/ubm4tcTYICKBpist/arcgis/rest/services/BC_BASEMAP_20240307/VectorTileServer').addTo(this); }") %>%
addPolygons(data = ha,
stroke = TRUE,
weight = 1,
color = ~color,
opacity = 0.5,
fillColor = ~color,
fillOpacity = 0.3)
вам нужно зарегистрировать 2 плагина листовок, чтобы листовка работала с ними. Я пришлю тебе код позже