File: src\Poi.js
/**
@module L.PtvLayer
**/
L.PtvLayer = L.PtvLayer || {};
/**
Provides the PTV POI Layer class.
@class L.PtvLayer.Poi
@extends L.PtvLayer.AbstractLayer
@params {XMapClient} client XMapClient object
@params {Object} options The options object
@params {String} [options.format] The image format used in tile requests.
@params {String} [options.beforeSend] Function to be called before sending the request with the request object given as first parameter. The (modified) request object must be returned.
@constructor
**/
L.PtvLayer.Poi = L.PtvLayer.AbstractOverlay.extend({
_layerName: 'default.points-of-interest',
_profile: '',
_condition: '',
_formatterFn: null,
_poiMarkers: null,
initialize: function(client, options) {
L.PtvLayer.AbstractOverlay.prototype.initialize.call(this, client, options);
},
onAdd: function(map) {
L.PtvLayer.AbstractOverlay.prototype.onAdd.call(this, map);
this._poiMarkers = L.layerGroup().addTo(map);
},
onRemove: function(map) {
L.PtvLayer.AbstractOverlay.prototype.onRemove.call(this, map);
map.removeLayer(this._poiMarkers);
},
_getRequestObject: function() {
var req = L.PtvLayer.AbstractOverlay.prototype._getRequestObject.call(this);
req.callerContext.properties[0].value = "ajax-av";
req.callerContext.properties[1].value = "PTV_MERCATOR";
req.layers = [{
$type: "SMOLayer",
name: this._getConfig(),
visible: true,
objectInfos: "FULLGEOMETRY",
configuration: ""
}];
return req;
},
_renderMapCallback: function(resp, error, el) {
this._poiMarkers.clearLayers();
L.PtvLayer.AbstractOverlay.prototype._renderMapCallback.call(this, resp, error, el);
if (error || resp.objects.length === 0) {
return;
}
var formatter = this.getFormatter(), objects = resp.objects[0].objects, myIcon = L.divIcon({
className: 'poi-icon',
iconSize: [20, 20]
});
for (var i = 0; i < objects.length; i++) {
latlng = this._map.containerPointToLatLng([objects[i].pixel.x, objects[i].pixel.y]);
L.marker(latlng, {
icon: myIcon
}).bindPopup(formatter(objects[i].descr)).addTo(this._poiMarkers);
}
},
getFormatter: function() {
if ( typeof this._formatterFn === 'function') {
return this._formatterFn;
} else {
return function(value) {
var desc, poiType;
value = value.split('#')[1];
if (value.indexOf(':') === -1) {
desc = value;
} else {
var values = value.split(':');
desc = values[1];
poiType = values[0];
}
return '<p>' + '<strong>' + desc.replace('$ยง$', '<br/>') + '</strong><br />' + ( poiType ? 'POI Type: ' + poiType : '') + '</p>';
};
}
},
setFormatter: function(fn) {
if ( typeof fn === 'function') {
this._formatterFn = fn;
}
},
_getConfig: function() {
return this._layerName + (this._profile ? '.' + this._profile : '') + ';' + this._condition;
},
setLayerName: function(layerName) {
this._layerName = layerName;
this._update();
},
getLayerName: function() {
return this._layerName;
},
setProfile: function(profile) {
this._profile = profile;
this._update();
},
getProfile: function() {
return this._profile;
},
setCondition: function(condition) {
this._condition = condition;
this._update();
},
getCondition: function() {
return this._condition;
}
});
L.PtvLayer.poi = function(client, options) {
return new L.PtvLayer.Poi(client, options);
};