如何在 R 中正确读取 KML 文件,或将集中变量分离到列中

问题描述 投票:0回答:3

我使用以下内容读取了 KML 文件:

clinics = st_read(dsn = "Data/clinics-kml.kml","CLINICS")

但是,我的所有变量(坐标除外)都集中到

Description
下的 1 列中(请参见下面的链接)。

分离变量的最佳方法是什么?或者,有没有办法正确导入 KML 文件以避免此问题? You may view the screenshot of the problem here.

r kml r-sf
3个回答
4
投票

问题(或者可能不是)是 Description 列有一个 html 表作为每个观察的字符串。如果您想解析该 html 字符串并获得漂亮的表格(例如在创建交互式网络地图时),那就很好。但如果你只想要里面的数据,那就很麻烦了。

因此,只需按照以下步骤即可在 R 中完成所有过程:

  1. 从互联网下载 KML 文件
  2. 解压下载的文件
  3. 将 KML 文件读取为空间对象
  4. 获取每个观察的属性
  5. 将属性绑定到每个观察作为新列

所有代码均已注释,见下文:

library(tidyverse)
library(sf)
library(mapview)
library(rvest)
library(httr)

# 1) Download the kml file
moh_chas_clinics <- GET("https://data.gov.sg/dataset/31e92629-980d-4672-af33-cec147c18102/download",
                        write_disk(here::here("moh_chas_clinics.zip"), overwrite = TRUE))

# 2) Unzip the downloaded zip file 
unzip(here::here("moh_chas_clinics.zip"))

# 3) Read the KML file as a Spatial object
moh_chas_clinics <- read_sf(here::here("chas-clinics-kml.kml"))

# Watch data
moh_chas_clinics %>%
  glimpse()

# See map
mapview(moh_chas_clinics)

# 4) Get the attributes for each observation

# Option a) Using a simple lapply
attributes <- lapply(X = 1:nrow(moh_chas_clinics), 
                     FUN = function(x) {

                       moh_chas_clinics %>% 
                         slice(x) %>%
                         pull(Description) %>%
                         read_html() %>%
                         html_node("table") %>%
                         html_table(header = TRUE, trim = TRUE, dec = ".", fill = TRUE) %>%
                         as_tibble(.name_repair = ~ make.names(c("Attribute", "Value"))) %>% 
                         pivot_wider(names_from = Attribute, values_from = Value)

                     })

# Option b) Using a Parallel lapply (faster)
future::plan("multisession")

attributes <- future.apply::future_lapply(X = 1:nrow(moh_chas_clinics), 
                                          FUN = function(x) {

                                            moh_chas_clinics %>% 
                                              slice(x) %>%
                                              pull(Description) %>%
                                              read_html() %>%
                                              html_node("table") %>%
                                              html_table(header = TRUE, trim = TRUE, dec = ".", fill = TRUE) %>%
                                              as_tibble(.name_repair = ~ make.names(c("Attribute", "Value"))) %>% 
                                              pivot_wider(names_from = Attribute, values_from = Value)

                                          })

# 5) Bind the attributes to each observation as new columns
moh_chas_clinics_attr <- 
  moh_chas_clinics %>%
  bind_cols(bind_rows(attributes)) %>%
  select(-Description)

# Watch new data
moh_chas_clinics_attr %>%
  glimpse()

# New map
mapview(moh_chas_clinics_attr, 
        zcol = "CLINIC_PROGRAMME_CODE", 
        layer.name = "Clinic Programme Code")

最终地图作为示例,显示点的所有属性并按“诊所程序代码”着色:


0
投票

想出了另一种方法,使用 QGIS 将 KML 转换为 SHP。然后将其作为 SHP 读入 R。


0
投票

我得到了选项 1 的以下答案

repaired_names()
中的错误: !修复后的名称长度为 2,而不是长度 15。 运行
rlang::last_trace()
查看错误发生的位置。

选项2 vec_size() 中的错误:

x
必须是向量,而不是 对象。

© www.soinside.com 2019 - 2024. All rights reserved.