今天忙乎一整天, 终于把离线高程搞定, 记录如下:
首先, 很自然想到用大名鼎鼎的gdal2tiles工具。然鹅, 很不幸, 以前都是用它切RGB影像, 今天用16bit的高程图像试验了一下,发现完全不对,图像出来像是打满了补丁。
网上收了一圈。 最后确认gdal2tiles的确只支持8bit depth 图像。 自己动手丰衣足食, 准备改代码。
然后,撸代码过程中 发现问题在于 创建的 MEM driver 用默认的8bit 格式 , 导致了16bit 图像写入错误。 总体流程:先打开图像---》warp操作(就是重投影,这里有个问题后面再说)
---》将重投影的图像存为 vrt 文件(放在系统的APPDATA目录下)---》开始制作最高清一层的瓦片(16bit信息在这里丢失)---》从清晰层到模糊层(忘记0代表哪层,这样表述更清楚)建立
overview .
知道问题所在,就是动手改吧。 找到创建MEM driver 的地方, 把Create 函数最后的位置上添加一个dtype 类型, 这个是从原始输入文件得到的,代码大约如此:
inputSrc->GetRasterBand(1)->DataType;
另外一个问题, 默认情况下,生成的瓦片文件是PNG 格式, 做高程文件,还是改成tif. 这个很容易改 找到 PNT 分别改Driver (GTiff) 类型和 ext 。
经过一天的努力, 总算搞定了 。贴两张图看看。
这个代码我放在github 上。 http://github.com/enigma19971/tilemap
不过还是有一些问题: 不是所有分支路径都改了, 因为项目上要用, 能工作就行了。 querySize != tileSize 的分支路径没管。 另外一个很奇怪的问题是 , 当选择
profile 为 mercator 的时候, 常常发现 warp 出来的结果是一个 y 值为0 的dataset . 不知道是否有人解决了这个问题, 希望能跟高人讨论一下。
原文:https://www.cnblogs.com/enigma19971/p/12828544.html