I need to integrate an extensible map widget with my application running on sized-down linux ARM platform with around 1GB RAM, potentially no storage, potentially low bandwidth and connectivity. These limits are quite important. My application is developed using C++ and Qt5, with QML interfaces.
Map would be used, aside from normal virtual globe uses, to display custom layer data provided by some geolocalized sensors. I need to create, display and edit paths (with waypoints) on map view, it also needs to be touchscreen-enabled.
Is Cesium up to this task, or should I look elsewhere (Marble?).
I didn’t work with mobile devices. As far as I understand you need to integrate browser (Chromium) into your app and run Cesium in it.
I just tested such thing on Windows, everything expectedly works there. It was my simple win32 app which uses CEF (chromium embedded framework) + my test Cesium app working with local (predownloaded) geodetic data. I used TileMapServiceImageryProvider with local data url and GeographicTilingScheme in my Cesium app.
AFAIK there are solutions for Qt+Chromium. For initial test, you can make such app and start any Cesium example inside it. If it works, switch to local data probably will not be a problem.
Just in case, you can search for C++ virtual globe engines.
I managed to build a Qt Webkit based app and test in on the target environment. Unfortunately, provided examples were experiencing heavy performance issues (same app on my development environment runs smoothly).
I've already tested several globes. Qt Marble proved to be much lighter and had no performance issues so far. However, Cesium does look nicer, provides 3D models support and looks to be well-written, so I am not giving up on it yet.
Is there any way to tune up Cesium performance? Like settings for a weak environment. I know Mercator view is lighter, but that's not enough.
Since Cesium is entirely JavaScript-based, the JavaScript engine is probably going to be the main bottleneck. I’ve never used QtWebkit, so I’m not sure which JS engine you’re using, or what the options are. In our experiences with normal web browsers, the V8 engine in Chrome is much faster than other engines, such as the JSC engine in Safari/WebKit. I don’t know if that’s an option, though.
It’s also possible that there are Qt-specific bottlenecks in the way that your application’s graphics are composited together. Good WebGL performance relies on being able to offload work to the video card. If the particular implementation is doing compositing on the CPU, that may mean that each frame is read back from the video card, which will kill performance. You’re kind of limited by how QtWebkit happens to work, unfortunately.
Sorry I don’t have any specific advice. We certainly hope that Cesium can be embedded in applications like you describe, but you’re in untested waters at this point.
I agree that Cesium is good. AFAIK it is the only alive project of this kind (thanks to authors).
You can look at opensource http://www.openwebglobe.org/ (GPL3). It is not better than Cesium, nobody develops it about a year, but it can be lighter. It can use local geodata, import 3d models, show relief. But its functionality for helpers like labels, billboard, lines etc. is poor.
There are some proprietary javascript engines from Google, Nokia (both support terrain heighfields) and others. Seems to me support of arbitrary data sources is rather basic thing and many globes have to support it. Testing them is probably easy for you, because you just need to start their demos in your ready environment.
There are Java globes (NASA World Wind).
I’m inetrested in your results too . May be I’ll try to launch a globe on mobile devices soon.
I tried open cesium on mobile browsers (both Andorid and iOS), I would say it running decent with minor bugs, like sometimes respond strangely to touches. Not all Android devices will work but newer ones looks Ok
One thing to note, it will crash if model too big (and used too much memory). So I guess you need manage the memory nicely.
I can add that I recently put together a demo with Cordova embedding Cesium in a web view. The imagery, terrain and 3D Tilesets were all embedded in the application and it worked pretty well. I also know others in the community have had success with react native.