看视频教程第17讲,其中将world.shp平面图形显示成了球体图形,很是振奋,自己尝试的的过程却是一波三折。
问题出在transformAndLocalize方法上,老师的版本的2.1,函数只要三个参数:原始点集、投影坐标系,结果点集,就能把原始点集转为球体图形。osgEarth::ECEF::transformAndLocalize(part->asVector(),srs, allPoints);
但在2.9版本中,此方法需要4个参数,坐标系参数从1个坐标系变成2个坐标系,一开始我不知道开始或结束坐标系怎么设,也不会获取,就直接认为把老版本的一个坐标系同样写在输入和输出坐标系中,但是出来的图形却仍是平面的。
于是,我没有仔细分析原因,就认为肯定是我坐标系参数传入不对,可怎样才能获得原始坐标系呢,查百度、Bing、Google对这个方法都介绍很少。
后来看帮助文档,发现可以通过getSRS()方法获得坐标系,但用谁来调用这个getSRS()方法呢,结合源代码,第一行是源代码中的,我写了第二行也取出了每个feature的SRS,算是一个小小进步吧。
const osgEarth::SpatialReference* srs = features->getFeatureProfile()->getSRS();
const osgEarth::SpatialReference* srsw = feature->getSRS();
但是,把这两个参数带入transformAndLocalize方法后,出来的结果仍是平面的,仔细debug发现srs 和srsw 是一模一样的,都是PROJ4,WGS84.
终于明白,其实问题不在坐标系上,老版本只用一个坐标系其实足够了,新版本弄两个坐标系几乎没有必要,问题出在下面的代码上,视频中注释掉了下面这句,我没注意,这句一直留着。
allPoints = part->createVec3Array();//获得shp中的原始顶点
也就是transformAndLocalize明明已经将allPoints转换为球面坐标了,我又把他还原回去了,简直晕死
把这句注释掉,球体图形立即出来了。
看来不都是技术问题,仔细也是关键啊!