微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在保留属性的同时将 GPX 文件直接转换为线的 SpatVector?

如何解决如何在保留属性的同时将 GPX 文件直接转换为线的 SpatVector?

我正在尝试自学空间数据分析的编码技能。我一直在使用 Robert Hijmans 的文档“R 中的空间数据”,到目前为止,它一直很棒。为了测试我的技能,我正在使用我在跑步期间从智能手表获得的 GPX 文件,但是我在将我的数据放入线的 SpatVector(或更具体地说是一条线)时遇到了问题。我在网上找不到关于此主题的任何内容

正如您在下面的数据示例中看到的那样,即使指定了“线”,SpatVector“运行”也具有点几何形状。从 Hijman 的带有线的 SpatVectors 示例中,我收集到添加“id”和“part”都等于 1 的列可以使数据转换为具有线几何形状的 SpatVector。因此,在 SpatVector "run2" 中,几何图形是线。

我的问题是 1) 是否需要添加“id”和“part”列? 2)他们实际上做了什么? IE。为什么这些列是必要的? 3)有没有办法直接从原始数据转到线的 SpatVector?在我之前获取“run2”的过程中,我丢失了原始数据的所有属性,我不想丢失它们。

谢谢!

library(plotKML)
library(terra)
library(sf)
library(lubridate)
library(XML)
library(raster)

#reproducible example
GPX <- structure(list(lon = c(-83.9626053348184,-83.9625438954681,-83.962496034801,-83.9624336734414,-83.9623791072518,-83.9622404705733,-83.9621777739376,-83.9620685577393,-83.9620059449226,-83.9619112294167,-83.9618398994207,-83.9617654681206,-83.9617583435029,-83.9617464412004,-83.9617786277086,-83.9617909491062,-83.9618581719697),lat = c(42.4169608857483,42.416949570179,42.4169420264661,42.4169377516955,42.4169291183352,42.4169017933309,42.4168863706291,42.4168564472347,42.4168310500681,42.4167814292014,42.4167292937636,42.4166279565543,42.4166054092348,42.4164886493236,42.4163396190852,42.4162954464555,42.4161833804101
),ele = c("267.600006103515625","268.20001220703125","268.79998779296875","268.600006103515625","268.399993896484375","269","269.20001220703125","269"),time = c("2020-10-25T11:30:32.000Z","2020-10-25T11:30:34.000Z","2020-10-25T11:30:36.000Z","2020-10-25T11:30:38.000Z","2020-10-25T11:30:40.000Z","2020-10-25T11:30:45.000Z","2020-10-25T11:30:47.000Z","2020-10-25T11:30:51.000Z","2020-10-25T11:30:53.000Z","2020-10-25T11:30:57.000Z","2020-10-25T11:31:00.000Z","2020-10-25T11:31:05.000Z","2020-10-25T11:31:06.000Z","2020-10-25T11:31:12.000Z","2020-10-25T11:31:19.000Z","2020-10-25T11:31:21.000Z","2020-10-25T11:31:27.000Z"),extensions = c("18.011677","18.011977","18.012176","18.012678","18.013078","18.013277","18.013578","18.013877","17.013977","17.014278","17.014478","17.014677","17.014676","16.014477","16.014576"
)),row.names = c(NA,17L),class = "data.frame")



crdref <- "+proj=longlat +datum=wgs84"
run <- vect(GPX,type="lines",crs=crdref)
run


data <- cbind(id=1,part=1,GPX$lon,GPX$lat)
run2 <- vect(data,crs=crdref)
run2

解决方法

vect 有一个 matrix 方法,data.frame 有一个方法。 data.frame 方法只能生成点(并且没有类型参数,因此被忽略)。我会将其更改为信息性错误并在手册中澄清这一点。

所以要划线,你可以这样做

library(terra)
g <- as.matrix(GPX[,1:2])   
v <- vect(g,"lines")

要添加属性,您首先需要确定它们是什么。您在 GPX 中有一行,但有 17 行需要减少为一行。你可以只取第一行

att <- GPX[1,-c(1:2)] 

但您可能更愿意取平均值

GPX$ele <- as.numeric(GPX$ele)
GPX$extensions <- as.numeric(GPX$extensions)
GPX$time <- as.POSIXct(GPX$time)
att <- as.data.frame(lapply(GPX[,-c(1:2)],mean))
#       ele       time extensions
#1 268.7412 2020-10-25    17.3078

values(v) <- att

或一步

 v <- vect(g,"lines",atts=att)
 v
 #class       : SpatVector 
 #geometry    : lines 
 #dimensions  : 1,3  (geometries,attributes)
 #extent      : -83.96261,-83.96175,42.41618,42.41696  (xmin,xmax,ymin,ymax)
 #coord. ref. :  
 #names       :   ele       time extensions
 #type        : <num>      <chr>      <num>
 #values      : 268.7 2020-10-25      17.31

idpart 列如果是单行则不是必需的。但是当您希望创建多条线和/或线部分(在“多线”中)时,您需要它们。

gg <- cbind(id=rep(1:3,each=6)[-1],part=1,g)
vv <- vect(gg,"lines")
plot(vv,col=rainbow(5),lwd=8)
lines(v)
points(v,cex=2,pch=1)

对于多行,您可以在 id 中使用 aggregate 来计算每行的属性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?