/**
* BeNomad BeMap JavaScript API - Map - Leaflet
*/
//bemap.require('leaflet.js');
/**
* @classdesc
* Base class for Leaflet.
* @public
* @constructor
* @extends {bemap.Map}
* @param {bemap.Context} context BeMap-JS-API Context.
* @param {string} target HTML element.
* @param options.
*/
bemap.LeafletMap = function(context, target, options) {
/**
* @protected
*/
this.target = target;
bemap.Map.call(this, context, options);
/**
* @protected
*/
this.native = L.map(target).setView([0, 0], 2);
};
bemap.inherits(bemap.LeafletMap, bemap.Map);
/**
* Add a layer to the Leaflet map.
* @public
* @param {bemap.Layer} layer
* @param {object} options
* @return {bemap.LeafletMap} this
*/
bemap.LeafletMap.prototype.addLayer = function(layer, options) {
if (layer !== null && bemap.inheritsof(layer, bemap.Layer)) {
if (bemap.inheritsof(layer, bemap.BemapLayer)) {
layer.native = L.tileLayer.wms(this.ctx.getBaseUrl() + 'wms?', {
appid: this.ctx.login,
appcode: this.ctx.password,
minZoom: 2,
maxZoom: 20,
'geoserver': layer.geoserver ? layer.geoserver : this.ctx.getGeoserver(),
'layers': layer.layers ? layer.layers : 'default',
'styles': layer.styles ? layer.styles : '',
'tiled': true,
'TRANSPARENT': layer.transparent === true ? true : false,
format: layer.format ? layer.format : 'image/png'
});
} else if (bemap.inheritsof(layer, bemap.WmsLayer)) {
layer.native = L.tileLayer.wms(layer.url, {
minZoom: 2,
maxZoom: 20,
'geoserver': layer.geoserver ? layer.geoserver : this.ctx.getGeoserver(),
'layers': layer.layers ? layer.layers : 'default',
'styles': layer.styles ? layer.styles : '',
'tiled': true,
'TRANSPARENT': layer.transparent === true ? true : false,
format: layer.format ? layer.format : 'image/png'
});
} else if (bemap.inheritsof(layer, bemap.OsmLayer)) {
console.warn("TODO OsmLayer");
} else if (bemap.inheritsof(layer, bemap.VectorLayer)) {
layer.native = L.layerGroup();
} else if (bemap.inheritsof(layer, bemap.ClusterLayer)) {
layer.native = new L.MarkerClusterGroup({
showCoverageOnHover: false
//Icon Style
/*iconCreateFunction: function(cluster) {
return L.divIcon({
html: cluster.getChildCount(),
className: 'mycluster',
iconSize: null
});
}*/
});
} else {
console.warn("Unsupport layer");
}
if (layer.native !== null) {
// TODO
//bemap.OlMap.prototype._addOwnToProperties(layer);
layer.native.addTo(this.native);
bemap.Map.prototype.addLayer.call(this, layer);
}
}
if (layer.map === null) {
layer.map = this;
}
return this;
};
/**
* Move map to new coordinate.
* @public
* @param {double} lon Longitude in degres decimal (WGS84).
* @param {double} lat Latitude in degres decimal (WGS84).
* @param {int} zoom Zoom level (optional).
* @param {Object} options Options (optional).
* @param {String} options.animate Enable the animation.
* @param {String} options.fly Enable the animation (same as animate).
* @return {bemap.LeafletMap} this
*/
bemap.LeafletMap.prototype.move = function(lon, lat, zoom, options) {
if (zoom) {
this.native.setView([lat, lon], zoom);
} else {
this.native.setView([lat, lon]);
}
return this;
};
/**
* Set the center and the zoom of the map to fit the bounding box.
* @param {bemap.BoundingBox} boundingBox the bounding box to fit.
* @return {bemap.LeafletMap} this.
*/
bemap.LeafletMap.prototype.moveToBoundingBox = function(boundingBox, options) {
if (boundingBox && bemap.inheritsof(boundingBox, bemap.BoundingBox) && boundingBox.maxLon && boundingBox.maxLat && boundingBox.minLon && boundingBox.minLat) {
var ext = L.latLngBounds(
L.latLng(boundingBox.minLat, boundingBox.minLon),
L.latLng(boundingBox.maxLat, boundingBox.maxLon)
);
if (options && (options.animate || options.fly)) {
this.native.flyToBounds(ext);
} else {
this.native.fitBounds(ext);
}
}
return this;
};
/**
* Zoom on map, set new zoom level.
* @public
* @param {int} zoom Zoom level (optional).
* @param {Object} options Options (optional).
* @return {bemap.LeafletMap} this
*/
bemap.LeafletMap.prototype.zoom = function(zoom, options) {
this.native.setZoom(zoom);
return this;
};
/**
* Get current zoom level of map.
* @public
* @return {int} current zoom level of map.
*/
bemap.LeafletMap.prototype.getZoom = function() {
return this.native.getZoom();
};
/**
* Refresh map.
* @public
* @abstract
* @param {Object} options Options (optional).
* @return {bemap.LeafletMap} this
*/
bemap.LeafletMap.prototype.refresh = function(options) {
this.native.invalidateSize();
return this;
};
/**
* Refresh all objects from a layer.
* @public
* @param {bemap.Layer} layer the layer object to refresh.
* @return {bemap.LeafletMap} this
*/
bemap.LeafletMap.prototype.refreshLayer = function(layer) {
if (layer !== null && bemap.inheritsof(layer, bemap.Layer)) {
layer.native.redraw();
}
return this;
};
/**
* Remove all objects from a layer.
* @public
* @param {bemap.Layer} layer the layer object to clear.
* @return {bemap.LeafletMap} this
*/
bemap.LeafletMap.prototype.clearLayer = function(layer) {
if (layer !== null && bemap.inheritsof(layer, bemap.Layer)) {
layer.native.clearLayers();
}
return this;
};
/**
* Set the visibility of the layer.
* @public
* @param {bemap.Layer} layer the layer of wich to set the visibility.
* @param {boolean} visible.
* @return {bemap.LeafletMap} return this.
*/
bemap.LeafletMap.prototype.visibleLayer = function(layer, visible) {
if (visible !== null && layer !== null && layer.map !== null && bemap.inheritsof(layer, bemap.Layer)) {
if (visible) {
layer.native.addTo(this.native);
} else {
layer.native.remove();
}
layer.visible = visible;
}
return this;
};
/**
* Remove a layer from the map.
* @param {bemap.Layer} layer layer to remove from the map.
* @return {bemap.LeafletMap} this.
*/
bemap.LeafletMap.prototype.removeLayer = function(layer) {
if (layer !== null && bemap.inheritsof(layer, bemap.Layer)) {
this.native.removeLayer(layer.native);
layer.map = null;
}
return this;
};
/**
* Set the listner when an specified eventType occur on bemap.LeafletMap.
* @public
* @param {bemap.Map.EventType} eventType Event type.
* @param {function} callback Function will be called when the specified eventType is occur.
* @param {object} options options.
* @return {bemap.Listener} listner.
*/
bemap.LeafletMap.prototype.on = function(eventType, callback, options) {
var opts = options ? options : {};
var nativeListener = this.native.on(eventType, function(evt) {
var mapEvent = new bemap.MapEvent({
native: evt,
bemapObject: this,
x: evt.containerPoint ? evt.containerPoint.x : undefined,
y: evt.containerPoint ? evt.containerPoint.y : undefined,
coordinate: evt.latlng ? new bemap.Coordinate(evt.latlng.lng, evt.latlng.lat) : undefined,
properties: options,
map: this
});
callback(mapEvent);
});
var listener = new bemap.Listener({
native: nativeListener,
callback: callback,
key: eventType,
bemapObject: this
});
return listener;
};
/**
* Remove listener.
* @protected
* @param {bemap.Listener} listener Function will be called when the specified eventType is occur.
* @param {object} options Options.
* @return {bemap.LeafletMap} this.
*/
bemap.LeafletMap.prototype.removeListener = function(listener, options) {
if (listener && bemap.inheritsof(listener, bemap.Listener) && listener.bemapObject) {
this.native.off(listener.native);
}
return this;
};
/**
* Get the center of the map in bemap.Coordinate.
* @return {bemap.Coordinate} the center of the map.
*/
bemap.LeafletMap.prototype.getCenter = function() {
var center = this.native.getCenter();
return new bemap.Coordinate(center.lng, center.lat);
};
/**
* Get the limits of the map on the current zoom.
* @return {bemap.BoundingBox} the bounding box containing the limits.
*/
bemap.LeafletMap.prototype.getBoundingBox = function() {
var bounds = this.native.getBounds();
var box = new bemap.BoundingBox(bounds.getWest(), bounds.getSouth(), bounds.getEast(), bounds.getNorth());
return box;
};