从WMS服务下载PNG失败,download.file()无法获取有效文件求助
解决WMS地图下载后无法识别为有效PNG的问题
我之前也碰到过一模一样的情况——浏览器能正常加载这个WMS地图链接,但用download.file()下载后,文件大小看着正常,就是打不开,图片工具提示PNG解码错误。问题其实出在文件写入模式上!
为什么会出现这个问题?
download.file()函数默认的写入模式是"w"(文本模式),这种模式会自动转换换行符,对于PNG这类二进制文件来说,这会悄悄破坏文件的字节结构,导致文件损坏。虽然文件大小看起来合理,但已经不是有效的PNG格式了。
解决方案1:修改download.file()的写入模式
只需要给download.file()加上mode = "wb"参数(表示二进制写入模式),就能完整保存PNG的二进制数据:
url <- "https://www.umweltkarten.mv-regierung.de/script/mv_a3_wasserschutz_wms.php?SERVICE=WMS&REQUEST=GetMap&format=image/png&VERSION=1.3.0&layers=t3_wsg&crs=EPSG:4326&bbox=53,11,55,12&width=2048&height=2048" Filename <- "C:/tmp/xxx.png" download.file(url = url, destfile = Filename, mode = "wb")
解决方案2:用httr包更灵活处理(如果方案1不行的话)
如果网站有特殊的HTTP头要求,或者download.file()还是有问题,可以用httr包发送GET请求并保存文件,它默认会正确处理二进制数据:
# 如果没安装httr先安装 if (!require(httr)) { install.packages("httr") library(httr) } url <- "https://www.umweltkarten.mv-regierung.de/script/mv_a3_wasserschutz_wms.php?SERVICE=WMS&REQUEST=GetMap&format=image/png&VERSION=1.3.0&layers=t3_wsg&crs=EPSG:4326&bbox=53,11,55,12&width=2048&height=2048" Filename <- "C:/tmp/xxx.png" # 发送请求并保存文件 GET(url, write_disk(Filename, overwrite = TRUE))
验证方法
下载完成后,用IrfanView或者系统自带的图片查看器打开文件,应该就能正常显示WMS地图了。
内容的提问来源于stack exchange,提问作者user12377292
相关产品推荐
相关产品推荐

