使用原始深度/坐标数据,“marmap”包。麻烦绘制测深图表

时间:2014-03-31 15:41:29

标签: r

我正在使用marmap软件包制作加拿大育空地区小型浅水湖泊的水深图。

我的数据是手动采样的,在CSV文件中有三列:

经度,纬度,深度

我只是使用“as.bathy”,然后使用“is.bathy”来确保它的格式正确,最后使用“plot.bathy”来制作一个空白的情节。

该图显示了纬度和经度,但没有说明任何深度。

我现在意识到这些深度值完全缺少0值。 这意味着R不知道海岸线在哪里,我相信这可能是我绘制问题的一个重要因素。

现在适当的行动方案是进入QGIS并采用0深度和坐标的海岸线值,以便为R提供海岸线?

或者我应该使用不同的方法来制作这些图表? 在这个阶段,我正在尝试比较不同的方法来制作这些水深测量图表,其中有效的时间和易于绘图是主要问题。

谢谢。


编辑更新


所以我更新了我的CSV以包含海岸线值,沿着海岸线交错排列,深度为0。重新绘制,同样的结果。

2 个答案:

答案 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)

与此同时,你可以:

  1. 加载marmap 0.7
  2. 将以下代码复制/粘贴到R控制台
  3. 在脚本中使用read.bathy2()函数而不是read.bathy()。
  4. 下面提供的代码只是在适当的容积中添加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以处理非矩形测深文件。