Skip to content

Commit

Permalink
Merge pull request #187 from fgpv-vpgf/develop
Browse files Browse the repository at this point in the history
Update master to v1.1.4
  • Loading branch information
Miles Petrov authored Mar 15, 2017
2 parents eee3bb8 + 95f2ad1 commit a1f7ffb
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 3 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "geoApi",
"version": "1.1.3",
"version": "1.1.4",
"description": "",
"main": "dist/geoapi.js",
"dependencies": {
Expand Down
38 changes: 36 additions & 2 deletions src/symbology.js
Original file line number Diff line number Diff line change
Expand Up @@ -755,6 +755,38 @@ function mapServerLegendToRenderer(serverLegend, layerIndex) {
};
}

/**
* Our symbology engine works off of renderers. When dealing with layers with no renderers,
* we need to take server-side legend and convert it to a fake renderer, which lets us
* leverage all the existing symbology code.
*
* Same as mapServerLegendToRenderer function but combines all layer renderers.
*
* @function mapServerLegendToRendererAll
* @private
* @param {Object} serverLegend legend json from an esri map server
* @returns {Object} a fake unique value renderer based off the legend
*/

function mapServerLegendToRendererAll(serverLegend) {

const layerRenders = serverLegend.layers.map(layer =>
layer.legend.map(layerLegend => ({
label: layerLegend.label,
symbol: {
type: 'esriPMS',
imageData: layerLegend.imageData,
contentType: layerLegend.contentType
}
}))
);

return {
type: 'uniqueValue',
uniqueValueInfos: [].concat(...layerRenders)
};
}

function buildMapServerToLocalLegend(esriBundle, geoApi) {
/**
* Orchestrator function that will:
Expand All @@ -765,15 +797,17 @@ function buildMapServerToLocalLegend(esriBundle, geoApi) {
*
* @function mapServerToLocalLegend
* @param {String} mapServerUrl service url (root service, not indexed endpoint)
* @param {Integer} layerIndex the index of the layer in the legend we are interested in
* @param {Integer} [layerIndex] the index of the layer in the legend we are interested in. If not provided, all layers will be collapsed into a single legend
* @returns {Promise} resolves in a viewer-compatible legend for the given server and layer index
*
*/
return (mapServerUrl, layerIndex) => {
// get esri legend from server
return getMapServerLegend(mapServerUrl, esriBundle).then(serverLegendData => {
// derive renderer for specified layer
const fakeRenderer = mapServerLegendToRenderer(serverLegendData, layerIndex);
const fakeRenderer = typeof layerIndex === 'undefined' ?
mapServerLegendToRendererAll(serverLegendData) :
mapServerLegendToRenderer(serverLegendData, layerIndex);

// convert renderer to viewer specific legend
return geoApi.symbology.rendererToLegend(fakeRenderer);
Expand Down
24 changes: 24 additions & 0 deletions test/testTileLegend.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test Page</title>
<style>
.layerTile { position: absolute; }
</style>
</head>
<body>
<p id="mess" />
<script src="../dist/geoapi.js"></script>
<script>
// http://localhost:6002/test/testServerLegend.html
geoapi('http://js.arcgis.com/3.14/', window).then(function (api) {
var mahLegendPromise = api.symbology.mapServerToLocalLegend('http://ec.gc.ca/arcgis/rest/services/Basemaps/OilSandsBasemap/MapServer');
mahLegendPromise.then(function (legend) {
console.log('this is my legend result', legend);
});
});
</script>
</body>
</html>

0 comments on commit a1f7ffb

Please sign in to comment.