osgearth 代码 hack(二) 地形制作

今天忙乎一整天, 终于把离线高程搞定, 记录如下:

 

首先, 很自然想到用大名鼎鼎的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 .   不知道是否有人解决了这个问题,  希望能跟高人讨论一下。 

posted @ 2020-05-04 22:22  小阳明  阅读(780)  评论(0)    收藏  举报