Designating max extent of quadtree

My team uses Cesium primarily as a WMS client. We have hundreds of layers - some time-based - and we are experiencing performance degradation/hangups. We are finding that many of our hangups are due to Cesium requesting massive bounding boxes far outside of the user's viewport. For our use case, it is extremely inconvenient that Cesium makes requests to our Geoserver for global bounding boxes while it is building its quadtree. Is it on the roadmap at all to allow for the possibility of designating the max extent of the quadtree so that Cesium doesn't make unneeded requests?

Thanks for all the hard work everyone.

We are using version 1.38 and our app is primarily build around IE11.

Hi,

You can limit the tiles that Cesium requests by specifying a rectangle property when constructing an imagery layer. For example:

var layer = new ImageryLayer(wmsImageryProvider, {

rectangle : Cesium.Rectangle.fromDegrees(45, -75, 50, -70)

});

scene.imageryLayers.add(layer);

If you’ll pardon the plug, you might want to check out TerriaJS (http://terria.io). It has great support for WMS, including time-dynamic layers. It will set the rectangle property automatically by querying the WMS server’s GetCapabilities. In the next version you’ll even be able to compare different times (and other dimensions) using a splitter.

Same open source license as Cesium. You can try it out with your own WMS layer by visiting http://nationalmap.gov.au, click Add Data, then My Data, then Add Web Data, then put your WMS URL in the box and click Add. nationalmap.gov.au doesn’t have the splitter yet, though, sorry.

Kevin

I should mention that Cesium itself has support for splitting imagery layers, thanks to the awesome work by Jason Beverage. TerriaJS just adds a nice UI for it, and makes it easy to hook up to a WMS layer with a time dimension.

Ahh, so we have been trying to add the rectangle on to the WebMapServiceImageryProvider constructor to no avail. I will give this a shot! Thanks a ton, we really appreciate it.

Unfortunately, it looks like giving the Rectangle to the ImageryLayer itself isn't actually setting Cesium's request extent. Cesium is still making requests for bounding boxes far outside of the given rectangle.

Could there be any other configuration change in the public api that could be messing this functionality up?

Hi Zachary,

We’re tracking improving the number of requests for imagery in this GitHub issue. The solution would be to skip levels of detail, which is indeed on our roadmap, but we have no concrete date. Contributions are more than welcome if you have the bandwidth!

Thanks!

Gabby

When you specify a rectangle on the imagery layer, it will stop Cesium from requesting any tiles that are completely outside that rectangle. But it won’t put a hard constraint on the extent that Cesium requests. For example, at the lowest level of detail, there are only one or two tiles that cover the entire world, and Cesium will request these. Gabby is right that there are improvements we can make to Cesium (level skipping) such that it doesn’t need these low-detail tiles when zoomed in close. There will always be situations where they are needed, though, so it’s important that your server be able to produce them in a timely manner. This is challenging for the server, of course, because the low detail tiles end up including all of your features. The good news is that there are very few low-detail tiles to worry about, and so caching them is easy and effective. If you’re using Geoserver, turning on GeoWebCache will make a huge difference!

Kevin

Hi,

if you limit the extent, you can also change the minimumTerrainLevel Cesium then won’t request any tiles over the minimumTerrainLevel. But you have to be careful cesium will request “all tiles” at the given minimumTerrainLevel. We use some small code snippet to calculate the minimum TerrainLevel based on the Extent.