= !MapGuide RFC 134 - HTTP Runtime Map Creation = This page contains a change request (RFC) for the !MapGuide Open Source project. More !MapGuide RFCs can be found on the [wiki:MapGuideRfcs RFCs] page. == Status == ||RFC Template Version||(1.0)|| ||Submission Date||13 May 2013|| ||Last Modified||6 June 2013|| ||Author||Jackie Ng|| ||RFC Status||implemented|| ||Implementation Status||completed|| ||Proposed Milestone||2.6|| ||Assigned PSC guide(s)||(when determined)|| ||'''Voting History'''||(vote date)|| ||+1||Jackie,Zac,Trevor,Haris|| ||+0|||| ||-0|||| ||-1|||| ||no vote||Paul,Tom,Bob,Bruce|| == Overview == This RFC proposes to add support for creating Runtime Maps via the mapagent == Motivation == It is currently not possible for a client-side application to be able to create a Runtime Map without assistance from the Web Extensions API or through knowledge of how the runtime map state is stored server-side. Current methods include: a) Implementing a helper script via the Web Extensions API to return the key pieces of information needed to work and interact with a runtime map. The [http://dev.openlayers.org/releases/OpenLayers-2.12/examples/mapguide.html MapGuide OpenLayers sample] requires the client application specify key missing information that only the Web Extensions API can provide: * Session ID * Map Name * Coordinate System (WKT/EPSG code) * Meters-Per-Unit b) Using the Maestro API in .net to construct the Runtime Map client-side by building the expected binary blob (that will be saved server-side) containing the initial runtime map state. This is somewhat of a hack as it relies on undocumented internals of the runtime map blob being serialized that could change with any new release of MapGuide. There is no way to build a Runtime Map client-side without the assistance of the Web Extensions API or a hacky solution like Maestro. This RFC addresses this shortcoming. == Proposed Solution == We'll introduce new APIs for MgMappingService: {{{ class MG_MAPGUIDE_API MgMappingService : public MgService { PUBLISHED_API: //////////////////////////////////////////////////////////////////////////////// /// \brief /// Creates a new runtime map from the specified Map Definition resource id and returns an XML-based description of the runtime /// map /// /// /// \htmlinclude DotNetSyntaxTop.html /// virtual MgByteReader CreateRuntimeMap(MgResourceIdentifier mapDefinition, int requestedFeatures, int iconsPerScaleRange); /// \htmlinclude SyntaxBottom.html /// \htmlinclude JavaSyntaxTop.html /// virtual MgByteReader CreateRuntimeMap(MgResourceIdentifier mapDefinition, int requestedFeatures, int iconsPerScaleRange); /// \htmlinclude SyntaxBottom.html /// \htmlinclude PHPSyntaxTop.html /// virtual MgByteReader CreateRuntimeMap(MgResourceIdentifier mapDefinition, int requestedFeatures, int iconsPerScaleRange); /// \htmlinclude SyntaxBottom.html /// /// \param mapDefinition (MgResourceIdentifier) /// MgResourceIdentifier object identifying the map definition resource. /// \param requestedFeatures (int) /// A bitmask representing the desired information to return in the XML response: /// 1=Layer/Group structure, 2=Layer Icons, 4=Layer Feature Source Information /// \param iconsPerScaleRange (int) /// The number of legend icons per scale range to render inline in the XML response as base64 strings. /// If a scale range contains a number of rules that exceeds this value, only the first and /// last rules of a type style in the scale range will have inline icons /// /// \remarks /// The bitmask values of 2 (Layer Icons) and 4 (Layer Feature Source Information) have no effect if 1 (Layer/Group structure) /// is not specified /// /// \return /// Returns an XML-based description of the runtime map /// virtual MgByteReader* CreateRuntimeMap(MgResourceIdentifier* mapDefinition, CREFSTRING sessionId, INT32 requestedFeatures, INT32 iconsPerScaleRange) = 0; //////////////////////////////////////////////////////////////////////////////// /// \brief /// Creates a new runtime map from the specified Map Definition resource id and returns an XML-based description of the runtime /// map /// /// /// \htmlinclude DotNetSyntaxTop.html /// virtual MgByteReader CreateRuntimeMap(MgResourceIdentifier mapDefinition, int iconWidth, int iconHeight, int requestedFeatures, int iconsPerScaleRange); /// \htmlinclude SyntaxBottom.html /// \htmlinclude JavaSyntaxTop.html /// virtual MgByteReader CreateRuntimeMap(MgResourceIdentifier mapDefinition, int iconWidth, int iconHeight, int requestedFeatures, int iconsPerScaleRange); /// \htmlinclude SyntaxBottom.html /// \htmlinclude PHPSyntaxTop.html /// virtual MgByteReader CreateRuntimeMap(MgResourceIdentifier mapDefinition, int iconWidth, int iconHeight, int requestedFeatures, int iconsPerScaleRange); /// \htmlinclude SyntaxBottom.html /// /// \param mapDefinition (MgResourceIdentifier) /// MgResourceIdentifier object identifying the map definition resource. /// \param targetMapName (String/string) /// The desired name of the runtime map /// \param sessionId (String/string) /// The session ID /// \param iconFormat (String/string) /// The desired image format for icons (from MgImageFormats) /// \param iconWidth (int) /// The width of each individual inline legend icons. Has no effect if icons was not requested in the response. /// \param iconHeight (int) /// The height of each individual inline legend icons. Has no effect if icons was not requested in the response. /// \param requestedFeatures (int) /// A bitmask representing the desired information to return in the XML response: /// 1=Layer/Group structure, 2=Layer Icons, 4=Layer Feature Source Information /// \param iconsPerScaleRange (int) /// The number of legend icons per scale range to render inline in the XML response as base64 strings. /// If a scale range contains a number of rules that exceeds this value, only the first and /// last rules of a type style in the scale range will have inline icons /// /// \remarks /// The bitmask values of 2 (Layer Icons) and 4 (Layer Feature Source Information) have no effect if 1 (Layer/Group structure) /// is not specified /// /// \return /// Returns an XML-based description of the runtime map /// /// \exception MgInvalidArgumentException /// \exception MgNullArgumentException /// virtual MgByteReader* CreateRuntimeMap(MgResourceIdentifier* mapDefinition, CREFSTRING targetMapName, CREFSTRING sessionId, CREFSTRING iconFormat, INT32 iconWidth, INT32 iconHeight, INT32 requestedFeatures, INT32 iconsPerScaleRange) = 0; }; }}} The ability to create MgSelection objects on the server-tier is actually not a supported usage scenario. MgSelection objects are usually created on the web-tier (as part of AJAX/Fusion viewer initialization). To support server-tier creation of MgSelection objects, we need a new supporting API in MgSelection that allows direct plugging of the session id, instead of letting it try to fetch a non-existent MgUserInformation from our *server-based* MgResourceService. We need to create a MgSelection server-side that complements the created MgMap, so that selection operations from client-side applications will work: {{{ class MG_MAPGUIDE_API MgSelection : public MgSelectionBase { INTERNAL_API: void Save(MgResourceService* resourceService, CREFSTRING sessionId, CREFSTRING mapName); }; }}} We'll also introduce a new operation to the mapagent: CREATERUNTIMEMAP This new operation has the following parameters (in addition to the standard OPERATION, VERSION, LOCALE, SESSION, USERNAME, PASSWORD and FORMAT parameters) ||Name||Description||Required|| ||MAPDEFINITION||The resource id of the Map Definition to create a Runtime Map from||Yes|| ||REQUESTEDFEATURES||A bitmask specifying what pieces of information to includein the CREATERUNTIMEMAP response||No|| ||ICONSPERSCALERANGE||The number of icons to render inline (as base64 images) per scale range in each layer of the map||No|| ||ICONFORMAT||The icon image format (default: PNG)||No|| ||ICONWIDTH||The width of each inline icon that will be rendered (default: 16)||No|| ||ICONHEIGHT||The height of each inline icon that will be rendered (default: 16)||No|| The REQUESTEDFEATURES parameters can be logically ORed with the following values: * 1 - The basic layer and group structure is returned. * 2 - Associated style icons are returned with each layer. This value only takes effect if (1) was logically ORed into the mask. * 4 - Feature Source information is included with each layer. This value only takes effect if (1) was logically ORed into the mask. The ICONSPERSCALERANGE parameter is used to apply "theme compression". If a given layer contains a scale range whose number of rules exceeds the given number, only the first and last rule items will have icons rendered inline, with the assumption that a client-application will "compress" the remaining rules when displaying in an interactive legend control. This is what the AJAX and Fusion viewers both currently do. If this parameter is not specified, and the REQUESTEDFEATURES include a request for icons (2), then a default value of 25 will be used (same value we currently use for LoadMap.php and LoadScaleRanges.php for Fusion). Inline icons are rendered as base64 strings. With an associated mime type included in the top-level IconMimeType element, allowing for browsers to construct the relevant data URIs client-side. Non-browser clients can use this mime type to determine how the base64 content should be read into an image. The REQUESTDFEATURES parameter allows for scalable CREATERUNTIMEMAP responses depending on the needs of the client application. JSON output format is supported, and provides the same benefits as other operations that support JSON output. As part of this RFC, Fusion will be modified use CREATERUNTIMEMAP for its map initialization if it determined that the server support is there, allowing it to bypass the asynchronous call chain to LoadMap.php and LoadScaleRanges.php. Based on tests against various maps of various sizes, CREATERUNTIMEMAP beats the LoadMap.php/LoadScaleRanges.php combination in both response size and time/latency (and these performance gains increase with map size!), with only small additional client-side overhead in re-shaping the CREATERUNTIMEMAP response to suit the existing Fusion map initialization code. Some example responses below (all using the Sheboygan Map Definition): A CREATERUNTIMEMAP request without the REQUESTEDFEATURES looks like this: {{{ 2.6.0.0 82a71582-befa-11e2-8000-080027004461_en_MTI3LjAuMC4x0B060B050B04 Sheboygan Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition ffcdbd9c 96 GEOGCS["WGS84 Lat/Long's, Degrees, -180 ==> +180",DATUM["D_WGS_1984",SPHEROID["World_Geodetic_System_of_1984",6378137,298.257222932867]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] LL84 4326 111319.49079327358 -87.764986990962839 43.691398128787782 -87.695521510899724 43.797520000480347 }}} And a minimal request for a tiled map looks like this. Note that despite the layer/group structure request bit not being set, we will still get back any base layer groups in the response. This is because the base layer group name is required (in addition to the Map Definition) in order for a client application to be able to issue GETTILEIMAGE requests for tiles. {{{ 2.6.0.0 ccfb2298-c45b-11e2-8000-080027004461_en_MTI3LjAuMC4x0B060B050B04 Sheboygan Library://Samples/Sheboygan/MapsTiled/Sheboygan.MapDefinition FFCDBD9C 96 GEOGCS["WGS84 Lat/Long's, Degrees, -180 ==> +180",DATUM["D_WGS_1984",SPHEROID["World_Geodetic_System_of_1984",6378137,298.257222932867]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] LL84 4326 111319.49079327358 -87.764986990962839 43.691398128787782 -87.695521510899724 43.797520000480347 Base Layer Group 2 Tiled Layers ccff8f90-c45b-11e2-8000-080027004461 true true true true 1000 1930.6977300000001 3727.5937199999998 7196.8567300000004 13894.95494 26826.95795 51794.746789999997 100000 }}} This response contains the minimal information required for a client mapping library like OpenLayers to build a basic map viewer out of. It also contains the required session id and map name needed to dispatch additional mapagent requests for other operations that operate against the runtime map like rendering (GETDYNAMICMAPOVERLAYIMAGE) and feature selection (QUERYMAPFEATURES). The MapGuide Site Version is included so the client application can make (generally safe) assumptions about what level of API/operation support is available from the mapagent. The session id is either passed in via the SESSION request parameter, or generated via the USERNAME/PASSWORD request parameters or a successful HTTP basic authentication challenge. Therefore, CREATERUNTIMEMAP serves the same function as the CREATESESSION operation, negating the need to fire off this request first beforehand by the client application. The various permutations of the REQUESTEDFEATURES bitmask extend upon the basic minimal XML response with additional information, all detailed below. REQUESTEDFEATURES = 1 (with basic layer/group structure): {{{ 2.6.0.0 7fdaa490-befa-11e2-8000-080027004461_en_MTI3LjAuMC4x0B060B050B04 Sheboygan Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition ffcdbd9c 96 GEOGCS["WGS84 Lat/Long's, Degrees, -180 ==> +180",DATUM["D_WGS_1984",SPHEROID["World_Geodetic_System_of_1984",6378137,298.257222932867]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] LL84 4326 111319.49079327358 -87.764986990962839 43.691398128787782 -87.695521510899724 43.797520000480347 Base Map 1 Base Map 7fdeea64-befa-11e2-8000-080027004461 true true true true Municipal 1 Municipal 7fdeea64-befa-11e2-8001-080027004461 true true true true Transportation 1 Transportation 7fdeea64-befa-11e2-8002-080027004461 true true true true Roads 1 Roads 7fdeea64-befa-11e2-8003-080027004461 7fdeea64-befa-11e2-8002-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Roads.LayerDefinition Rail Lines 1 Rail Lines 7fdf1174-befa-11e2-8000-080027004461 7fdeea64-befa-11e2-8002-080027004461 false true true false false Library://Samples/Sheboygan/Layers/Tracks.LayerDefinition Districts 1 Districts 7fdf1174-befa-11e2-8001-080027004461 7fdeea64-befa-11e2-8001-080027004461 false true true true false Library://Samples/Sheboygan/Layers/Districts.LayerDefinition Buildings 1 Buildings 7fdf1174-befa-11e2-8002-080027004461 7fdeea64-befa-11e2-8001-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Buildings.LayerDefinition Parcels 1 Parcels 7fdf1174-befa-11e2-8003-080027004461 7fdeea64-befa-11e2-8001-080027004461 true true true true true Library://Samples/Sheboygan/Layers/Parcels.LayerDefinition Islands 1 Islands 7fdf1174-befa-11e2-8004-080027004461 7fdeea64-befa-11e2-8000-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Islands.LayerDefinition Hydrography 1 Hydrography 7fdf1174-befa-11e2-8005-080027004461 7fdeea64-befa-11e2-8000-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Hydrography.LayerDefinition CityLimits 1 CityLimits 7fdf1174-befa-11e2-8006-080027004461 7fdeea64-befa-11e2-8000-080027004461 false true true true true Library://Samples/Sheboygan/Layers/CityLimits.LayerDefinition }}} The layers and groups are presented in the response as a flat list (like the Map Definition). Client applications can use the parent ObjectId -> Group ObjectID relationship to construct the appropriate parent-child relationships and hierarchy. REQUESTEDFEATURES = 3 (Basic layer/group structure with inline icons) {{{ 2.6.0.0 cc47aa6c-befa-11e2-8000-080027004461_en_MTI3LjAuMC4x0B060B050B04 Sheboygan Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition ffcdbd9c 96 image/png GEOGCS["WGS84 Lat/Long's, Degrees, -180 ==> +180",DATUM["D_WGS_1984",SPHEROID["World_Geodetic_System_of_1984",6378137,298.257222932867]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] LL84 4326 111319.49079327358 -87.764986990962839 43.691398128787782 -87.695521510899724 43.797520000480347 Base Map 1 Base Map cc4b53f6-befa-11e2-8001-080027004461 true true true true Municipal 1 Municipal cc4b53f6-befa-11e2-8002-080027004461 true true true true Transportation 1 Transportation cc4b53f6-befa-11e2-8003-080027004461 true true true true Roads 1 Roads cc4b7b06-befa-11e2-8000-080027004461 cc4b53f6-befa-11e2-8003-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Roads.LayerDefinition 0 10000 2 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAIklEQVQokWP8//8/AymAiSTVI1UDS3t7O21tYByNOFpoAAAJdQewcVU/XQAAAABJRU5ErkJggg== 10000 24000 2 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAIklEQVQokWP8//8/AymAiSTVI1UDS3t7O21tYByNOFpoAAAJdQewcVU/XQAAAABJRU5ErkJggg== Rail Lines 1 Rail Lines cc4b7b06-befa-11e2-8001-080027004461 cc4b53f6-befa-11e2-8003-080027004461 false true true false false Library://Samples/Sheboygan/Layers/Tracks.LayerDefinition 0 24000 2 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAb0lEQVQokc2SwQnAIBAE15AmbMpSfdiIWIR3YAn62Dwur0AECULmtY9ZjoVzJLHCsWR/KIwxSilz1Zy70FqLMc4L5uzfcKaUAIiIiFh+oKoAvPfmrF8IIQCotaqq5TfM2T8aJEn23nPOnGKO+9/zXc8lZ5XdLNzmAAAAAElFTkSuQmCC Districts 1 Districts cc4b7b06-befa-11e2-8002-080027004461 cc4b53f6-befa-11e2-8002-080027004461 false true true true false Library://Samples/Sheboygan/Layers/Districts.LayerDefinition 10000 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOUlEQVQokWPcs6JOTFabgTjw6vFVhktHV/4nGlw6upKJSLPhYFTDqAZqaWB59fjq5WOriFT96vFVACkEOt/4XD28AAAAAElFTkSuQmCC Buildings 1 Buildings cc4ba216-befa-11e2-8000-080027004461 cc4b53f6-befa-11e2-8002-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Buildings.LayerDefinition 0 1500 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWM8evToy5cvGYgD4uLiLC9fvrx06RKRGvT09JiIVAoHoxpGNVBLA4u4uLienh6RqsXFxQHMyAxCMWcM4QAAAABJRU5ErkJggg== Parcels 1 Parcels cc4ba216-befa-11e2-8001-080027004461 cc4b53f6-befa-11e2-8002-080027004461 true true true true true Library://Samples/Sheboygan/Layers/Parcels.LayerDefinition 0 10000 3 Zone: AGR RTYPE = 'AGR' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWOc0F4lwPGbgTjw4QcriwDHb0X+r0RquM/AzUSkUjgY1TCqgVoaWD78YL3PwE2k6g8/WAEoyAybnvNMrwAAAABJRU5ErkJggg== Zone: EXM RTYPE = 'EXM' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWPs66zh4/rDQBz49I2FhY/rj6zwDyI1PGbgYCJSKRyMahjVQC0NLJ++sTxm4CBS9advLAA9KgyhkvW9tQAAAABJRU5ErkJggg== Zone: MER RTYPE = 'MER' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWPs6a7l5fnHQBz4/IWJhZfnn6T4HyI1MDCwMBGtFApGNYxqoJYGls9fmBgYWIhU/fkLEwC9qwrV+OtROgAAAABJRU5ErkJggg== Zone: MFG RTYPE = 'MFG' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOUlEQVQokWPs6q3n5mMgEnz9xMDCzccgJv2fSA2vGBiZiDUcBkY1jGqglgaWr58YXjEwEqn66ycGAIUGCqdLv0I4AAAAAElFTkSuQmCC Zone: RES RTYPE = 'RES' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAO0lEQVQokWPs7G/kFGBkIA58//CfhVOAUUiemUgN7xj+MhGpFA5GNYxqoJYGlu8f/r9j+Euk6u8f/gMArKMOreezChMAAAAASUVORK5CYII= Zone: S&W RTYPE = 'S&W' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAO0lEQVQokWNsn9jMLsTMQBz4+e4vC7sQM78yG5EaPjL8YiJSKRyMahjVQC0NLD/f/f3I8ItI1T/f/QUAw9kOsaqrjjYAAAAASUVORK5CYII= Zone: WTC RTYPE = 'WTC' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWNsndzCJsLKQBz49eY3C5sIK7c6F5EaGBi+MRGtFApGNYxqoJYGll9vfjMwfCNS9a83vwEcRQzJpppspAAAAABJRU5ErkJggg== Zone: Other iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAMUlEQVQokWM0NTU1NTVlIA6cPn2axdTUNCsri0gN06ZNYyJSKRyMahjVQC0NjKQmbwAmVgr+9vodNwAAAABJRU5ErkJggg== Islands 1 Islands cc4ba216-befa-11e2-8002-080027004461 cc4b53f6-befa-11e2-8001-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Islands.LayerDefinition 0 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWO8emINAymAiSTVoxpGNQwpDQAvoAJpPgoElwAAAABJRU5ErkJggg== Hydrography 1 Hydrography cc4ba216-befa-11e2-8003-080027004461 cc4b53f6-befa-11e2-8001-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Hydrography.LayerDefinition 0 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWNcffwlAymAiSTVoxpGNQwpDQBmNQJ7CUalHwAAAABJRU5ErkJggg== CityLimits 1 CityLimits cc4ba216-befa-11e2-8004-080027004461 cc4b53f6-befa-11e2-8001-080027004461 false true true true true Library://Samples/Sheboygan/Layers/CityLimits.LayerDefinition 0 10000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWM8cOAAAymAiSTVoxpGNQwpDQAT+QJghokBTgAAAABJRU5ErkJggg== 10000 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWO8emINAymAiSTVoxpGNQwpDQAvoAJpPgoElwAAAABJRU5ErkJggg== }}} REQUESTEDFEATURES = 7 (Basic layer/group structure with inline icons and Feature Source information) {{{ 2.6.0.0 af95896c-bef9-11e2-8000-080027004461_en_MTI3LjAuMC4x0B060B050B04 Sheboygan Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition ffcdbd9c 96 image/png GEOGCS["WGS84 Lat/Long's, Degrees, -180 ==> +180",DATUM["D_WGS_1984",SPHEROID["World_Geodetic_System_of_1984",6378137,298.257222932867]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] LL84 4326 111319.49079327358 -87.764986990962839 43.691398128787782 -87.695521510899724 43.797520000480347 Base Map 1 Base Map af9bcb1a-bef9-11e2-8000-080027004461 true true true true Municipal 1 Municipal af9bcb1a-bef9-11e2-8001-080027004461 true true true true Transportation 1 Transportation af9bcb1a-bef9-11e2-8002-080027004461 true true true true Roads 1 Roads af9bf22a-bef9-11e2-8000-080027004461 af9bcb1a-bef9-11e2-8002-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Roads.LayerDefinition Library://Samples/Sheboygan/Data/RoadCenterLines.FeatureSource SHP_Schema:RoadCenterLines SHPGEOM 0 10000 2 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAIklEQVQokWP8//8/AymAiSTVI1UDS3t7O21tYByNOFpoAAAJdQewcVU/XQAAAABJRU5ErkJggg== 10000 24000 2 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAIklEQVQokWP8//8/AymAiSTVI1UDS3t7O21tYByNOFpoAAAJdQewcVU/XQAAAABJRU5ErkJggg== Rail Lines 1 Rail Lines af9bf22a-bef9-11e2-8001-080027004461 af9bcb1a-bef9-11e2-8002-080027004461 false true true false false Library://Samples/Sheboygan/Layers/Tracks.LayerDefinition Library://Samples/Sheboygan/Data/Rail.FeatureSource SHP_Schema:Rail SHPGEOM 0 24000 2 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAb0lEQVQokc2SwQnAIBAE15AmbMpSfdiIWIR3YAn62Dwur0AECULmtY9ZjoVzJLHCsWR/KIwxSilz1Zy70FqLMc4L5uzfcKaUAIiIiFh+oKoAvPfmrF8IIQCotaqq5TfM2T8aJEn23nPOnGKO+9/zXc8lZ5XdLNzmAAAAAElFTkSuQmCC Districts 1 Districts af9bf22a-bef9-11e2-8002-080027004461 af9bcb1a-bef9-11e2-8001-080027004461 false true true true false Library://Samples/Sheboygan/Layers/Districts.LayerDefinition Library://Samples/Sheboygan/Data/VotingDistricts.FeatureSource SDF_2_Schema:VotingDistricts Data 10000 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOUlEQVQokWPcs6JOTFabgTjw6vFVhktHV/4nGlw6upKJSLPhYFTDqAZqaWB59fjq5WOriFT96vFVACkEOt/4XD28AAAAAElFTkSuQmCC Buildings 1 Buildings af9bf22a-bef9-11e2-8003-080027004461 af9bcb1a-bef9-11e2-8001-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Buildings.LayerDefinition Library://Samples/Sheboygan/Data/BuildingOutlines.FeatureSource SHP_Schema:BuildingOutlines SHPGEOM 0 1500 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWM8evToy5cvGYgD4uLiLC9fvrx06RKRGvT09JiIVAoHoxpGNVBLA4u4uLienh6RqsXFxQHMyAxCMWcM4QAAAABJRU5ErkJggg== Parcels 1 Parcels af9bf22a-bef9-11e2-8004-080027004461 af9bcb1a-bef9-11e2-8001-080027004461 true true true true true Library://Samples/Sheboygan/Layers/Parcels.LayerDefinition Library://Samples/Sheboygan/Data/Parcels.FeatureSource SHP_Schema:Parcels SHPGEOM 0 10000 3 Zone: AGR RTYPE = 'AGR' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWOc0F4lwPGbgTjw4QcriwDHb0X+r0RquM/AzUSkUjgY1TCqgVoaWD78YL3PwE2k6g8/WAEoyAybnvNMrwAAAABJRU5ErkJggg== Zone: EXM RTYPE = 'EXM' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWPs66zh4/rDQBz49I2FhY/rj6zwDyI1PGbgYCJSKRyMahjVQC0NLJ++sTxm4CBS9advLAA9KgyhkvW9tQAAAABJRU5ErkJggg== Zone: MER RTYPE = 'MER' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWPs6a7l5fnHQBz4/IWJhZfnn6T4HyI1MDCwMBGtFApGNYxqoJYGls9fmBgYWIhU/fkLEwC9qwrV+OtROgAAAABJRU5ErkJggg== Zone: MFG RTYPE = 'MFG' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOUlEQVQokWPs6q3n5mMgEnz9xMDCzccgJv2fSA2vGBiZiDUcBkY1jGqglgaWr58YXjEwEqn66ycGAIUGCqdLv0I4AAAAAElFTkSuQmCC Zone: RES RTYPE = 'RES' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAO0lEQVQokWPs7G/kFGBkIA58//CfhVOAUUiemUgN7xj+MhGpFA5GNYxqoJYGlu8f/r9j+Euk6u8f/gMArKMOreezChMAAAAASUVORK5CYII= Zone: S&W RTYPE = 'S&W' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAO0lEQVQokWNsn9jMLsTMQBz4+e4vC7sQM78yG5EaPjL8YiJSKRyMahjVQC0NLD/f/f3I8ItI1T/f/QUAw9kOsaqrjjYAAAAASUVORK5CYII= Zone: WTC RTYPE = 'WTC' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWNsndzCJsLKQBz49eY3C5sIK7c6F5EaGBi+MRGtFApGNYxqoJYGll9vfjMwfCNS9a83vwEcRQzJpppspAAAAABJRU5ErkJggg== Zone: Other iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAMUlEQVQokWM0NTU1NTVlIA6cPn2axdTUNCsri0gN06ZNYyJSKRyMahjVQC0NjKQmbwAmVgr+9vodNwAAAABJRU5ErkJggg== Islands 1 Islands af9bf22a-bef9-11e2-8005-080027004461 af9bcb1a-bef9-11e2-8000-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Islands.LayerDefinition Library://Samples/Sheboygan/Data/Islands.FeatureSource SHP_Schema:Islands SHPGEOM 0 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWO8emINAymAiSTVoxpGNQwpDQAvoAJpPgoElwAAAABJRU5ErkJggg== Hydrography 1 Hydrography af9c193a-bef9-11e2-8000-080027004461 af9bcb1a-bef9-11e2-8000-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Hydrography.LayerDefinition Library://Samples/Sheboygan/Data/HydrographicPolygons.FeatureSource SHP_Schema:HydrographicPolygons SHPGEOM 0 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWNcffwlAymAiSTVoxpGNQwpDQBmNQJ7CUalHwAAAABJRU5ErkJggg== CityLimits 1 CityLimits af9c193a-bef9-11e2-8001-080027004461 af9bcb1a-bef9-11e2-8000-080027004461 false true true true true Library://Samples/Sheboygan/Layers/CityLimits.LayerDefinition Library://Samples/Sheboygan/Data/CityLimits.FeatureSource SHP_Schema:CityLimits SHPGEOM 0 10000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWM8cOAAAymAiSTVoxpGNQwpDQAT+QJghokBTgAAAABJRU5ErkJggg== 10000 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWO8emINAymAiSTVoxpGNQwpDQAvoAJpPgoElwAAAABJRU5ErkJggg== }}} Finally, REQUESTEDFEATURES = 7 (Basic layer/group structure with inline icons and Feature Source information) and ICONSPERSCALERANGE = 3. Note the Parcels theme only has inline icons for the first and last rules because its number of rules (8) exceeds our specified limit. The omission of icons serves as a "hint" to client applications to compress this theme (which both AJAX and Fusion viewers currently do, albeit with slightly different metrics for theme compression). Rules without icons can issue a follow up GETLEGENDIMAGE request and use its parent's type and its respective position for the required GEOMETRYTYPE and THEMECATEGORY parameters. {{{ 2.6.0.0 469bb24a-befb-11e2-8000-080027004461_en_MTI3LjAuMC4x0B060B050B04 Sheboygan Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition ffcdbd9c 96 image/png GEOGCS["WGS84 Lat/Long's, Degrees, -180 ==> +180",DATUM["D_WGS_1984",SPHEROID["World_Geodetic_System_of_1984",6378137,298.257222932867]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] LL84 4326 111319.49079327358 -87.764986990962839 43.691398128787782 -87.695521510899724 43.797520000480347 Base Map 1 Base Map 469f5bd4-befb-11e2-8000-080027004461 true true true true Municipal 1 Municipal 469f5bd4-befb-11e2-8001-080027004461 true true true true Transportation 1 Transportation 469f5bd4-befb-11e2-8002-080027004461 true true true true Roads 1 Roads 469f82e4-befb-11e2-8000-080027004461 469f5bd4-befb-11e2-8002-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Roads.LayerDefinition Library://Samples/Sheboygan/Data/RoadCenterLines.FeatureSource SHP_Schema:RoadCenterLines SHPGEOM 0 10000 2 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAIklEQVQokWP8//8/AymAiSTVI1UDS3t7O21tYByNOFpoAAAJdQewcVU/XQAAAABJRU5ErkJggg== 10000 24000 2 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAIklEQVQokWP8//8/AymAiSTVI1UDS3t7O21tYByNOFpoAAAJdQewcVU/XQAAAABJRU5ErkJggg== Rail Lines 1 Rail Lines 469f82e4-befb-11e2-8001-080027004461 469f5bd4-befb-11e2-8002-080027004461 false true true false false Library://Samples/Sheboygan/Layers/Tracks.LayerDefinition Library://Samples/Sheboygan/Data/Rail.FeatureSource SHP_Schema:Rail SHPGEOM 0 24000 2 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAb0lEQVQokc2SwQnAIBAE15AmbMpSfdiIWIR3YAn62Dwur0AECULmtY9ZjoVzJLHCsWR/KIwxSilz1Zy70FqLMc4L5uzfcKaUAIiIiFh+oKoAvPfmrF8IIQCotaqq5TfM2T8aJEn23nPOnGKO+9/zXc8lZ5XdLNzmAAAAAElFTkSuQmCC Districts 1 Districts 469f82e4-befb-11e2-8002-080027004461 469f5bd4-befb-11e2-8001-080027004461 false true true true false Library://Samples/Sheboygan/Layers/Districts.LayerDefinition Library://Samples/Sheboygan/Data/VotingDistricts.FeatureSource SDF_2_Schema:VotingDistricts Data 10000 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOUlEQVQokWPcs6JOTFabgTjw6vFVhktHV/4nGlw6upKJSLPhYFTDqAZqaWB59fjq5WOriFT96vFVACkEOt/4XD28AAAAAElFTkSuQmCC Buildings 1 Buildings 469f82e4-befb-11e2-8003-080027004461 469f5bd4-befb-11e2-8001-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Buildings.LayerDefinition Library://Samples/Sheboygan/Data/BuildingOutlines.FeatureSource SHP_Schema:BuildingOutlines SHPGEOM 0 1500 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWM8evToy5cvGYgD4uLiLC9fvrx06RKRGvT09JiIVAoHoxpGNVBLA4u4uLienh6RqsXFxQHMyAxCMWcM4QAAAABJRU5ErkJggg== Parcels 1 Parcels 469f82e4-befb-11e2-8004-080027004461 469f5bd4-befb-11e2-8001-080027004461 true true true true true Library://Samples/Sheboygan/Layers/Parcels.LayerDefinition Library://Samples/Sheboygan/Data/Parcels.FeatureSource SHP_Schema:Parcels SHPGEOM 0 10000 3 Zone: AGR RTYPE = 'AGR' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAOklEQVQokWOc0F4lwPGbgTjw4QcriwDHb0X+r0RquM/AzUSkUjgY1TCqgVoaWD78YL3PwE2k6g8/WAEoyAybnvNMrwAAAABJRU5ErkJggg== Zone: EXM RTYPE = 'EXM' Zone: MER RTYPE = 'MER' Zone: MFG RTYPE = 'MFG' Zone: RES RTYPE = 'RES' Zone: S&W RTYPE = 'S&W' Zone: WTC RTYPE = 'WTC' Zone: Other iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAMUlEQVQokWM0NTU1NTVlIA6cPn2axdTUNCsri0gN06ZNYyJSKRyMahjVQC0NjKQmbwAmVgr+9vodNwAAAABJRU5ErkJggg== Islands 1 Islands 469fa9f4-befb-11e2-8000-080027004461 469f5bd4-befb-11e2-8000-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Islands.LayerDefinition Library://Samples/Sheboygan/Data/Islands.FeatureSource SHP_Schema:Islands SHPGEOM 0 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWO8emINAymAiSTVoxpGNQwpDQAvoAJpPgoElwAAAABJRU5ErkJggg== Hydrography 1 Hydrography 469fa9f4-befb-11e2-8001-080027004461 469f5bd4-befb-11e2-8000-080027004461 false true true true true Library://Samples/Sheboygan/Layers/Hydrography.LayerDefinition Library://Samples/Sheboygan/Data/HydrographicPolygons.FeatureSource SHP_Schema:HydrographicPolygons SHPGEOM 0 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWNcffwlAymAiSTVoxpGNQwpDQBmNQJ7CUalHwAAAABJRU5ErkJggg== CityLimits 1 CityLimits 469fa9f4-befb-11e2-8002-080027004461 469f5bd4-befb-11e2-8000-080027004461 false true true true true Library://Samples/Sheboygan/Layers/CityLimits.LayerDefinition Library://Samples/Sheboygan/Data/CityLimits.FeatureSource SHP_Schema:CityLimits SHPGEOM 0 10000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWM8cOAAAymAiSTVoxpGNQwpDQAT+QJghokBTgAAAABJRU5ErkJggg== 10000 1000000000000 3 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAA3NCSVQICAjb4U/gAAAAGUlEQVQokWO8emINAymAiSTVoxpGNQwpDQAvoAJpPgoElwAAAABJRU5ErkJggg== }}} An attached example demonstrating this new API is included (mapguide.html). This is done in pure client-side OpenLayers/jQuery without any assistance required from any Web Extensions API glue code. == Implications == This is a brand new API. There are no compatibility issues. The AJAX viewer will not use this new API for initialization. == Test Plan == Test the operation with various requested feature levels against a pure OpenLayers map viewer. Test and verify CREATERUNTIMEMAP at full feature level provides all the necessary information for Fusion to bypass LoadMap.php and LoadScaleRanges.php == Funding / Resources == Community