Warning, /education/marble/docs/layermanagement.txt is written in an unsupported language. File is not indexed.
0001
0002 I. Layer Management Class
0003 =========================
0004
0005 Overview:
0006 ---------
0007
0008 Currently Marble is already capable of visualizing different kinds of
0009 information based on different rendering classes which paint onto the
0010 map canvas.
0011
0012 These classes:
0013 - apply texture mapping
0014 - and apply effects (e.g. colorizing textures, shading) to the
0015 resulting images.
0016 - add placemarks,
0017 - create vectors
0018
0019 There are also classes which create items that display information or
0020 add controls on top of the whole map, called "floating items"
0021 (e.g. compass, scale bar, planned: overview world map, on-map
0022 navigation control ).
0023
0024 However the whole process of rendering using those classes is
0025 hardcoded and not very flexible.
0026
0027 The Layer Management Class ("LMC") is supposed to solve this issue. In
0028 short the new LMC concept aims to:
0029
0030 - Create a QTPLUGIN (type: Lower-Level-API) architecture for the
0031 rendering process.
0032
0033 - The backend functionality of the current rendering classes should go
0034 into BACKEND PLUGINS.
0035
0036 - The backend classes should be QT-THREAD-based. (NYI)
0037
0038 - The backend classes should encourage the Model-View concept and make
0039 use of Qt's INTERVIEW framework.
0040
0041 - It should be possible to instantiate each backend class multiple
0042 times resulting in multiple layers.
0043
0044 Note that we distinguish between "BACKEND"-classes and the objects
0045 based on the BACKEND-classes called "LAYERS".
0046
0047 Due to different usage and technical requirements layers might either
0048 be:
0049
0050 a) PROJECTION-BASED LAYERS (i.e. they get applied on top of the
0051 globe using the respective projection transformations).
0052
0053 b) SCREEN LAYERS (i.e. they don't care about the projection and are
0054 layers "on top of the screen"
0055
0056 "Execution order" of the different backends should be based on the
0057 following mechanisms:
0058
0059 a) Each backend should provide "hardcoded" hints which describe
0060 dependencies (e.g. the texture colorization depends on the result
0061 of a texturemapping backend ) and allowed ranges for the
0062 rendering order (e.g. floating items should always be displayed
0063 on top of the map, a starry background needs to get drawn before
0064 the globe is painted)
0065
0066 b) In Marble the structure of each map gets described in the map's
0067 .dgml file. So the layermanagement class needs to fetch
0068 information from the .dgml-parser about the different types of
0069 backends that get used in a map. The .dgml file also needs to
0070 provide information about the rendering order.
0071
0072 ( For more information on this topic have a look at dgml2.txt )
0073
0074
0075 c) For backend types where there are no hard requirements on the
0076 rendering order the LMC should decide itself which order to
0077 take. So if for example a custom backend-plugin doesn't get
0078 mentioned in the .dgml file the LMC should make a well-educated
0079 guess at which place inside the layer structure it would be best
0080 to insert the layer.
0081
0082 According to the concept described so far it should be possible to
0083 paint different layers based on the very same backend directly on top
0084 of each other (e.g. a cloud layer on top of a satellite map layer.
0085 Normally this would result in two different layers. However for
0086 reasons of performance it needs to be possible to merge the data into
0087 a single layer right from the start ("MergedLayer").
0088
0089 This gets already done for placemarks in current SVN where data from
0090 different files gets merged into a single file. It also gets done
0091 already for clouds on top of the satellite image data. However what's
0092 missing is a more generic approach where a MergedLayerPainter class
0093 operates directly on the tiles based on the information it receives
0094 from the LMC.
0095
0096 Before telling the MergedLayerPainter class which layers need to get
0097 painted on top of the tiles the LMC needs to check whether tiles or
0098 sourceimage data is available for the map. If there is no such data
0099 available the LMC needs to either notify the TileLoader that it needs
0100 to create tiles or the LMC will simply ignore the missing data and
0101 will skip asking the MergedLayerPainter to render the missing data.
0102
0103 - The plugin-backend concept should allow CUSTOM BACKENDS created by
0104 third party developers.
0105
0106 - Creating new geographical features on the map should happen using a
0107 Qt-like API (which would include the QPainter API to draw in screen
0108 coordinates):
0109
0110 Code snippet:
0111
0112 bool MarbleTestPlugin::render( GeoPainter *painter, ViewportParams *viewport, const QString& renderPos, GeoSceneLayer * layer )
0113 {
0114 painter->autoMapQuality();
0115 painter->setPen( Qt::red );
0116
0117 GeoDataCoordinates flensburg( 9.4, 54.8, 0.0, GeoDataCoordinates::Degree );
0118 GeoDataCoordinates madrid( -3.7, 40.4, 0.0, GeoDataCoordinates::Degree );
0119
0120 painter->drawLine( flensburg, madrid );
0121
0122 ( For more information on this topic have a look at paintingmaps.txt )
0123
0124 - It should be possible to use this Qt-style Geo-API either from
0125 outside the MarbleWidget or from inside the custom backend plugin.
0126
0127 - It should be possible to create custom PROPRIETARY PLUGINS which are
0128 able to provide PROPRIETARY DATA in a manner that prevents exporting
0129 the whole data at once.
0130
0131 Yes, while we strongly believe in free maps and free data we would
0132 also like to see proprietary apps use our widget - as always patches
0133 sent to us under a free license are very much appreciated.
0134
0135 - Expiring layer data: The LMC should get notified about expiration
0136 dates of layer data. If layer data expires the LMC should trigger a
0137 reload of each chunk of data. Initially it would be enough if we
0138 supported reloading the whole data set of a single layer. In the
0139 future reloading single data chunks of a layer would be nice to
0140 have. (Examples for tile expiration: Real-time cloud layers,
0141 Improvements for OpenStreetMap data).
0142
0143 - LMC should also work fine with OpenGL-based backend-plugins.
0144
0145 FUTURE low-priority enhancements (for usage in "real" light GIS apps
0146 that might use Marble in the future):
0147
0148 - Make it possible to specify custom changes to the rendering order of
0149 the layers using the LMC-API.
0150
0151 - Make it possible to create layer groups. This would e.g. enable the
0152 user to show/hide many "grouped" layers at once.
0153
0154