Получите долготу и широту из шейп-файла с помощью Leaflet в R - PullRequest
0 голосов
/ 22 апреля 2020

Я пытался сопоставить с leaflet, чтобы добавить addCircles(), но мой шейп-файл, похоже, не имеет параметров широты lat и долготы lng, поэтому я получил центроиды для каждого города, как и приведенный ниже код, но он не показывает мне точки центроида, поэтому я ввел df эти значения, но не могу автоматизировать получение точек для n городов.

Данные здесь .

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)

[обновлено] Существует способ автоматически получить долготу и широту моего шейп-файла.

enter image description here

1 Ответ

1 голос
/ 22 апреля 2020

Я думаю, что вы можете сделать это, добавив геометрию центроида к слою полигона с помощью 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)

Вы получите предупреждение, указывающее, что центроиды не будут точными, потому что вы находитесь в географической области c, а не в проекционной системе координат, а 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 

enter image description here

Я не знаю лучших практик, чтобы поделиться здесь листовкой, но stati c показанное изображение

...