【问题标题】:Get longitude and latitude from a shapefile with Leaflet in R使用R中的Leaflet从shapefile中获取经度和纬度
【发布时间】:2020-08-05 17:24:36
【问题描述】:

我一直在尝试使用leaflet 进行映射以添加addCircles(),但我的shapefile 似乎没有纬度lat 和经度lng 参数所以我得到了每个城市的质心下面的代码,但它似乎没有向我显示质心点,所以我输入了一个 df 这些值,但我无法自动获取 n 个城市的点。

数据为here

library(stringr)
library(leaflet)
library(sf)
library(dplyr)
quito = st_read("C:/Users/crist/Downloads/Administraciones Zonales/Administración_Zonal.shp") %>% 
  st_simplify(dTolerance = 1000) %>% 
  sf::st_transform('+init=epsg:4326')

sectores = read.csv("C:/Users/crist/Downloads/sector.csv", header = T,sep = ";", dec = ",", row.names = 1)
sectores

full_data = inner_join(quito, sectores, by = 'NOMBRE') %>%
  mutate(label_map = sprintf("<strong>%s </strong><br/>Valor: %g<br/>",NOMBRE, TARIFA_PROMEDIO_POR_HAB_DISPONIBLE_...) %>% lapply(htmltools::HTML))

bins = c(0, 10, 50, 100, 150,250)
pal_quito <- colorBin("Oranges", domain = full_data$TARIFA_PROMEDIO_POR_HAB_OCUPADA_..., 
                      bins = bins)

#I tried to do this because my shp didn't have the longitude and latitude variables 

full_data$centroids <- st_transform(full_data, 29101) %>% 
  st_centroid() %>% 
  st_geometry()

lngt_q = c(-78.41782, -78.67333, -78.4823, -78.60407, -78.36822, -78.50851, -78.56278, -78.3023)
lat_q = c(-0.08668143, -0.2179538, -0.1585809, 0.09029626, -0.4124271, -0.2112893, -0.311081, -0.2025039)

full_data$lngt_q =lngt_q
full_data$lat_q =lat_q

leaflet(data = full_data) %>%
  addTiles() %>% 
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(data = full_data,
              color = "#444444", 
              weight = 1,
              smoothFactor = 0.5, 
              fillOpacity = 0.2,
              label = full_data$label_map, 
              fillColor = pal_quito(full_data$TARIFA_PROMEDIO_POR_HAB_OCUPADA_...),
              stroke = T,
              highlightOptions = highlightOptions(
                weight = 5,
                color = "#666666",
                fillOpacity = 0.7)) %>% 
  addCircles(full_data$centroids, lng = lngt_q, lat = lat_q, color = "#045a8d", weight = 1, radius =1500,
             fillOpacity = 0.2)

[更新] 有一种方法可以自动获取我的 shapefile 的经度和纬度。

【问题讨论】:

    标签: r leaflet maps centroid


    【解决方案1】:

    我认为您可以通过使用st_centroid 将质心几何图形添加到您的多边形层来做到这一点。

    library(stringr)
    library(leaflet)
    library(sf)
    library(dplyr)
    library(mapview)  # I believe this is needed to make code above function
    
    quito = st_read("C:/Users/Brian/Downloads/Administraciones Zonales/Administración_Zonal.shp") %>% 
          st_simplify(dTolerance = 1000) %>%
          #logintud y latitud   # this produced an error, thin it is intended as comment
          sf::st_transform('+init=epsg:4326')
    
    ## Adding the centroid of each polygon as a separate geometry column. This will not be active but can be accessed as needed
    quito$geom2 = st_centroid(quito)
    
    

    您将收到一条警告,指出质心将不准确,因为您处于地理而非投影坐标系中,并且 st_centroid 假定为投影几何。我猜想这不会在低纬度或中纬度的相当小的多边形上造成问题,但你应该意识到可能会出现失真。如果您需要更高的精度,您可以在变形为 EPSG:4326 (WGS84) 之前计算您的质心。如果您要走这条路线,您可能希望将质心创建为单独的点,分别扭曲它们,然后连接或使用单独的点作为数据集,将圆添加到地图中。

    此时您可以继续编写脚本直到最后一行,此时您需要指定我们之前创建的 geom2 列作为数据源

          addCircles(data = full_data$geom2, fill = TRUE, stroke = TRUE, color = "#000", fillColor = "blue", radius = 800, weight = 1)   ## I increased the radius to get it to display 
    

    我不知道在此处分享传单的最佳做法,但显示的是静态图片

    【讨论】:

    • 哇,这太棒了,我知道我可以让这种方式变得更容易。要共享地图,您只需像常规绘图一样在查看器中公开它。
    • 我有一个问题,为什么我不能使用mutate(geom2 = st_centroid(quito)) 函数?我不是 dplyr 软件包的专家。
    • @cdcarrion 我认为这是因为来自 tidyverse/dplyr 的 mutate 动词期望为每一行提供单个输出,例如均值或求和类型函数,而 st_centroid 是按行操作的首先返回一个data.frame,所以dplyr不知道如何处理合并data.frame-查看st_centroid(quito)的输出--它返回所有属性。我怀疑 dplyr 不知道它只需要几何列。可能有一种方法可以让它工作,但我对 sf 包的了解不够,无法让它工作。
    猜你喜欢
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多