#r #leaflet #geospatial #projection #sf
Вопрос:
Я новичок в геопространственных данных и пытаюсь создать карту choropleth с помощью листовки и шейп-файла.
Я попытался отобразить данные на карте листовки, но получил ошибку: Ошибка: Необходимо указать x
/ y
атрибуты, что, по-видимому, связано с некоторыми проблемами с проекцией и не уверен, как исправить проекции в соответствии с листовкой().
Мои проекции шейп-файлов
ind_global$geometry %>%
st_crs()
выход:
User input: WGS 84
wkt:
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["latitude",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["longitude",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4326]]
library(raster)
crs(ind_global$geometry)
CRS arguments: proj=longlat datum=WGS84 no_defs
(ОБНОВЛЕНИЕ:
Ссылка на набор данных геометрии ind_global
: https://github.com/johnsnow09/covid19-df_stack-code/blob/main/ind_global_rds.rds )
Код, который я пробовал:
library(tidyverse)
library(sf)
libraary(leaflet)
library(htmlwidgets)
pal <- colorBin(palette = "OrRd", 9, domain = ind_global$total_vaccinations)
ind_global %>%
st_as_sf() %>%
st_transform(crs = " init=epsg:4326") %>%
leaflet() %>%
addProviderTiles(provider = "CartoDB.Positron") %>%
add_polygons(label = Country.Region,
stroke = FALSE,
smoothFactor = .5,
opacity = 1,
fillOpacity = 0.7,
fillColor = ~ pal(total_vaccinations),
highlightOptions = highlightOptions(weight = 5,
fillOpacity = 1,
bringToFront = TRUE)) %>%
addLegend("bottomright",
pal = pal,
values = ~ total_vaccinations,
title = "total Vaaccinations",
opacity = 0.7)
Также пробовал с приведенными ниже прогнозами, но получил ошибку:
st_transform(crs = " proj=longlat datum=WGS84 no_defs")
st_transform(crs = " proj=longlat ellps=GRS80")
Файл формы при построении с помощью ggplot amp; geom_sf()
Ответ №1:
Я думаю, что эта проблема, по крайней мере, когда я запускал ваш код, заключалась в том, что Country.Region является фактором, а не символьной переменной. Я внес всего несколько изменений в ваш код и получил то, что, как я думаю, вам нужно:
library(sf)
library(leaflet)
library(htmlwidgets)
library(riskyr)
ind_global<-readRDS("C:/Users/SCMCKENZIE/Downloads/ind_global_rds.rds")
pal <- colorBin(palette = "OrRd", 9, domain = ind_global$total_vaccinations)
tmp<-ind_global %>%
st_as_sf() %>%
st_transform(crs = " init=epsg:4326")
tmp %>% leaflet() %>%
addProviderTiles(provider = "CartoDB.Positron") %>%
addPolygons(label = as.character(tmp$Country.Region),
stroke = FALSE,
smoothFactor = .5,
opacity = 1,
fillOpacity = 0.7,
fillColor = ~ pal(total_vaccinations),
highlightOptions = highlightOptions(weight = 5,
fillOpacity = 1,
bringToFront = TRUE)) %>%
addLegend("bottomright",
pal = pal,
values = ~ total_vaccinations,
title = "total Vaaccinations",
opacity = 0.7)
Комментарии:
1. Спасибо, Шон, но я не уверен, что в этом проблема, потому что перед тем, как опубликовать сообщение здесь, я попробовал код, комментируя
label = Country.Region
, который не сработал, и теперь я запустил свой исходный код с редактированиемlabel = as.character(Country.Region)
, и он все еще не работал. Но когда я запускаю ur-код, который сначала сохраняет данные как объект, он работает идеально. Так что очень ценю вашу помощь, так как ваш код работает отлично !!2. Я думаю, что ссылка на переменную как на часть фрейма данных является необходимостью:
tmp$Country.Region
в противном случае она выдает ошибку, которая является странной, посколькуtotal_vaccination
в этой функции используется другая переменная без упоминания фрейма данных$var. Иногда я вообще не получаю функции r, а также в справке ничего не упоминается3. Я предполагаю, почему
tmp$Country.Region
необходимо использовать, хотя я не уверен, что это так, заключается в том, что вы не можете принудить переменные к новым типам данных, используя синтаксис%>%
конвейера, без явного определения его из фрейма данных с помощью$
. Я столкнулся с этим с пакетами `tidyverse».Tidyverse
обладает множеством отличных функциональных возможностей, но я думаю, что это предполагает, что каждый, кто его использует, является программистом, и некоторые из этих причуд очевидны. Не будучи сам программистом, я часто сталкиваюсь с этими препятствиями.4. Да, я полностью с тобой согласен. Я также не программист, поэтому сталкиваюсь с этими проблемами через день !!