Cesium 定位到图层(ImageryLayer)报错 DeveloperError: normalized result is not a number
- 错误原因
- 调试定位问题过程
- 问题解决
- 总结
在使用 Cesium 封装代码的时候,遇到个奇怪的问题。
使用 viewer.flyTo(ImageryLayer) 报错:DeveloperError: normalized result is not a number。
经过不断尝试发现,定位到某些 ImageryLayer 是没问题的,但是有的 ImageryLayer 就会报错。
但是使用 camera.flyTo 定位的话却能正常定位。
经过进一步确认发现,跟加载的 Terrain 有关系,后来终于解决问题,这里记录一下。
错误原因
现已确认,错误需要以下几个条件:
1. 开启地形,但是地形数据不完整。
拼接的地形数据,比如:Terrain 地形文件夹中,0-5 级是全国地形数据,6-8 级是北京市数据,而 layer.json 参数是 0-8 级。
2. 定位到 ImageryLayer 的 Rectangle
给 ImageryLayer 设置 Rectangle 参数,用于 viewer.flyTo 定位。
3. 定位到某些区域的时候会报错。
完整错误:
DeveloperError: normalized result is not a number
Error
at new DeveloperError (http://localhost:8009/lssec.js:83514:11)
at Cartesian3.normalize (http://localhost:8009/lssec.js:69756:11)
at Ellipsoid.geodeticSurfaceNormal (http://localhost:8009/lssec.js:87921:65)
at Ellipsoid.cartesianToCartographic (http://localhost:8009/lssec.js:88014:18)
at Array.createUpdate3D (http://localhost:8009/lssec.js:237640:30)
at CameraFlightPath.createTween (http://localhost:8009/lssec.js:237932:39)
at Camera.flyTo (http://localhost:8009/lssec.js:236172:86)
at updateZoomTarget (http://localhost:8009/lssec.js:427653:14)
at Viewer._postRender (http://localhost:8009/lssec.js:427539:3)
at Event.raiseEvent (http://localhost:8009/lssec.js:92422:20)
调试定位问题过程
1. 首先通过错误定位到报错位置。
2. 找到 viewer.flyTo 方法,调试查看,这里发现定位其实是计算 Rectangle,然后在进行定位。
初步有了解决思路,继续调试。
3. 这里可以发现,viewer.flyTo 跟 terrainProvider 是有关系的,因此确定是 Terrain 地形数据资源的问题。
问题解决
解决问题的方式有两种,一是使用完整的 Terrain 地形数据,不会报错;二是修改定位的方式,可以避免错误。
1. 使用完整 terrain 地形数据
很简单,不要拼接即可,也就是使用工具切割的 Terrain 地形数据目录是什么样就直接使用,不能对 Terrain 目录做任何修改。
2. 使用其他方式定位
在查看 API 的时候,发现 ImageryLayer 有这样一个方式,大概意思是获取 Rectangle 之后,使用 camera 进行定位。
经过尝试,没问题,不会报错。
总结
广大 GISer 除了关注这个问题,以及解决方法,还可以关注一下笔者的调试过程。
另外,经过确认,这个问题是 Cesium 的 bug,笔者已经在 githup 上提交了,感兴趣的可以看看。
这里是 Cesium 的错误调试:viewer.flyTo 问题