多线串和彩色绘图的单独 long/lat 列

Separate long/lat columns for multilinestrings and plotting in colours

我是 R/leaflet 中的绘图新手。我正在将 a shapefile 与 multilinestrings 绘制到带有传单的 R 中。 有没有一种方法可以从几何列中提取纬度和经度坐标的单独列?我看过 and ,但我无法得到正确的结果,它是每列中 long/lat 坐标的混合。

我想要得到的最终结果是一个地图,其中线条根据变量 (like this) 着色,但为了 运行 循环,我需要 long/lat坐标分开。

我有两条评论:要导出多线串的纬度和经度坐标,您可以使用 sf::st_coordinates(),前提是您的多线串位于未投影的 CRS 中(否则您会得到东距和北距)。

但我相信 - 如果我正确理解你的问题 - 你会把它变得不必要的复杂。

基于变量的颜色编码多行可以通过leaflet::colorFactor()来完成。您首先通过命名查找 table 声明一个调色板 - 将值链接到颜色 - 然后将其应用到您的 leaflet::addPolylines() 调用中。

举例说明这段代码;由于您的 shapefile 不可重现,因此我使用来自 Natural Earth 的 13 条河流的数据集来获取多线串(任何多线串)。

library(rnaturalearth) # to get some multilinestrings / any multilinestrings :)
library(dplyr)
library(sf)

rivers <- ne_download(category = 'physical', 
                      scale = 110, 
                      type = 'rivers_lake_centerlines',
                      returnclass = 'sf') %>% 
  mutate(color_source = case_when(name %in% c('Mississippi',
                                              'Peace',
                                              'Amazonas',
                                              'Paraná') ~ "Americas",
                                  T ~ "Rest of World")) %>% 
  group_by(color_source) %>% 
  summarise()
  
library(leaflet)

# prepare a palette - manual colors according to color_source column
palPwr <- leaflet::colorFactor(palette = c("Americas" = "red", 
                                           "Rest of World" = "blue"), 
                               domain = rivers$color_source)

# first prepare a leaflet plot ...
lplot <- leaflet(rivers) %>% 
  addProviderTiles("CartoDB.Positron") %>% # or any other basemap...
  addPolylines(color = ~palPwr(color_source), # note the tilde notation!
               opacity = 2/3) %>% # opacity = alpha
  leaflet::addLegend(position = "bottomright",
                     values = ~color_source, # data frame column for legend
                     opacity = .7, # alpha of the legend
                     pal = palPwr, # palette declared earlier
                     title = "Rivers of the World")

lplot #  ... then display it