【发布时间】:2018-01-12 22:46:20
【问题描述】:
我有一个 kml 文件,this 的解压版本。它有数千个带有 XML 标记的图层,其中许多图层名称重复。
我想使用sf::st_read 将其加载到 R 中。诀窍是st_read 一次读取一个层并需要一个层名。我很乐意遍历使用st_layers()获取的层名称,如果它们是唯一的,但它们不是。
是否有另一种方法来指定所需的层,或者是否有一种方法可以批量重命名具有唯一 ID 的所有层?
谢谢。
根据下面接受的答案添加一些颜色。最初,我尝试使用 'read_xml' 编辑 <name> 节点,但似乎没有找到。
我下载了 KMZ 文件,将其加载到 Google 地球中,然后将其另存为 KML 文件(“Reports.kml”)。这是我的第一个错误。生成的 KML 是制表符分隔的,这让 read_xml 感到困惑。它是有效的 XML,但即使 st_ 函数有效,read_xml 也无法正确识别标签。最好在 KMZ 文件上使用unzip。以下是使用 Google-Earth 保存的版本会发生的情况:
layers<-st_layers("reports.kml")
data_frame(name=layers$name, type=flatten_chr(layers$geomtype)) %>%
count(name, type, sort=TRUE)
# A tibble: 1,358 x 3
# name type n
# <chr> <chr> <int>
# 1 July 2006 25
# 2 October 2006 25
# 3 August 2008 20
# 4 July 2009 19
# 5 August 2005 18
# 6 August 2007 18
# 7 November 2006 18
# 8 October 2004 17
# 9 August 2000 16
#10 November 2012 16
# ... with 1,348 more rows
kml<-read_xml("reports.kml")
xml_find_all(kml, ".//Folder/name")
# {xml_nodeset (0)}
没什么!但是有一些东西:
xml_children(kml)
# {xml_nodeset (1)}
# [1] <Folder>\n <name>Reports</name>\n <open>1</open>\n <Folder>\n
# <name>Class A</name>\n ...
解压后的 KMZ 会发生以下情况:
download.file(url="http://www.bfro.net/app/AllReportsKMZ.aspx",
destfile = "AllBFROReports.kmz",
mode="wb")
unzip("AllBFROReports.kmz",junkpaths = TRUE) #creates "doc.kml"
layers <- st_layers("doc.kml")
data_frame(name=layers$name, type=flatten_chr(layers$geomtype)) %>%
count(name, type, sort=TRUE)
# # A tibble: 1,376 x 3
# name type n
# <chr> <chr> <int>
# 1 July 2006 25
# 2 October 2006 25
# 3 August 2008 20
# 4 July 2009 19
# 5 August 2005 18
# 6 August 2007 18
# 7 November 2006 18
# 8 October 2004 17
# 9 August 2000 16
# 10 November 2012 16
# # ... with 1,366 more rows
st_layers 是一样的,但是现在节点已经正确找到了!
kml <- read_xml("doc.kml")
xml_find_all(kml, ".//Folder/name")
{xml_nodeset (3874)}
[1] <name>June 2000</name>
[2] <name> 1995</name>
[3] <name>February 2004</name>
[4] <name>June 2004</name>
[5] <name>February 2004</name>
[6] <name>April 2008</name>
[7] <name>July 2009</name>
[8] <name>September 1981 and 1982</name>
[9] <name>July 1999</name>
[10] <name>November 1983</name>
[11] <name>October 2000</name>
[12] <name>August 1993</name>
[13] <name> 79, 80, 99</name>
[14] <name> 1978</name>
[15] <name>November 1980</name>
[16] <name>January 1997</name>
[17] <name> 1990</name>
[18] <name>December 1996</name>
[19] <name> 2000</name>
[20] <name> 2001</name>
...
现在下面提供的答案就像一个魅力!
【问题讨论】: