这几天在开发地形数据发布工具的时候,对应数字高程地形数据的编码与解码中遇到如下的问题。
提示的错误是:
Expected sizeInBytes to be greater than 0, actual value was 0
根据上面的提示,应该是加载四叉树数据出现了问题,再根据console控制台输出的提示,我想应该是开发地形发布工具切的地形高程数据出现了问题。于是在C++编写的发布工具代码中加入相应的代码来测试。
写入顶点函数;
ostream.write(&edgeCount, sizeof(int));
该函数是C++写入的,但是在javascript的类型化数组中是使用的getUint32去读取的,无法正确的返回数据。如下所示,给指定的层级、行号、列号返回的西区顶点数量数据是6960,显然在c++计算的17,就不对了。
var westVertexCount = view.getUint32(pos, true);
而我这里,如下的数据,包围盒的中心坐标,裁剪坐标都是能和我原始数据能对应得上的。但是,唯一不能对应的是,东、西、南、北,中的顶点数据。值得一提的是,cesium使用的是地心固定坐标系。想想切片矩形盒中点cx的值是负值,一开始我还怀疑自己的坐标转换出现了问题,然后翻翻《大地测量基础》查阅,和其他相关的代码测试,发现本次使用的转换代码是对的。
cx:-2255011.962018411
cy: 4786278.07253031
cz: 2243674.2044328637
radius: 3557129.1415196783
horizonOcclusionPoint:
-0.47114102604286817
1
0.4703492132866103
这个几个顶点数据中,首先是读取西点的顶点数据,结果冒出了顶点是上万这样的数值。这显然是不对的。因为我的原始数据是17。于是开始找问题,将错误定位到写顶点c++函数,特别是在使用for循环后,写入数值虽然能够按照顶点数量值,依次填入数据,但是经过javascript解码后,出现了莫名其妙的问题。一开始我以为是C++指针没移动,取地址符号没有取对地址。
/*
const vector<uint32_t> &vec= mMesh.indices;
vector<uint32_t>::const_iterator iter = vec.begin();
for (; iter != vec.end(); iter++) {
uint16_t code=6;
//code = (uint16_t)*iter;
ostream.write(&code, sizeof(uint16_t));
}*/
std::vector<uint32_t*>::const_iterator tags_iter;
/*
for (size_t i = 0, icount = triangleCount*3; i < icount; i++) {
code = highest - mMesh.indices[i];
ostream.write(&code, sizeof(uint16_t));
if (code == 0) highest++;
}*/
按照上面的代码来测试了一下,发现还是没有对。我想应该问题出在fwrite函数上面,最后经过查证,如果写入的数据为二进制,必须指定文件写入模式,而我是“w”,而这里需要改为“wb”。接下来,我们来验证一下是不是正确了,首先,来看一下C++使用gdal读tif相应顶点数据,如下图所示。
而我们来看一下,当在cesium解码后的数据。显然,这是对的了。好了,总算将编码数据与解码上的数据给对应起来了。