按国家/地区将 GLOBathy 数据集中的所有数据复制到新文件夹

Copy all data from the GLOBathy dataset by country to a new folder

提问人:L Tyrone 提问时间:11/15/2023 更新时间:11/15/2023 访问量:22

问:

GLOBathy是一个数据集,其中包含地球上几乎所有湖泊的水深测量(此链接提供15.58GB .zip)。它包含 1.4m+ 记录,分为多个子目录。有关联的属性表,记录了每个文件所属的国家/地区(链接)。

从子目录中提取数据有些麻烦,因为文件名相对于它们所属的国家/地区没有“直观”的顺序。此外,我发现 GIS 程序在从多个目录中提取数据时速度非常慢,并且通常需要在某种程度上进行循环。

我自我回答这个问题是为了:a)为可能遇到此问题的其他人提供解决方案;b)看看是否有人知道更有效的方法。

R GIS QGIS系统

评论

0赞 Chris 11/15/2023
期待您的回答。
0赞 L Tyrone 11/15/2023
@Chris完成。如果您发现任何问题,请告诉我。我只在新西兰(n=517)上测试了这一点,而且速度相当快。不确定加拿大需要多长时间 (n = 879987),但除了时间之外,我无法预见任何问题

答:

1赞 L Tyrone 11/15/2023 #1

这是一种按国家/地区从 GLOBathy 数据中提取文件的方法。我已经对代码进行了注释,如果需要澄清或发现问题,请发表评论:

library(dplyr)

# Load the GLOBathy_basic_parameters(ALL_LAKES).csv file
GLOBathy_all <- read.csv("C:/GLOBathy_basic_parameters/GLOBathy_basic_parameters(ALL_LAKES).csv",
                         stringsAsFactors = FALSE)

# Define country of interest
country_sub <- "New Zealand"

# Define output directory (must already exist)
output_folder <- "C:/New Zealand"

# Extract records from GLOBathy_all that match country_sub and create associated file paths
GLOBathy_sub <- GLOBathy_all %>%
  filter(Country == country_sub) %>% # Filter by country
  mutate(temp1 = ifelse(Hylak_id > 1400000, # Get upper value of sub folder
                        nrow(GLOBathy_all),
                        paste0(ceiling(Hylak_id / 100000) * 100, "K")),
         temp2 = ifelse(Hylak_id <= 100000, # Round Hylak_id down to nearest 100000, two steps required for cases where Hylak_id == upper threshhold of folder names
                        1,
                        floor(Hylak_id / 100000) * 100000),
         temp3 = ifelse(temp2 == 1, # Get lower value of sub folder
                        paste0(1,  "_"),
                        ifelse(temp2 > 100000 & temp2 == Hylak_id, # If value == folder threshhold, subtract 100000
                               paste0((temp2 - 100000) / 1000, "K_"),
                               paste0(temp2 / 1000, "K_"))),
         temp4 = ceiling(Hylak_id / 1000) * 1000, # Get upper value of sub sub folder
         temp5 = paste0(temp4 - 999, "_"), # Get lower value of sub sub folder
         folders = paste0("C:/Bathymetry_Rasters/", # Create folder path
                          temp3, temp1, "/", temp5, temp4),
         files = paste0(folders, "/", Hylak_id, "_bathymetry.tif")) %>% # Create file path
  select(-contains("temp"))

# Copy files to new directory
file.copy(GLOBathy_sub$files, output_folder)

评论

1赞 Chris 11/15/2023
NATURE:GLOBathy,2022 年全球湖泊测深数据集,开放获取。我需要在仅解压缩部分内容的背景下探索这个宝库,因为我的 HD 已接近其有用数据卷寿命的尽头。您的上述内容提供了考虑导航的方法,因为文章中的元数据有些信息不足。欢迎来到 1300+
0赞 L Tyrone 11/15/2023
@Chris哈哈谢谢。完全了解存储问题,我目前正在提取加拿大的数据,我可怜的 500GB SSD 已经很满了。是的,元数据绝对是平均水平。但是,GLOBathy_basic_parameters(ALL_LAKES).csv 具有湖泊倾倒点的纬度/经度,因此您可以集成包以进一步缩小搜索区域并排除一定大小的湖泊。sf
0赞 Chris 11/15/2023
你对水文学感兴趣吗?鉴于你在社会(权力)流行病学方面的研究,福柯潜伏着。虽然我承认我喜欢水文学,但这种方式让执业水文学家感到畏缩,因为我认为一维流程图类似于早期的眼动追踪图。
0赞 L Tyrone 11/15/2023
想要创建一些山体阴影(lakeshades?)来表示文化地图基础层中的湖泊,我这样做是为了好玩。我打算对所有湖泊要素的符号系统进行标准化,而不考虑相对高程,例如,所有湖泊的表面高程均为 0m。确实尝试使用 etopo 数据和湖泊多边形文件创建我自己的文件,但我正在捕获湖泊多边形之外的高程,这使得我的方法不切实际。使用 GLOBathy 最终变得更加省时和可靠
0赞 L Tyrone 11/15/2023
仅供参考,使用我的 Win10 机器的 SSD,复制加拿大湖文件(n = 879987,7.71GB)需要 2.216754 小时