我正在使用marmap软件包制作加拿大育空地区小型浅水湖泊的水深图。
我的数据是手动采样的,在CSV文件中有三列:
经度,纬度,深度
我只是使用“as.bathy”,然后使用“is.bathy”来确保它的格式正确,最后使用“plot.bathy”来制作一个空白的情节。
该图显示了纬度和经度,但没有说明任何深度。
我现在意识到这些深度值完全缺少0值。 这意味着R不知道海岸线在哪里,我相信这可能是我绘制问题的一个重要因素。
现在适当的行动方案是进入QGIS并采用0深度和坐标的海岸线值,以便为R提供海岸线?
或者我应该使用不同的方法来制作这些图表? 在这个阶段,我正在尝试比较不同的方法来制作这些水深测量图表,其中有效的时间和易于绘图是主要问题。
谢谢。
编辑更新
所以我更新了我的CSV以包含海岸线值,沿着海岸线交错排列,深度为0。重新绘制,同样的结果。
答案 0 :(得分:0)
问题来自数据的非矩形格式。 read.bathy()和as.bathy()还不能处理bathy文件中缺少的数据。沿着海岸线添加零也无济于事。 好消息是我们将在接下来的几天内发布marmap v0.8,其中包含能够处理此类数据的read.bathy()的更新版本。更新到marmap 0.8后,您只需输入以下代码:
library(marmap)
dat <- read.bathy("my_cvs_file.csv")
plot(dat)
与此同时,你可以:
下面提供的代码只是在适当的容积中添加NAs(即没有任何数据的地方)。
我希望这有帮助!
add.nas <- function(vec,pos.missing) {
vec.new <- NULL
n.mis <- length(pos.missing)
for (i in 1:n.mis) {
modify.vec <- TRUE
range <- 1:(pos.missing[i]-1)
if (identical(range,1:0)) {
range <- 0
modify.vec <- FALSE
}
vec.new <- c(vec.new,vec[range],NA)
if (modify.vec) vec <- vec[-range]
pos.missing <- pos.missing - pos.missing[i]
}
vec.new <- c(vec.new,vec)
return(vec.new)
}
read.bathy2 <- function (xyz, header = FALSE, sep = ",") {
bath <- read.table(xyz, header = header, sep = sep)
bath <- bath[order(bath[, 2], bath[, 1], decreasing = FALSE), ]
lat <- unique(bath[, 2]) ; bcol <- length(lat)
lon <- unique(bath[, 1]) ; brow <- length(lon)
if ((bcol*brow) == nrow(bath)) {
mat <- matrix(bath[, 3], nrow = brow, ncol = bcol, byrow = FALSE, dimnames = list(lon, lat))
} else {
id <- apply(bath[,-3],1,function(x) c(which(lon==x[1]) , which(lat==x[2])) )
pos.missing <- which(table(id[1,],id[2,])==0)
mat <- matrix(add.nas(bath[,3],pos.missing), nrow = brow, ncol = bcol, byrow = FALSE, dimnames = list(lon, lat))
}
ordered.mat <- check.bathy(mat)
class(ordered.mat) <- "bathy"
return(ordered.mat)
}
答案 1 :(得分:0)
marmap 0.8即将推出,但您已经可以通过github安装新版本了:
install.packages("devtools")
library(devtools)
install_github("marmap","ericpante")
已修改函数read.bathy
以处理非矩形测深文件。