如何将 KML 层中的所有字段/扩展数据(不仅仅是“名称”和“描述”)加载到 R 中

2024-01-10

我一直致力于将 KML 文件加载到 R 中,以使用 Leaflet/Shiny 制作网络地图。导入非常简单(使用此示例 KML https://developers.google.com/kml/documentation/KML_Samples.kml):

library(rgdal)

sampleKml <- readOGR("D:/KML_Samples.kml", layer = ogrListLayers("D:/KML_Samples.kml")[1])

在这个例子中,ogrListLayers拉入所有 kml 层,并且我仅对第一个元素/层进行子集化。十分简单。

问题在于,使用此方法读取 KML 图层只会提取两个字段:“名称”和“描述”,如下所示:

> sampleKml <- readOGR("D:/KML_Samples.kml", layer = ogrListLayers("D:/KML_Samples.kml")[1])
OGR data source with driver: KML 
Source: "D:/KML_Samples.kml", layer: "Placemarks"
with 3 features
It has 2 fields
> sampleKml@data
                Name                                                                                  Description
1   Simple placemark Attached to the ground. Intelligently places itself at the height of the underlying terrain.
2 Floating placemark                                                  Floats a defined distance above the ground.
3 Extruded placemark                                              Tethered to the ground by a customizable "tail" 

因此,R 将 KML 图层读取为具有 3 个特征(3 个不同点)和两个字段(列)的 SpatialPointsDataFrame。然而,当我将图层拉入QGIS并读取其属性表时,除了Name和Description之外,还有很多字段,在这里看到 https://www.screencast.com/t/ME9k16cx4UG.

据我所知,“名称”和“描述”是 KML地标,并考虑任何附加数据扩展数据。我想将此扩展数据与地标数据一起导入。

有没有办法将所有这些 KML 图层字段/属性提取到 R 中?最好与readOGR(),但我愿意接受所有建议。


TL;DR

根本问题是缺少适用于 Windows 的 LibKML 库。我的解决方案是通过函数直接从 KML 中提取数据。

Problem

我遇到了同样的问题,经过一番谷歌搜索后,这似乎与 LibKML 和 Windows 有关。在我的 Ubuntu 机器上执行相同的代码会产生不同的结果,即加载保存的 KML 文件时检索到了 ExtendedData。

library(rgdal)
library(dplyr)
poly_df<-data.frame(x=c(1,1,0,0),y=c(1,0,0,1))
poly<-poly_df %>% 
  Polygon %>% 
  list %>% 
  Polygons(ID="1") %>% 
  list %>% 
  SpatialPolygons(proj4string = CRS("+init=epsg:4326")) %>% 
  SpatialPolygonsDataFrame(data=data.frame(test="this is a test"))

writeOGR(poly,"test.kml",driver="KML",layer="poly")
poly2<-readOGR("test.kml")
poly2@data

如果有人能够成功构建 LibKML [1],他/她将能够使用 ExtendedData [2] 加载 KML 文件。

在 Windows 上,LibKML 需要使用 Visual Studio 2005 [1] 构建。不再支持此 Visual Studio 版本 [3]。在 [3] user2889419 中提供了 2005 版本的链接。
我下载并安装了该版本,但构建 LibKML 最终失败,并出现大量错误和警告(某些文件不存在)。这是我停下来的原因,因为我远离了自己的舒适区,但想分享我的追逐结果。

R 中的解决方案

我的解决方案是直接读取KML,然后在通过rgdal的readOGR加载空间对象时提取扩展数据。我的假设是 readOGR 从文件顶部开始,就像我的提取例程一样。然后将两者合并,输出是 SpatialPolygonsDataFrame。
起初,我在从 KML 文件中提取节点时遇到了一些麻烦,因为我不知道命名空间的概念 [4]。 (编辑了以下函数,因为我遇到了其他来源的 KML 文件的问题。)

readKML <- function(file,keep_name_description=FALSE,layer,...) {
  # Set keep_name_description = TRUE to keep "Name" and "Description" columns
  #   in the resulting SpatialPolygonsDataFrame. Only works when there is
  #   ExtendedData in the kml file.

  sp_obj<-readOGR(file,layer,...)
  xml1<-read_xml(file)
  if (!missing(layer)) {
    different_layers <- xml_find_all(xml1, ".//d1:Folder") 
    layer_names <- different_layers %>% 
      xml_find_first(".//d1:name") %>% 
      xml_contents() %>% 
      xml_text()

    selected_layer <- layer_names==layer
    if (!any(selected_layer)) stop("Layer does not exist.")
    xml2 <- different_layers[selected_layer]
  } else {
    xml2 <- xml1
  }

  # extract name and type of variables

  variable_names1 <- 
    xml_find_first(xml2, ".//d1:ExtendedData") %>% 
    xml_children() 

  while(variable_names1 %>% 
        xml_attr("name") %>% 
        is.na() %>% 
        any()&variable_names1 %>%
        xml_children() %>% 
        length>0) variable_names1 <- variable_names1 %>%
    xml_children()

  variable_names <- variable_names1 %>%
    xml_attr("name") %>% 
    unique()

  # return sp_obj if no ExtendedData is present
  if (is.null(variable_names)) return(sp_obj)

  data1 <- xml_find_all(xml2, ".//d1:ExtendedData") %>% 
    xml_children()

  while(data1 %>%
        xml_children() %>% 
        length>0) data1 <- data1 %>%
    xml_children()

  data <- data1 %>% 
    xml_text() %>% 
    matrix(.,ncol=length(variable_names),byrow = TRUE) %>% 
    as.data.frame()

  colnames(data) <- variable_names

  if (keep_name_description) {
    sp_obj@data <- data
  } else {
    try(sp_obj@data <- cbind(sp_obj@data,data),silent=TRUE)
  }
  sp_obj
}

旧:通过 ReadLines 提取

我的解决方案是直接读取KML,然后在通过rgdal的readOGR加载空间对象时提取扩展数据。我的假设是 readOGR 从文件顶部开始,就像我的提取例程一样。然后将两者合并,输出是 SpatialPolygonsDataFrame。

library(tidyverse)
library(rgdal)

readKML<-function(file,keep_name_description=FALSE,...) {
  # Set keep_name_description = TRUE to keep "Name" and "Description" columns 
  #   in the resulting SpatialPolygonsDataFrame. Only works when there is 
  #   ExtendedData in the kml file.

  if (!grepl("\\.kml$",file)) stop("File is not a KML file.")
  if (!file.exists(file)) stop("File does not exist.")
  map<-readOGR(file,...)

  f1<-readLines(file)

  # get positions of ExtendedData in document
  exdata_position<-grep("ExtendedData",f1) %>% 
    matrix(ncol=2,byrow = TRUE) %>% 
    apply(1,function(x) {
      pos<-x[1]:x[2]
      pos[2:(length(pos)-1)]
    }) %>% 
    t %>% 
    as.data.frame

  # if there is no ExtendedData return SpatialPolygonsDataFrame
  if (ncol(exdata_position)==0) return(map)

  # Get Name of different columns
  extract1<-f1[exdata_position[1,] %>% 
                 unlist]  
  names_of_data<-extract1 %>% 
    strsplit("name=\"") %>%
    lapply(function(x) strsplit(x[[2]],split="\"") ) %>%
    unlist(recursive = FALSE) %>%
    lapply(function(x) return(x[1])) %>% 
    unlist

  # Extract Extended Data
  dat<-lapply(seq(nrow(exdata_position)),function(x) {
    extract2<-f1[exdata_position[x,] %>% 
                   unlist]  
    extract2 %>% 
      strsplit(">") %>%
      lapply(function(x) strsplit(x[[2]],split="<") ) %>% unlist(recursive = FALSE) %>%
      lapply(function(x) return(x[1])) %>% 
      unlist %>% 
      matrix(nrow=1) %>% 
      as.data.frame
  }) %>% 
    do.call(rbind,.)

  # Rename columns
  colnames(dat)<-names_of_data

  # Check if Name and Description should be dropped
  if (keep_name_description) {
    map@data<-cbind(map@data,dat)
  } else {
    map@data<-dat
  }
  map
}

[1] https://github.com/google/libkml/wiki/Building-and-installing-libkml https://github.com/google/libkml/wiki/Building-and-installing-libkml
[2] https://github.com/r-spatial/sf/issues/499 https://github.com/r-spatial/sf/issues/499
[3] 哪里可以下载 Visual Studio Express 2005? https://stackoverflow.com/questions/1330852/where-to-download-visual-studio-express-2005
[4] 在 R 中解析 XML:不正确的命名空间 https://stackoverflow.com/questions/29170161/parsing-xml-in-r-incorrect-namespaces

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 KML 层中的所有字段/扩展数据(不仅仅是“名称”和“描述”)加载到 R 中 的相关文章

  • 添加有关白天/黄昏/夜晚/黎明的信息以在 R 中跟踪数据

    我有一个数据集 其中包含几个月的日期时间 纬度和经度变量的跟踪数据 如下所示 gt start lt as POSIXct 2018 08 01 00 00 00 format Y m d H M S tz UTC gt datetime
  • R 中有没有快速替换列值的方法?

    假设我们有一个包含数值的数据框 如下所示 Temperature Height 32 157 31 159 33 139 我想更换Height价值观与pic 00001 pic 00002等等 最终结果是 Temperature Heigh
  • 在 Bookdown 中呈现附录图号

    Bookdown 是一个很棒的软件包 我期待看到它如何发展 但现在我在渲染数字方面遇到了麻烦pdf document2附录中的数字时的格式 具体来说 当带有标题的图形位于附录中时 图形编号应采用 A 1 A 2 B 1 B 2 等形式 但图
  • xml2 包 (R) 中的 xml_find_all 函数未找到相关节点

    我使用 R 中的 xml2 包来访问 xml 数据 发现它在不同的 xml documents 上表现不同 在这个宠物的例子中 library xml2 doc lt read xml
  • 如何处理重叠的因子水平? (例如,生成表格和图表时)

    我面临一个数据集的问题重叠因素水平 我想按因素级别生成时间线 条形图和统计数据 但是 我希望因子水平是模棱两可的 这意味着属于多个级别的观察结果应该在图中出现多次 这是我的数据结构的示例 head lt c ID YEAR BRAZIL G
  • 在 R 中使用 gamlss::lms 选择百分位数曲线

    我正在使用 gamlss 包中的示例代码来绘制百分位数曲线 library gamlss data abdom lms y x data abdom n cyc 30 它正在绘制自己的一组百分位数曲线 如何选择只绘制第 10 50 和 90
  • 完全缺失列的 VaR 计算

    我需要计算股票收益的滚动 VaR 从这篇文章 使用rollapply函数使用R进行VaR计算 https stackoverflow com questions 25045612 using rollapply function for v
  • R:邻接表到邻接矩阵

    Bonjour 我想将邻接列表 3 列 转换为邻接矩阵 在这个论坛中 我找到了多个有关如何将边列表转换为邻接矩阵的示例 我成功地为两列列表做到了这一点 我已经尝试了在网上可以找到的所有解决方案 但似乎我错过了一小步 我尝试过的 我的变量是用
  • 将函数应用于每个列组合

    我有一个数据框n列并希望对每个列应用一个函数组合列 这与如何cor 函数将数据帧作为输入并生成相关矩阵作为输出 例如 X lt data frame A rnorm 100 B rnorm 100 C rnorm 100 cor X 这将生
  • 在 R 中打印绘图时第一页为空

    我正在尝试创建一个包含多个图的pdf 更具体地说 我想保存我的图 每页 4 个 因此 我在 r 中有以下代码 可以工作 但将页面留空 第一个 pdf Plots plots numeric four in page pdf paper a4
  • r 连接两个列表并对它们的值求和

    我有两个列表 x y gt x carlo monte simulation model quantum 31 31 9 6 6 gt y model system temperature quantum simulation proble
  • 如何转置 R markdown 文档中的表格?

    假设我打印一个名为summary table的数据框 如下所示 summary table data frame a c 1 2 3 b c 11 12 13 c c 21 22 23 d c 31 32 33 e c 41 42 43 f
  • 为格子中的每个面板添加不同的独特标签

    很清楚如何在格子中标记面板 https stackoverflow com questions 8508269 how to label panels in lattice using panel text or ltext论据 但是 如果
  • 数据表中的 NA

    我有一个data table其中包含一些组 我对每个组进行操作 有些组返回数字 其他组返回NA 因为某些原因data table很难将所有东西重新组合在一起 这是一个错误还是我误解了 这是一个例子 dtb lt data table a 1
  • 粘贴两个 data.table 列

    dt lt data table L 1 5 A letters 7 11 B letters 12 16 L A B 1 1 g l 2 2 h m 3 3 i n 4 4 j o 5 5 k p 现在我想粘贴列 A 和 B 以获得一个新
  • 当我用一个观察值运行回归时,为什么“fastLm()”会返回结果?

    为什么fastLm 当我用一项观察进行回归时返回结果吗 下面为什么不lm and fastLm 结果相等吗 library Rcpp library RcppArmadillo library data table set seed 1 D
  • 如何在折线图中显示 Sep-12 格式的数据并抑制网格线和灰色背景?

    我正在努力使日期格式正确 数据已经是melt 格式 数据中有四个变量碰巧共享相同的数据 我只是想绘制一个简单的四线折线图 每个变量作为一条单独的线 并将 Sep 12 显示为最新数据点 我正在使用旧的 ggplot 请随意 我有两个问题 第
  • 如何在RcppParallel中调用用户定义的函数?

    受到文章的启发http gallery rcpp org articles parallel distance matrix http gallery rcpp org articles parallel distance matrix 我
  • R Leaflet:添加多边形时传递 popupOptions。

    Within addPolygons 有一个popup参数就像addPopups 功能 区别 我认为 是当弹出窗口创建时addPolygons 可以单击多边形内的任意位置来触发弹出窗口 但是如果addPopups 被使用 单个lng and
  • 使用 lpSolve 优化 R 团队名单

    我是 R 新手 有一个想要解决的特定幻想运动队优化问题 我见过其他帖子使用 lpSolve 来解决类似的问题 但我似乎无法理解代码 下面的示例数据表 每个球员都在一个球队中 扮演着特定的角色 有薪水 并且每场比赛都有平均得分 我需要的限制是

随机推荐

  • On Key Down 限制用户输入一些特殊字符

    我想限制用户在工具栏搜索中不允许他 她使用一些特殊字符 例如 gt tblFundComp bind keydown function e if e keyCode gt 48 e keyCode lt 57 return false el
  • Spring Security 配置 anyRequest().authenticated() 未按预期工作

    我对spring security配置的理解http anyRequest authenticated 是任何请求都必须经过身份验证 否则我的 Spring 应用程序将返回 401 响应 不幸的是 我的 spring 应用程序不会以这种方式
  • 如何解析命令行参数?

    我想解析 perl 脚本中的参数列表 例如我有这种情况 script pl h 127 0 0 1 u user p pass arg1 arg2 arg3 我该如何解析数组中不是选项的参数列表以及标量值中的选项参数 Thanks 好吧 如
  • 升级 3.0.3 -> 3.2.2 后,NServiceBus 端点寻找 RavenDB 超时

    使用 NuGet 我将项目中的所有 NServiceBus 引用从 3 0 3 升级到 3 2 2 对于此解决方案中的 4 个服务 我还为它们提供了对 NuGet 中的 NServiceBus Host 的引用 我将二进制文件部署到测试环境
  • formik中的submit Form、handleSubmit、onSubmit有什么区别?

    福米克医生说 https jaredpalmer com formik docs guides form submission https jaredpalmer com formik docs guides form submission
  • 从 Roslyn 方法调用中的相应参数获取方法参数的名称

    我想知道是否有一些现有的逻辑可以通过查看该特定方法 构造函数的调用来获取有关其包含的方法 构造函数签名中的参数定义的名称 或任何其他相关信息 基本上 我只是希望能够获得一个变量的默认名称 该名称将作为参数传递给调用 因此 如果一个方法定义如
  • Flexbox 使用align-items: flex-start 和align-content: center

    再会 我正在尝试使用 Flex 框在横轴上包含多余空间的 Flex 容器中强制执行以下行为 如果所有弹性项目都适合一行 那么它们应该在横轴的顶部对齐 但 一旦它们包裹起来 柔性项目应该凝结在横轴的中心 为此 我尝试了以下标记https js
  • 如何构建知识图谱?

    我用 PageRank 制作了一个可以在我的计算机上运行的小型搜索引擎的原型 我有兴趣在其之上构建一个知识图 它应该只返回在正确上下文中的查询网页 类似于谷歌如何找到搜索问题的相关答案 我看到了很多关于知识图的宣传 但没有很多文献 而且几乎
  • WPF 拖放和数据类型

    如何获取掉落物体的类型 如何将其添加到特定的结构 列表中 假设您控制拖动的开始 您不是从另一个应用程序拖动 则类型取决于您 只需使源代码和目标代码匹配即可 在拖动中 通常是 MouseMove 或 MouseDown 处理程序 var dr
  • 删除向量向量内的重复向量

    我有一个向量的向量 loops 其中包含整数值 一些内部向量是重复的 但它们的元素顺序不同 现在 我想获得一个向量的向量 而没有任何重复的内部向量 这是我的 vec 的一个例子 循环 9 18 26 11 9 9 11 26 18 9 9
  • 检查单个字符是否为空格?

    检查单个字符是否为空格的最佳方法是什么 我知道如何通过正则表达式检查这一点 但如果我只有一个角色 我不确定这是否是最好的方法 是否有更好的方法 关于性能 来检查它是否是空格 如果我做这样的事情 我猜我会想念像制表符这样的空白 if ch 如
  • 良好的图库引擎

    最好的开源图片库引擎是什么 既可以独立使用 也可以适用于 Wordpress 或 Drupal 等现有框架 希望随着时间的推移 我们可以在这里建立一个好的列表 Gallery http gallery menalto com是经典的选择 它
  • 网站在 Ipad/Iphone 模拟器与真实设备上的显示不同

    我搜索过很多iPad iPhone simulators 测试了我的网站 网站在几乎所有模拟器上看起来都不错 但是当我在真实的 iPad 中打开网站时 一切都出了问题 由于我无法在设备上检查等 因此很难知道出了问题并且无法进行相应调整 对此
  • 无法进行单元测试:$_SESSION 在每次测试运行之前清空

    我无法对我的代码进行单元测试 每次运行下一个测试时 SESSION 都会清除 当我运行 testStartProductSession 时 我的对象向 SESSION 变量添加一些数据 但是当我运行下一个测试方法 testSessionId
  • C# 中使用 Powershell 远程调用的内存泄漏

    我有一个 Windows 服务正在执行大量交换远程调用以获取一些服务器信息 我注意到 只要时间过去 服务使用的内存就会开始增长 直到引发内存异常 我已经搜索过 看起来有一个已知的内存泄漏System Management Automatio
  • Ektron 中的 FormBlock 服务器控制

    我正在使用 Ektron 8 6 我的模板页面中有一个 FormBlock 服务器控件 它具有工作区中有效 HTML 表单的 DefualutFormID 工作区中的表单有几个表单字段及其相应的值 当模板页面呈现时 我需要获取这些表单字段值
  • 无法移走或删除现有目标 C:\androidSDK\sdk\tools

    我无法更新 sdk 工具 我不知道为什么 如果使用此命令 sdkmanager update 或 android update sdk 它会给我类似标题的错误 Warning An error occured during installa
  • 如何在没有电视的情况下测试 Chromecast 应用?

    背景 我计划制作一个将内容 网址 内容 投射到 chromecast 的应用程序 我买了一个 ChromeCast 加密狗 使用 Google 的示例效果很好 问题 开发此类应用程序时要同时查看 3 个屏幕是相当烦人的 而且我更希望接收器也
  • TabControl 中的轨迹栏背景

    我在 TabControl 内的 TabPage 上有一个 TrackBar 控件 TrackBar 的背景绘制为灰色 而 TabPage 的背景绘制为白色 无法将 TrackBar 的 BackColor 属性设置为透明 并且我无法覆盖绘
  • 如何将 KML 层中的所有字段/扩展数据(不仅仅是“名称”和“描述”)加载到 R 中

    我一直致力于将 KML 文件加载到 R 中 以使用 Leaflet Shiny 制作网络地图 导入非常简单 使用此示例 KML https developers google com kml documentation KML Sample