getKMLcoordinates返回列表列表而不是段列表

Mar*_*ret 2 gps r kml

我通过绘制R中的kml坐标并在顶部覆盖物种丰度数据,制作了一张很酷的地图.当我第一次编写代码时,我使用以下内容来调用我的坐标列表:
spa<-getKMLcoordinates('Perimeter_Track.kml', ignoreAltitude=TRUE)

summary(spa) 收益:

 Length Class  Mode   
[1,] 128 -none- numeric

[2,] 242 -none- numeric

[3,] 34 -none- numeric

[4,] 126 -none- numeric
Run Code Online (Sandbox Code Playgroud)

(GPS坐标是以4个块为单位测量的周边轨迹,因此每个列表都是其中一个块):现在当我再次运行代码时,summary(spa)返回:

         Length Class  Mode
[1,] 2      -none- list
[2,] 2      -none- list
[3,] 2      -none- list
[4,] 2      -none- list
Run Code Online (Sandbox Code Playgroud)

如果我使用spa将spa转换为数据帧as.data.frame(),当我尝试rbind将4个块连接成一个大的轨道时,我仍然会收到此错误:

Error in match.names(clabs, names(xi)) : 
  names do not match previous names
Run Code Online (Sandbox Code Playgroud)

R似乎不是在读取kml文件,或只是读取它的一部分.

列表(或数据框)spa是

  c..157.80736808..21.4323436..20.324951171875.
1                                    -157.80737
2                                      21.43234
3                                      20.32495
  c..157.80738216..21.43231443..19.36376953125.
1                                    -157.80738
2                                      21.43231
3                                      19.36377
  c..157.80533605..21.43536092..15.9990234375. c..157.8053208..21.43541138..15.9990234375.
1                                   -157.80534                                  -157.80532
2                                     21.43536                                    21.43541
3                                     15.99902                                    15.99902
  c..157.80998348..21.43706806..15.9990234375.
1                                   -157.80998
2                                     21.43707
3                                     15.99902
  c..157.80997007..21.43711106..17.441162109375.
1                                     -157.80997
2                                       21.43711
3                                       17.44116
  c..157.81074733..21.43717535..13.5958251953125.
1                                      -157.81075
2                                        21.43718
3                                        13.59583
  c..157.81071673..21.43718331..14.076416015625.
1                                     -157.81072
2                                       21.43718
3                                       14.07642
Run Code Online (Sandbox Code Playgroud)

这是maptools或我的代码的错误吗?据我所知,这是将kml坐标转换为R可以使用的坐标的最简单方法.非常感谢您的帮助.

该文件的链接如下:https://www.dropbox.com/s/y8elanjnst6438v/Perimeter_Track.kml

小智 7

该修复已经致力于R-forge,maptools项目,修订版232.请在欧洲时间晚上之后试用:

install.packages("maptools", repos="http://R-Forge.R-project.org")
Run Code Online (Sandbox Code Playgroud)

它处理这个问题.但是,我不知道你为什么不使用:

library(rgdal)
ogrListLayers(dsn="Perimeter_Track.kml") # to find the layer name
spa1 <- readOGR(dsn="Perimeter_Track.kml", layer="Perimeter_Track.kml")
summary(spa1)
Run Code Online (Sandbox Code Playgroud)

这是一个SpatialLinesData框架,可以通过多种方式使用,无需进一步努力.它也毫不费力地处理标签.要获得ad-hoc maptools函数返回的表单的输入,请执行以下操作:

o0 <- coordinates(spa1)
o1 <- lapply(o0, function(x) do.call("rbind", x))
library(maptools) # SVN revision >= 232
spa <- getKMLcoordinates('Perimeter_Track.kml', ignoreAltitude=TRUE)
all.equal(o1, spa)
Run Code Online (Sandbox Code Playgroud)