Как найти правильную проекцию данных шейп-файла для карты листовки в r?

#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. Да, я полностью с тобой согласен. Я также не программист, поэтому сталкиваюсь с этими проблемами через день !!