16 Jun 2021

Add Mapbox, Google Maps into Forge Viewer

Want to combine google-maps with your Revit model ?  Then read on

 

INTRODUCTION

Use this Forge-Viewer extension to stream in Geo tiles from mapbox, bing maps, google maps, etc.
Under the hood, I ported the geo-three library, so you can use all of it's features (and multiple providers).  Note that I did default to 'Planar' and 'RaycastingLOD' options, to minimize the library size.

DEMO: https://wallabyway.github.io/geo-three-ext/
SRC: https://github.com/wallabyway/geo-three-ext

anim

WHAT ARE MAP-TILES ?

Imagine a photograph of the flat-Earth, chopped up into a square tiles.  Now, divide those tiles into 4 tiles... and repeat.

These little tiles are called "Map Tiles", and can be arranged into an "image pyramid" based on their 'level of detail'.  Each image is a small jpg file, and we assemble them into the three.js scene, based on the camera view.  

tile-quadstile-pyramid

Things closer to the camera, the higher the level of detail and more tiles loaded.  Things far away from the camera - lower details.  Like this debug image.  Geo-three library handles this task, handles tile caching, does Earth Lat/Long calculations and connects to many "Map Tile providers" like Mapbox, Google-maps and Bing-maps.

debug-view

 

GETTING STARTED

Add the "GeoThreeExtension" extension to viewer, like this:

viewer = new Autodesk.Viewing.Private.GuiViewer3D(div, { extensions: ["GeoThreeExtension"] });

and make sure to add the library, like this:

<script type="text/javascript" src="./geo-three.ext.js"></script>

 

CONFIGURATION

Set the center location of your model, by adjusting the map's position and tile starting point, like this:

map.position.set(14900,-27300,-45);

class MapPlaneNode extends MapNode {
	    constructor(parentNode = null, mapView = null, location = MapNode.ROOT, level = 7, x = 20, y = 49)
      

 

UPDATE:

Thanks to Duzmac for the stack overflow post that provides a great approach, to doing this (ie. figure out how to take your { lat / long / elevation } and convert them to { x,y,z and level } values, used above.

 

Note: To get Earth scale, you must set the level=0, and set..

UnitsUtils.EARTH_RADIUS = 6378137;

// move the camera into position:
var coords = Geo.UnitsUtils.datumsToSpherical(LAT, LONG);
cam.target.set(coords.x, 0, -coords.y);
cam.position.set(0, 1000, 0);

This will move the Forge-Viewer camera to the (LAT, LONG) position on Earth.

Note: You will also need to re-position the Forge Viewer's global-offset

Also, the camera navigation is not good at navigating a map. Consider adding THREE.MAPControl

 

Find me on Twitter: twitter.com/micbeale

RELATED WORK

  • Simple mapbox Tiles extension: <link> 
  • Using Mapbox VIewer with Revit files (via glTF) : <link>
  • How to retrieve Geo data inside Revit (browser): <link>
  • How to decode aecModelData.json to retrieve Revit/Autocad Geo info: <link>
  • For Navisworks: see latest blog: <link>

Related Article

Posted By

Michael Beale

Michael Beale

Michael Beale is a senior software engineer at Autodesk, where he has been a globe-trotting technical advocate for Forge. Michael focuses on connecting Autodesk cloud data and Autodesk Forge APIs to the browser. He’s also contributed to Autodesk Homestyler, the Forge Large Model Viewer (LMV), Autodesk Prooflab, Stereo-Panorama service with webVR and recently 3D formats, such as glTF and 3D-Tiles-Next. Twitter:...