如何在R中从ESRI REST API MapServer下载带像元值的栅格图层?
解决NOAA海岸洪水栅格图层下载问题的建议
一、修正arcpullr包的调用方式
get_map_layer默认返回渲染后的PNG/JPG图像,要获取带原始像元值的栅格,必须指定正确的输出格式与参数:
library(arcpullr) library(tigris) library(dplyr) library(sf) # 定义目标图层URL url <- "https://coast.noaa.gov/arcgis/rest/services/FloodExposureMapper/CFEM_CoastalFloodHazardComposite/MapServer/0" # 获取阿拉巴马州边界并转换CRS al <- states(cb = TRUE, year = 2022) %>% filter(NAME == "Alabama") %>% st_transform(3857) # 调用函数并指定栅格输出参数 al_flood_raster <- get_map_layer( url = url, sf_object = al, bbox_crs = 3857, format = "tiff", # 指定输出GeoTIFF格式 imageSR = 3857, pixelType = "U8", # 匹配图层原始像素类型(该图层为8位无符号整数) noData = -9999, # 与图层元数据的无数据值保持一致 renderingRule = NULL, # 禁用渲染规则,保留原始像元值 returnType = "image" # 确保返回栅格对象 ) # 验证栅格结果 print(al_flood_raster)
二、手动构造ArcGIS REST API请求(httr+terra)
如果arcpullr仍报错,直接调用ArcGIS的exportImage端点,严格按参数规范构造请求:
library(httr) library(terra) # 从sf对象提取bbox,格式为xmin,ymin,xmax,ymax bbox <- st_bbox(al) %>% as.numeric() %>% paste(collapse = ",") # 构造API请求链接 api_url <- paste0( url, "/exportImage?", "bbox=", bbox, "&bboxSR=3857", "&imageSR=3857", "&size=2000,2000", # 调整分辨率,数值越大栅格越清晰 "&format=tiff", "&pixelType=U8", "&noData=-9999", "&f=json" # 先请求获取临时下载链接 ) # 获取下载地址并下载栅格 response <- GET(api_url) resp_content <- content(response, "parsed") download_url <- resp_content$href temp_file <- tempfile(fileext = ".tif") download.file(download_url, temp_file, mode = "wb") flood_raster <- rast(temp_file) # 可视化验证 plot(flood_raster)
三、常见错误排查
- "Invalid URL":直接在浏览器访问图层URL,确认端点存在,检查链接是否有多余斜杠或拼写错误
- "Invalid or missing input parameters":
- 确认
bbox格式为xmin,ymin,xmax,ymax,无空格或多余字符 - 核对
pixelType与图层元数据一致(浏览器访问图层URL可查看"Pixel Type"字段) - 确保
bboxSR和imageSR参数匹配,或为服务支持的CRS
- 确认
内容的提问来源于stack exchange,提问作者wcurgrom
相关产品推荐
相关产品推荐

