Merge pull request #1236 from jumpinjackie/master

MapGuide untiled map support
This commit is contained in:
Tom Payne
2013-12-06 08:59:57 -08:00
5 changed files with 227 additions and 0 deletions

View File

@@ -0,0 +1 @@
@exportSymbol ol.source.MapGuide

View File

@@ -0,0 +1,125 @@
goog.provide('ol.source.MapGuide');
goog.require('goog.object');
goog.require('goog.uri.utils');
goog.require('ol.ImageUrlFunction');
goog.require('ol.extent');
goog.require('ol.source.Image');
/**
* @constructor
* @extends {ol.source.Image}
* @param {ol.source.MapGuideOptions} options Options.
*/
ol.source.MapGuide = function(options) {
var imageUrlFunction = goog.isDef(options.url) ?
ol.ImageUrlFunction.createFromParamsFunction(
options.url,
options.params,
goog.bind(this.getUrl, this)) :
ol.ImageUrlFunction.nullImageUrlFunction;
/**
* @private
* @type {number}
*/
this.metersPerUnit_ = options.metersPerUnit;
/**
* @private
* @type {boolean}
*/
this.useOverlay_ = options.useOverlay;
/**
* @private
* @type {ol.Image}
*/
this.image_ = null;
goog.base(this, {
extent: options.extent,
projection: options.projection,
resolutions: options.resolutions,
imageUrlFunction: imageUrlFunction
});
};
goog.inherits(ol.source.MapGuide, ol.source.Image);
/**
* @inheritDoc
*/
ol.source.MapGuide.prototype.getImage =
function(extent, resolution, projection) {
resolution = this.findNearestResolution(resolution);
var image = this.image_;
if (!goog.isNull(image) &&
image.getResolution() == resolution &&
ol.extent.containsExtent(image.getExtent(), extent)) {
return image;
}
extent = extent.slice();
ol.extent.scaleFromCenter(extent, 1.0); //this.ratio_);
var width = (extent[2] - extent[0]) / resolution;
var height = (extent[3] - extent[1]) / resolution;
var size = [width, height];
this.image_ = this.createImage(extent, resolution, size, projection);
return this.image_;
};
/**
* @param {ol.Extent} extent The map extents
* @param {ol.Size} size the viewport size
* @return {number} The computed map scale
*/
ol.source.MapGuide.prototype.getScale = function(extent, size) {
var mcsW = extent[2] - extent[0];
var mcsH = extent[3] - extent[1];
var devW = size[0];
var devH = size[1];
var dpi = 96;
var mpu = this.metersPerUnit_;
var mpp = 0.0254 / dpi;
var scale = 0.0;
if (devH * mcsW > devW * mcsH)
scale = mcsW * mpu / (devW * mpp); //width-limited
else
scale = mcsH * mpu / (devH * mpp); //height-limited
return scale;
};
/**
* @param {string} baseUrl The mapagent url.
* @param {Object.<string, string|number>} params Request parameters.
* @param {ol.Extent} extent Extent.
* @param {ol.Size} size Size.
* @param {ol.proj.Projection} projection Projection.
* @return {string} The mapagent map image request URL.
*/
ol.source.MapGuide.prototype.getUrl =
function(baseUrl, params, extent, size, projection) {
var scale = this.getScale(extent, size);
var baseParams = {
'OPERATION': this.useOverlay_ ? 'GETDYNAMICMAPOVERLAYIMAGE' : 'GETMAPIMAGE',
'VERSION': '2.0.0',
'LOCALE': 'en',
'CLIENTAGENT': 'ol.source.MapGuide source',
'CLIP': '1',
'SETDISPLAYDPI': 96,
'SETDISPLAYWIDTH': Math.round(size[0]),
'SETDISPLAYHEIGHT': Math.round(size[1]),
'SETVIEWSCALE': scale,
'SETVIEWCENTERX': (extent[0] + extent[2]) / 2,
'SETVIEWCENTERY': (extent[1] + extent[3]) / 2
};
goog.object.extend(baseParams, params);
return goog.uri.utils.appendParamsFromMap(baseUrl, baseParams);
};