はじめに
前回、GPS経路情報をCesium上で表示させましたが、Cesiumの地形情報と高度があっていなかっため、うまく表示ができませんでした。
そこで、任意の座標から、Cesiumの地形情報からの高度を取得してみました。高度の取得には、sampleTerrainMostDetailed()メソッドを利用します。同様の機能で、sampleTerrain()メソッドが存在しますが、こちらはCesiumの地形レベルを指定する必要があるため、sampleTerrainMostDetailed()メソッドを利用します。
ちなみに、Cesiumの地形レベルの最大の詳細レベルは14でした。地形レベルが高いほど、高度が正確になります。
提供される高度は準拠楕円体からの高さ(Ellipsoid.WGS84)楕円体高になります。これは、平均海面からの高度である標高ではありません。なので、海でサンプリングした場合、必ずしも0mになるとは限りません。
以下、高度の取得プログラムです。
htmlファイル(抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<html lang="ja"> <head> <link rel="stylesheet" href="../Build/CesiumUnminified/Widgets/widgets.css" /> <script src="../Build/CesiumUnminified/Cesium.js"></script> <style> html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } #toolbar-left2 { display: block; position: absolute; top: 5px; left: 5px; } </style> </head> <body> <div id="cesiumContainer"></div> <div id="toolbar-left2"> <button onclick="showLog()">log</button> </div> <script> var viewer = new Cesium.Viewer("cesiumContainer", { terrainProvider: Cesium.createWorldTerrain(), baseLayerPicker: true, shouldAnimate: true, }); function showLog() { var terrainProvider = Cesium.createWorldTerrain(); var positions = [ Cesium.Cartographic.fromDegrees(132.947655,33.834034), Cesium.Cartographic.fromDegrees(132.947566,33.834045), Cesium.Cartographic.fromDegrees(132.947499,33.833914) ]; var promise = Cesium.sampleTerrainMostDetailed(terrainProvider, positions); Cesium.when(promise, function(updatedPositions) { for (var i = 0; i < updatedPositions.length; ++i) { var cartographic2 = updatedPositions[i]; var longitude2 = Cesium.Math.toDegrees(cartographic2.longitude); var latitude2 = Cesium.Math.toDegrees(cartographic2.latitude); var height = cartographic2.height; console.log(longitude2 + ',' + latitude2 + ',' + height); } }); } </script> </body> </html> |
上記で出力したログの高度をGPS経路情報に再設定し、再度、GPS経路情報を表示してみました。
自動車が地面に埋め込まれずに、表示されています。
ただし、今回の場合は事前に高度情報を取得し、czmlに設定していたので、手間がかかりました。次回は、動的に高度情報を取得して表示させる方法を、調査しようと思います。