如何在保留属性的同时将 GPX 文件直接转换为线条的 SpatVector?
How do you convert a GPX file directly into a SpatVector of lines while preserving attributes?
我正在尝试自学空间数据分析的编码技能。我一直在使用 Robert Hijmans 的文档“R 中的空间数据”,到目前为止,它一直很棒。为了测试我的技能,我正在处理 运行 期间从我的智能手表获得的 GPX 文件,但我在将数据放入 SpatVector 行(或更具体地说是一行)时遇到了问题。我无法在网上找到有关此主题的任何内容。
正如您在下面的数据示例中看到的那样,即使指定了“线”,SpatVector“运行”也具有点几何图形。从 Hijman 的 SpatVectors with lines 示例中,我了解到添加“id”和“part”都等于 1 的列可以使数据转换为具有线几何形状的 SpatVector。因此,在 SpatVector“运行2”中,几何图形是线。
我的问题是 1) 是否需要添加“id”和“part”列? 2)他们实际上做了什么? IE。为什么需要这些列? 3) 有没有办法直接从原始数据到线条的 SpatVector?在我以前获取“运行2”的过程中,我丢失了原始数据中的所有属性,我不想丢失它们。
谢谢!
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.600006103515625", "268.399993896484375",
"268.600006103515625", "268.79998779296875", "268.79998779296875",
"269", "269", "269.20001220703125", "269.20001220703125", "269.20001220703125",
"268.79998779296875", "268.79998779296875", "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", "17.014677", "16.014477", "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, type="lines", crs=crdref)
run2
matrix
有一种 vect
方法,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
id
和 part
列如果您制作一行,则不需要。但是当您希望创建多行和/或行部分(在“多行”中)时,您需要它们。
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)
对于多行,您将在 aggregate
中使用 id
来计算每行的属性。
我正在尝试自学空间数据分析的编码技能。我一直在使用 Robert Hijmans 的文档“R 中的空间数据”,到目前为止,它一直很棒。为了测试我的技能,我正在处理 运行 期间从我的智能手表获得的 GPX 文件,但我在将数据放入 SpatVector 行(或更具体地说是一行)时遇到了问题。我无法在网上找到有关此主题的任何内容。
正如您在下面的数据示例中看到的那样,即使指定了“线”,SpatVector“运行”也具有点几何图形。从 Hijman 的 SpatVectors with lines 示例中,我了解到添加“id”和“part”都等于 1 的列可以使数据转换为具有线几何形状的 SpatVector。因此,在 SpatVector“运行2”中,几何图形是线。
我的问题是 1) 是否需要添加“id”和“part”列? 2)他们实际上做了什么? IE。为什么需要这些列? 3) 有没有办法直接从原始数据到线条的 SpatVector?在我以前获取“运行2”的过程中,我丢失了原始数据中的所有属性,我不想丢失它们。
谢谢!
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.600006103515625", "268.399993896484375",
"268.600006103515625", "268.79998779296875", "268.79998779296875",
"269", "269", "269.20001220703125", "269.20001220703125", "269.20001220703125",
"268.79998779296875", "268.79998779296875", "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", "17.014677", "16.014477", "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, type="lines", crs=crdref)
run2
matrix
有一种 vect
方法,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
id
和 part
列如果您制作一行,则不需要。但是当您希望创建多行和/或行部分(在“多行”中)时,您需要它们。
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)
对于多行,您将在 aggregate
中使用 id
来计算每行的属性。