enhanced-basemap-gallery-widget
Version:
This widget is enhanced to include the ability to fade between basemaps.
325 lines (301 loc) • 10.5 kB
JavaScript
/*
Copyright ©2014 Esri. All rights reserved.
TRADE SECRETS: ESRI PROPRIETARY AND CONFIDENTIAL
Unpublished material - all rights reserved under the
Copyright Laws of the United States and applicable international
laws, treaties, and conventions.
For additional information, contact:
Attn: Contracts and Legal Department
Environmental Systems Research Institute, Inc.
380 New York Street
Redlands, California, 92373
USA
email: contracts@esri.com
*/
define([
'dojo/_base/lang',
'dojo/Deferred',
'dojo/_base/array',
'dojo/promise/all',
'jimu/portalUtils',
'jimu/SpatialReference/wkidUtils',
'jimu/shared/basePortalUrlUtils',
'esri/request'
], function(lang, Deferred, array, all, portalUtils, SRUtils, basePortalUrlUtils, esriRequest) {
var mo = {};
mo._loadPortalBaseMaps = function(portalUrl, curMapSpatialRefObj) {
// map.spatial
//var curMapSpatialRefObj = this.map.spatialReference;
var defRet = new Deferred();
var deferreds = [];
getWebMapsFromBasemapGalleryGroup(portalUrl).then(function(response) {
var basemapItems = response.results;
array.forEach(basemapItems, function(basemapItem) {
var def = new Deferred();
deferreds.push(def);
basemapItem.getItemData().then(function(basemapItemData) {
_getBasemapSpatialReference(basemapItem, basemapItemData)
.then(lang.hitch(this, function(basemapSpatialRef) {
var basemapLayers = [];
if (curMapSpatialRefObj &&
basemapSpatialRef &&
SRUtils.isSameSR(curMapSpatialRefObj.wkid, basemapSpatialRef.wkid)) {
basemapLayers = array.map(basemapItemData.baseMap.baseMapLayers,
function(layerData) {
//return {url: layerData.url};
return layerData;
});
// var thumbnailUrl = null;
// if (basemapItem.thumbnailUrl) {
// var queryIndex = basemapItem.thumbnailUrl.indexOf('?');
// if (queryIndex !== -1) {
// thumbnailUrl = basemapItem.thumbnailUrl.slice(0, queryIndex);
// } else {
// thumbnailUrl = basemapItem.thumbnailUrl;
// }
// }
var thumbnailUrl = _getStanderdUrl(basemapItem.thumbnailUrl);
def.resolve({
layers: basemapLayers,
title: basemapItem.title,
thumbnailUrl: thumbnailUrl,
spatialReference: basemapSpatialRef
});
} else {
def.resolve({});
}
}));
});
});
all(deferreds).then(function(basemaps) {
var filteredBasemaps = array.filter(basemaps, function(basemap) {
if (basemap && basemap.title) {
return true;
} else {
return false;
}
}, this);
defRet.resolve(filteredBasemaps);
});
}, function(err) {
defRet.reject(err);
});
return defRet;
};
mo.compareSameBasemap = function(basemap1, basemap2) {
var basemap1Layers = basemap1.layers,
basemap2Layers = basemap2.layers;
var basemap1UrlStr = '',
basemap2UrlStr = '';
basemap1UrlStr = _allLayersUrlStr(basemap1Layers);
basemap2UrlStr = _allLayersUrlStr(basemap2Layers);
return (basemap1UrlStr === basemap2UrlStr);
};
mo.compareSameBasemapByOrder = function(basemap1, basemap2) {
var basemap1Layers = basemap1.layers,
basemap2Layers = basemap2.layers;
if (basemap1Layers.length !== basemap2Layers.length) {
return false;
}
for (var i = 0; i < basemap1Layers.length; i++) {
// compare type;
if (!basemap1Layers[i].type) {
basemap1Layers[i].type = null;
}
if (!basemap2Layers[i].type) {
basemap2Layers[i].type = null;
}
if (basemap1Layers[i].type !== basemap2Layers[i].type) {
return false;
} else if (!basemap1Layers[i].type && !basemap1Layers[i].type) {
// two layers do not have type property;
// compare url;
if (!basemap1Layers[i].url) {
basemap1Layers[i].url = null;
}
if (!basemap2Layers[i].url) {
basemap2Layers[i].url = null;
}
if (_getStanderdUrl(basemap1Layers[i].url) !== _getStanderdUrl(basemap2Layers[i].url)) {
return false;
}
}
}
return true;
};
mo.isBingMap = function(basemap) {
if (!basemap || !basemap.layers) {
return false;
}
for (var i = 0; i < basemap.layers.length; i++) {
if (basemap.layers[i].type === "BingMapsAerial" ||
basemap.layers[i].type === "BingMapsRoad" ||
basemap.layers[i].type === "BingMapsHybrid") {
return true;
}
}
return false;
};
mo.isNoUrlLayerMap = function(basemap) {
if (!basemap || !basemap.layers) {
return false;
}
for (var i = 0; i < basemap.layers.length; i++) {
if (basemap.layers[i].type === "BingMapsAerial" ||
basemap.layers[i].type === "BingMapsRoad" ||
basemap.layers[i].type === "BingMapsHybrid" ||
basemap.layers[i].type === "OpenStreetMap") {
return true;
}
}
return false;
};
mo.getToken = function(portalUrl) {
var portal = portalUtils.getPortal(portalUrl);
portal.updateCredential();
return portal.credential ? "?token=" + portal.credential.token : "";
};
mo.removeUrlQuery = function(url) {
return _removeUrlQurey(url);
};
mo.getStanderdUrl = function(url) {
return _getStanderdUrl(url);
};
// remove url query and delete the last '/'.
function _removeUrlQurey(url) {
if (!url) {
return null;
}
var queryIndex = url.indexOf('?');
var httpIndex = url.search(/http|\/\//);
if (httpIndex === 0 && queryIndex !== -1) {
return url.slice(0, queryIndex).replace(/\/*$/g, '');
} else {
return url;
}
}
// standerd url
// * no protocol
// * no query
function _getStanderdUrl(url) {
if (!url) {
return null;
} else {
return basePortalUrlUtils.removeProtocol(_removeUrlQurey(url));
}
}
function _allLayersUrlStr(layers) {
var urlArray = [];
array.forEach(layers, function(layer) {
urlArray.push(layer.url);
});
urlArray.sort();
var allLayersUrlStr = '';
var i = 0;
for (i = 0; i < urlArray.length; i++) {
var queryIndex = urlArray[i].indexOf('?');
var url = '';
if (queryIndex !== -1) {
url = urlArray[i].slice(0, queryIndex);
} else {
url = urlArray[i];
}
allLayersUrlStr += url;
}
return allLayersUrlStr.replace(/\ /, '');
}
function _isBasemapLayersHasTypeProperty(basemapLayers) {
var hasTypeProperty = false;
if (basemapLayers) {
for (var i = 0; i < basemapLayers.length; i++) {
if (basemapLayers[i].type) {
hasTypeProperty = true;
break;
}
}
}
return hasTypeProperty;
}
function _getBasemapSpatialReference(basemapItem, basemapItemData) {
var basemapSpatialRef = null;
var spatialRefDef = new Deferred();
if (basemapItemData.spatialReference || basemapItem.spatialReference) {
basemapSpatialRef = basemapItemData.spatialReference || basemapItem.spatialReference;
spatialRefDef.resolve(basemapSpatialRef);
} else if (basemapItem.owner && basemapItem.owner.indexOf("esri_") === 0) {
spatialRefDef.resolve({
wkid: "102100"
});
} else if (_isBasemapLayersHasTypeProperty(basemapItemData.baseMap.baseMapLayers)) {
spatialRefDef.resolve({
wkid: "102100"
});
} else if (basemapItemData.baseMap.baseMapLayers && basemapItemData.baseMap.baseMapLayers[0]) {
esriRequest({
url: basemapItemData.baseMap.baseMapLayers[0].url,
content: {
f: 'json'
},
handleAs: 'json',
callbackParamName: 'callback'
}).then(lang.hitch(this, function(res) {
if (res.spatialReference) {
basemapSpatialRef = res.spatialReference;
} else {
basemapSpatialRef = null;
}
spatialRefDef.resolve(basemapSpatialRef);
}), lang.hitch(this, function() {
// return null if can not get spatialReference;
spatialRefDef.resolve(null);
}));
} else {
// return null if can not get spatialReference;
spatialRefDef.resolve(null);
}
return spatialRefDef;
}
function getWebMapsFromBasemapGalleryGroup(portalUrl) {
var def = new Deferred();
//var portalUrl = this.appConfig.portalUrl;
portalUtils.getPortalSelfInfo(portalUrl).then(lang.hitch(this, function(portalSelf) {
var portal = portalUtils.getPortal(portalUrl);
//title:"ArcGIS Online Basemaps" AND owner:esri_en
var groupQueryString = portalSelf.basemapGalleryGroupQuery;
var ownerIndex = groupQueryString.indexOf('esri_');
if (ownerIndex >= 0) {
/*global dojoConfig*/
var oldOwner = groupQueryString.slice(ownerIndex, ownerIndex + 7);
var newOwner = 'esri_' + dojoConfig.locale.slice(0, 2);
groupQueryString = groupQueryString.replace(oldOwner, newOwner);
}
portal.queryGroups({
f: 'json',
q: groupQueryString
}).then(lang.hitch(this, function(response) {
if (response.results.length > 0) {
var group = response.results[0];
var queryStr = portalUtils.webMapQueryStr;
group.queryItems({
start: 1,
num: 100,
f: 'json',
q: queryStr
}).then(lang.hitch(this, function(searchResponse) {
def.resolve(searchResponse);
}), lang.hitch(this, function() {
def.reject();
}));
} else {
def.reject();
}
}), lang.hitch(this, function() {
def.reject();
}));
}), lang.hitch(this, function() {
def.reject();
}));
return def;
}
return mo;
});