// Leaflet extensions
L.LatLngBounds.include({
getSouthLat: function () {
return this._southWest.lat;
},
getWestLng: function () {
return this._southWest.lng;
},
getNorthLat: function () {
return this._northEast.lat;
},
getEastLng: function () {
return this._northEast.lng;
},
toBBOX: function () {
var decimal = 6;
var mult = Math.pow(10, decimal);
var xmin = Math.round(this.getWestLng() * mult) / mult;
var ymin = Math.round(this.getSouthLat() * mult) / mult;
var xmax = Math.round(this.getEastLng() * mult) / mult;
var ymax = Math.round(this.getNorthLat() * mult) / mult;
return xmin + "," + ymin + "," + xmax + "," + ymax;
},
getSize: function () {
return (this._northEast.lat - this._southWest.lat) *
(this._northEast.lng - this._southWest.lng);
}
});
L.Bounds.include({
getWidth: function () {
return this.max.x - this.min.x;
},
getHeight: function () {
return this.max.y - this.min.y;
}
});
var map;
var layers = [
{
klass: L.OSM.Mapnik,
attribution: "",
keyid: "mapnik",
layerCode: "M",
name: I18n.t("javascripts.map.base.standard")
},
{
klass: L.OSM.CycleMap,
attribution: "Tiles courtesy of Andy Allan",
keyid: "cyclemap",
layerCode: "C",
name: I18n.t("javascripts.map.base.cycle_map")
},
{
klass: L.OSM.TransportMap,
attribution: "Tiles courtesy of Andy Allan",
keyid: "transportmap",
layerCode: "T",
name: I18n.t("javascripts.map.base.transport_map")
},
{
klass: L.OSM.MapQuestOpen,
attribution: "Tiles courtesy of MapQuest ",
keyid: "mapquest",
layerCode: "Q",
name: I18n.t("javascripts.map.base.mapquest")
}
];
function createMap(divName, options) {
options = $.extend({zoomControl: false, panZoomControl: true, layerControl: true}, options);
map = L.map(divName, $.extend({}, options, {panControl: false, zoomsliderControl: false, maxZoom: 18}));
if (map.attributionControl) {
map.attributionControl.setPrefix(''); // For tmcw
}
if (options.panZoomControl) {
new L.Control.Pan().addTo(map);
new L.Control.Zoomslider({stepHeight: 7}).addTo(map);
}
var layersControl = L.control.layers();
if (options.layerControl) {
layersControl.addTo(map);
}
for (var i = 0; i < layers.length; i++) {
layers[i].layer = new (layers[i].klass)(layers[i]);
if (i == 0) {
layers[i].layer.addTo(map);
}
layersControl.addBaseLayer(layers[i].layer, layers[i].name);
}
$("#" + divName).on("resized", function () {
map.invalidateSize();
});
return map;
}
function getArrowIcon() {
return L.icon({
iconUrl: <%= asset_path('arrow.png').to_json %>,
iconSize: [25, 22],
iconAnchor: [22, 20]
});
}
function addMarkerToMap(position, icon, description) {
var marker = L.marker(position, icon ? {icon: icon} : null).addTo(map);
if (description) {
marker.bindPopup(description);
}
return marker;
}
function removeMarkerFromMap(marker) {
map.removeLayer(marker);
}
function addObjectToMap(object, zoom, callback) {
$.ajax({
url: OSM.apiUrl(object),
dataType: "xml",
success: function (xml) {
var layer = new L.OSM.DataLayer(xml, {
style: {
strokeColor: "blue",
strokeWidth: 3,
strokeOpacity: 0.5,
fillOpacity: 0.2,
fillColor: "lightblue",
pointRadius: 6
}
});
var bounds = layer.getBounds();
if (zoom) {
map.fitBounds(bounds);
}
if (callback) {
callback(bounds);
}
layer.addTo(map);
}
});
}
function addBoxToMap(bounds) {
var box = L.rectangle(bounds, {
weight: 2,
color: '#e90',
fillOpacity: 0
});
box.addTo(map);
return box;
}
function getMapBaseLayer() {
for (var i = 0; i < layers.length; i++) {
if (map.hasLayer(layers[i].layer)) {
return layers[i];
}
}
}
function getMapLayers() {
for (var i = 0; i < layers.length; i++) {
if (map.hasLayer(layers[i].layer)) {
return layers[i].layerCode;
}
}
return "";
}
function setMapLayers(layerConfig) {
for (var i = 0; i < layers.length; i++) {
if (~layerConfig.indexOf(layers[i].layerCode)) {
map.addLayer(layers[i].layer);
} else {
map.removeLayer(layers[i].layer);
}
}
}