Suite

Cesium 3D - Détermination de l'échelle cartographique du globe visualisé


Je travaille actuellement avec Cesium 3D et je souhaite déterminer à quelle échelle de carte équivalente le globe est visualisé.

Je suis en mesure d'obtenir l'altitude de visualisation en mètres à laquelle se trouve la caméra, mais d'après cette discussion, j'aurais également besoin de la distance entre les yeux et la surface, et je ne comprends pas cela.

Mon objectif ultime est de déterminer une échelle de carte, de la convertir en un niveau de zoom Openlayers 2 afin que je puisse synchroniser les deux vues (environ)


Mise à jour, mars 2016 : Cesium 1.19 a été publié avec une nouvelle fonction, Camera.computeViewRectangle, qui fait un travail aussi efficace que le calcul du rectangle de vue, compte tenu des mises en garde ci-dessous. Je recommande maintenant de l'utiliser au lieu de renifler les tuiles d'images comme indiqué ici. Je garde la réponse originale ci-dessous car elle explique les problèmes de calcul d'un simple rectangle de vue sur une vue 3D du globe.

Réponse originale : Il n'y a pas de mappage facile d'un globe 3D à un niveau de zoom 2D. Sur un globe rond, différentes tuiles sont à différentes distances de la caméra 3D : certaines tuiles sont drapées sur l'horizon ou vues à des angles raides. La caméra peut être en bas près d'un point au sol, mais en regardant vers l'horizon, de sorte qu'elle peut voir les tuiles de haut niveau au premier plan et celles de bas niveau à l'arrière-plan.

Vous pouvez le voir en action, graphiquement, à l'aide de l'inspecteur de césium.

  1. Cliquez sur le petit+signe à côté de+ Terrainau bas de l'inspecteur de césium.
  2. Ensuite, cochezAfficher les coordonnées des tuiles.
  3. Zoomez sur la caméra et regardez les tuiles changer.

Pour une compréhension encore plus approfondie, procédez comme ci-dessus, puis continuez :

  1. Zoomez la caméra près d'une ville ou d'un point au sol.
  2. Utilisez le moyen-glisser (ou ctrl-gauche-glisser) pour incliner la vue vers l'horizon.
  3. Mettez une coche surSuspendre la mise à jour LOD.
  4. Redressez la caméra et reculez un peu, pour voir les tuiles flotter dans l'espace. Notez que ceux qui étaient près de la caméra (lorsque le niveau de détail était suspendu) sont petits et de haut niveau, mais ceux qui étaient visibles au loin sont grands et de bas niveau.

Maintenant que vous avez vu que plusieurs niveaux de tuiles différents contribuent à une seule vue de caméra, je vais partager un code très non officiel. L'inspecteur de césium utilise certains points d'API privés pour surveiller les tuiles en cours de chargement, et comme il s'agit d'une source ouverte, vous pouvez également surveiller ces tuiles. L'utilisation d'API privées n'est pas prise en charge et peut être interrompue dans toute future version de Cesium. Prêt? Ouvrez une copie de Cesium Sandcastle et collez le code suivant :

// Ce code rapporte les valeurs min/max de TOUTES les tuiles considérées pour le rendu. // Les valeurs changeront de manière asynchrone au fur et à mesure que le serveur envoie des tuiles de niveau supérieur. var viewer = new Cesium.Viewer('cesiumContainer'); var ouest, sud, est, nord; var barre d'outils = document.getElementById('toolbar'); viewer.clock.onTick.addEventListener(function () { ouest = sud = 999 ; est = nord = -999 ; // ATTENTION : l'accès aux variables _private n'est pas officiellement pris en charge et // l'API peut se briser à tout moment sans avertissement. var tileToRender = viewer.scene.globe._surface.tileProvider._tilesToRenderByTextureCount; if (Cesium.defined(tilesToRender)) { var numArrays =tilesToRender.length; for (var j = 0; j < numArrays; ++j) { var quadtrees = tileToRender[j]; if (Cesium.defined(quadtrees)) { var numTrees = quadtrees.length; for (var i = 0; i < numTrees; ++i) { var rectangle = quadtrees[i].rectangle; west = Math.min(ouest, rectangle.ouest); sud = Math.min(sud, rectangle.sud); est = Math.max(est, rectangle.est); nord = Math.max(nord, rectangle.north); } } } } if (west > 900) { toolbar.innerHTML = 'Emplacement non connu.'; } else { toolbar.innerHTML = 'West: ' + Cesium.Math.toDegrees(west).toFixed(4) + '
' + 'Sud : ' + Cesium.Math.toDegrees(sud).toFixed(4) + '
' + 'Est : ' + Cesium.Math.toDegrees(east).toFixed(4) + '
' + 'Nord : ' + Cesium.Math.toDegrees(north).toFixed(4) ; } });

Si vous déplacez la caméra dans cette démo, vous pouvez repérer les problèmes avec cette méthode. Lorsque la caméra est suffisamment éloignée de la Terre, les coordonnées signalées sont la planète entière, mais à mesure que vous vous approchez d'un emplacement particulier, les coordonnées signalées se réduisent à quelques tuiles autour de cet emplacement. Cependant, si vous inclinez la caméra vers l'horizon, les coordonnées signalées incluent des tuiles s'étendant au-delà de cet horizon et la caméra se retrouve près de l'un des côtés ou des coins de ces coordonnées, et non du centre. Pourtant, il peut y avoir des applications où il est pratique d'avoir une idée approximative de quelles tuiles sont visibles dans la scène 3D.


Voir la vidéo: OdoViz: A 3D Visualization and Processing Tool. Demo (Octobre 2021).