Creating a 3D globe cache from a 2D map cache

One purpose of this blog is to share some of the things we’ve learned about our software by using it ourselves. The ArcGIS Online project uses the ArcGIS Server map and globe caching technology. In this post, we share a technique we’ve developed to create 3D caches for ArcGIS Online.

For performance and appearance benefits, many of the 3D globe caches on ArcGIS Online were created originally from 2D fused map caches. These 2D caches were overlaid on the globe and cached to make globe tiles. This technique improves the performance of the globe service because it yields only one cached layer. It also improves the appearance of the service because anti-aliasing effects in the 2D cache transfer to the 3D cache. This post lists the steps that you can follow to create a 3D cache from a 2D cache.

Create the 2D map cache

The first step in this process is to create the 2D cached map service. Start by using ArcMap to create an attractive map document that is designed for display at some pre-determined scale levels. You’ll need to select the scale levels you want cached and then apply the appropriate symbology for each scale level. You can find tips for this process in Planning a map cache.

Below is a list of scale levels used by ArcGIS Online 2D caches. These scale levels translate well to the fixed scale levels used by ArcGIS Explorer and ArcGlobe, and are strongly recommended if you plan on eventually creating a 3D cache from your 2D cache. The high-precision values of the scales prevent tiles from overlapping at the edge of the globe near the International Date Line. If your map does not have worldwide coverage, you do not have to enter all of the decimal places for these numbers, but it’s recommended that you stay close to these numbers for the best visual effects. You do not have to use all of the scales; you can use a sequential subset of them.

Recommended scales for your 2D cache

147748799.285417 (To clarify, this corresponds to approximately 1:147,748,799 scale)

73874399.6427087 (This corresponds to approximately 1:73,874,299)

36937199.8213544 (Etc.)

18468599.9106772

9234299.95533859

4617149.97766929

2308574.98883465

1154287.49441732

577143.747208662

288571.873604331

144285.936802165

72142.9684010827

36071.4842005414

18035.7421002707

9017.87105013534

4508.93552506767

Once you’ve finished designing and creating your map document, you should publish it as an ArcGIS Server map service and create a map cache. If using the above values, you can copy and paste them directly into the Generate Map Server Cache tool. This post does not focus on the details of publishing the 2D service and generating the cache, but ample instructions are available in the ArcGIS Server Help.

Configure a custom error for missing tiles

A previous post on this blog explained how you can configure your web server to return a blank or “No data available” image in areas where a client cannot find a cache tile. This is an important step when you’re generating a 3D cache from a 2D cache because the tile edges may not always line up between the two types of caches. The 3D cache generating process will perform better with a blank or “No data available” tile than it will when no tile is found. Follow the steps at this link to configure your web server to return the blank tile: Configuring your server to display a “Data not available” tile for empty map cache areas.

Create a globe document from the 2D service

Now that you have a 2D map service running, you can add it to an ArcGlobe document. The service will be draped over the globe in 3D. Follow these steps to create and appropriately configure the document:

Start ArcGlobeTip: If you’re using ArcGlobe in a remote desktop session, you may get better performance by resizing the application window to eliminate the globe portion of the display. You don’t need to see the globe during these steps.

Remove the default layers named Continents and World Image.

Click Tools > Options and click the Cache tab.

Set the Cache path to be the same as the server cache directory where you want your globe cache to be created, with “GlobeCache” appended to the end (Example: \myServercacheGlobeCache) This is an application-level property, so you may want to make note of the original cache path and set this value back the next time you use ArcGlobe.

Click OK to dismiss the options dialog, then click the Add Data button.

Add the 2D map service that you created in the previous steps. Be sure to use an Internet connection to ArcGIS Server (not a local connection). ArcGlobe can display the 2D service draped over the globe.

Right-click the map service layer and select Properties.

In the Globe General tab, modify the Layer Name and Description as you like.

Click the Cache tab

If you’re creating a base map layer, such as satellite imagery or a street map, check “Use lossy spatial compression”. If you’re creating a transparent reference layer, such as boundaries or a road network, this compression is not necessary.

If you are using the recommended ArcGIS Online scale levels listed above, change the minimum cell size to twice the calculated value. Leaving this unchanged will cause your cache to grow larger than necessary.

Click OK to dismiss the dialog.

Save the globe document and close ArcGlobe.

Create a globe service

Now you need to publish a globe service using the globe document you created in the steps above. You can create the service in ArcCatalog or Manager. Be sure to set the service properties to reference the appropriate cache directory (It’s not necessary to append “GlobeCache” to the name this time.)

The globe service you create should be pooled, with 2 – 4 instances per server object container (SOC) that will be employed in the cache-building process. You may need to adjust this number depending on memory and CPU constraints you observe during the caching process.

Note about number of service instances: The map service that you created earlier only needs to have about ¼ the number of instances that your globe service has at this point. This is because you’ve cached the map service already, so requests for its tiles can be generally satisfied by the virtual cache directory, without making a request to the GIS server. The globe service is going to need a lot of instances while caching. After the cache is generated you can reduce the number of globe service instances.

Generate a globe cache

Once the globe service is started, you can begin generating the cache. You must do this step in ArcCatalog. In the Caching tab of the globe service properties, you’ll find two options for generating the cache. The Generate button creates a cache for the entire globe service, while the Update option only caches an extent that you provide.

As you set the parameters for the caching tools, you’ll need to select the levels of detail that the cache will be created at. Set the From level to “Globe – 1:10000000″ even if your service does not have global coverage. This will not generate an unreasonably large cache because tiles that are outside the service extent will just be skipped by the cache generation process.

When selecting the To level of detail, use the table below which associates each ArcGIS Online scale level with the appropriate To level of detail you should use for your globe cache. For example, if your map cache’s closest scale level is 72142.968… choose “City – 1:9765″ from the To Level of Detail dropdown in the Generate Globe Server Cache tool. Ignore the scale given in the dropdown (in this example 1:9765).

Scale level

Globe cache “To” level of detail

73874399.6427087

Globe

36937199.8213544

Continent

18468599.9106772

Countries

9234299.95533859

Country

4617149.97766929

States

2308574.98883465

State

1154287.49441732

Counties

577143.747208662

County

288571.873604331

Metropolitan Area

144285.936802165

Cities

72142.9684010827

City

36071.4842005414

Town

18035.7421002707

Neighborhood

9017.87105013534

City Blocks

4508.93552506767

City Block

When you’ve set all of the parameters for the caching tools, click OK and let the cache generation process do its work. When it completes, you’ll have a set of globe tiles that look like the tiles in your 2D map cache.

Create a disconnected service (optional)

At this point, you could leave your globe service running and users would see the new cache tiles. However, your map service would always need to be running in order for your globe service to start correctly. To avoid this dependence on the map service, you can do the following to create a disconnected globe service:

Stop the globe service you created previously.

Open ArcGlobe and create a new globe document.

Remove the default layers named Continents and World Image.

Click the Add Data button.

Browse to the folder on disk that contains the globe cache you just created. This involves browsing to your server cache directory, opening the GlobeCache folder, and finding the folder that represents your new globe cache. (Tip: The folder name will probably contain a representation of the URL of your 2D service, for example: ESRI_ServerLyrLocalGlobeCache_http___myserver_arcgis_services_world_mapserver_Layers_world.)

Inside the globe cache’s folder, you’ll see a file named cache.lyr. Add cache.lyr to your map.

Save the globe document and close ArcGlobe.

Use ArcGIS Server to publish the globe document as a globe service. You’ve created a disconnected globe service.

(Note: Creating a 3D cache from a 2D cache using the method described above adds temporary local cache files that can add up to cumbersome sizes during long caching jobs. If this occurs you can use the operating system tools to schedule a task that deletes the local cache periodically, such as every 10 minutes. The local cache is typically stored in C:Documents and Settings<SOC account name>Local SettingsTempesrimapcache.)

Do you have a question about this technique or a tip of your own you’d like to share? If so, please leave a comment.