Merge pull request #384 from stesie/add-overpass-layer-re
Add (Overpass based) POI layer
This commit is contained in:
commit
f3d4b23726
76 changed files with 1562 additions and 59 deletions
|
|
@ -1,4 +1,7 @@
|
|||
BR.LayersConfig = L.Class.extend({
|
||||
overpassFrontend: new OverpassFrontend(
|
||||
(BR.conf.overpassBaseUrl || '//overpass-api.de/api/interpreter').replace('?data=', '')
|
||||
),
|
||||
defaultBaseLayers: BR.confLayers.defaultBaseLayers,
|
||||
defaultOverlays: BR.confLayers.defaultOverlays,
|
||||
legacyNameToIdMap: BR.confLayers.legacyNameToIdMap,
|
||||
|
|
@ -7,6 +10,8 @@ BR.LayersConfig = L.Class.extend({
|
|||
|
||||
initialize: function (map) {
|
||||
this._map = map;
|
||||
this._overpassLoadingIndicator = new BR.Message('overpass_loading_indicator', { alert: false });
|
||||
this._overpassActiveRequestCount = 0;
|
||||
|
||||
this._addLeafletProvidersLayers();
|
||||
this._customizeLayers();
|
||||
|
|
@ -169,6 +174,37 @@ BR.LayersConfig = L.Class.extend({
|
|||
return result;
|
||||
},
|
||||
|
||||
_showOverpassLoadingIndicator: function () {
|
||||
this._overpassActiveRequestCount++;
|
||||
this._overpassLoadingIndicator.showInfo(i18next.t('layers.overpass-loading-indicator'));
|
||||
},
|
||||
|
||||
_hideOverpassLoadingIndicator: function () {
|
||||
if (--this._overpassActiveRequestCount === 0) {
|
||||
this._overpassLoadingIndicator.hide();
|
||||
}
|
||||
},
|
||||
|
||||
createOverpassLayer: function (query) {
|
||||
return Object.assign(
|
||||
new OverpassLayer({
|
||||
overpassFrontend: this.overpassFrontend,
|
||||
query: query,
|
||||
minZoom: 12,
|
||||
feature: {
|
||||
title: '{{ tags.name }}',
|
||||
body:
|
||||
'<table class="overpass-tags">{% for k, v in tags %}{% if k[:5] != "addr:" %}<tr><th>{{ k }}</th><td>{% if k matches "/email/" %}<a href="mailto:{{ v }}">{{ v }}</a>{% elseif v matches "/^http/" %}<a href="{{ v }}">{{ v }}</a>{% elseif v matches "/^www/" %}<a href="http://{{ v }}">{{ v }}</a>{% else %}{{ v }}{% endif %}</td></tr>{% endif %}{% endfor %}</table>',
|
||||
markerSymbol: null,
|
||||
},
|
||||
}),
|
||||
{
|
||||
onLoadStart: this._showOverpassLoadingIndicator.bind(this),
|
||||
onLoadEnd: this._hideOverpassLoadingIndicator.bind(this),
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
createLayer: function (layerData) {
|
||||
var props = layerData.properties;
|
||||
var url = props.url;
|
||||
|
|
@ -251,6 +287,8 @@ BR.LayersConfig = L.Class.extend({
|
|||
if (props.subdomains) {
|
||||
layer.subdomains = props.subdomains;
|
||||
}
|
||||
} else if (props.dataSource === 'OverpassAPI') {
|
||||
layer = this.createOverpassLayer(props.query);
|
||||
} else {
|
||||
// JOSM
|
||||
var josmUrl = url;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ BR.Layers = L.Class.extend({
|
|||
if (BR.Util.localStorageAvailable()) {
|
||||
var layers = JSON.parse(localStorage.getItem('map/customLayers'));
|
||||
for (a in layers) {
|
||||
this._addLayer(a, layers[a].layer, layers[a].isOverlay);
|
||||
this._addLayer(a, layers[a].layer, layers[a].isOverlay, layers[a].dataSource);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -13,14 +13,22 @@ BR.Layers = L.Class.extend({
|
|||
_loadTable: function () {
|
||||
var layersData = [];
|
||||
for (layer in this._customLayers) {
|
||||
var isOverlay = this._customLayers[layer].isOverlay;
|
||||
layersData.push([
|
||||
layer,
|
||||
this._customLayers[layer].layer._url,
|
||||
isOverlay
|
||||
? i18next.t('sidebar.layers.table.type_overlay')
|
||||
: i18next.t('sidebar.layers.table.type_layer'),
|
||||
]);
|
||||
if (this._customLayers[layer].dataSource === 'OverpassAPI') {
|
||||
layersData.push([
|
||||
layer,
|
||||
this._customLayers[layer].layer.options.query,
|
||||
i18next.t('sidebar.layers.table.type_overpass_query'),
|
||||
]);
|
||||
} else {
|
||||
var isOverlay = this._customLayers[layer].isOverlay;
|
||||
layersData.push([
|
||||
layer,
|
||||
this._customLayers[layer].layer._url,
|
||||
isOverlay
|
||||
? i18next.t('sidebar.layers.table.type_overlay')
|
||||
: i18next.t('sidebar.layers.table.type_layer'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
if (this._layersTable != null) {
|
||||
this._layersTable.destroy();
|
||||
|
|
@ -51,6 +59,7 @@ BR.Layers = L.Class.extend({
|
|||
|
||||
L.DomUtil.get('custom_layers_add_base').onclick = L.bind(this._addBaseLayer, this);
|
||||
L.DomUtil.get('custom_layers_add_overlay').onclick = L.bind(this._addOverlay, this);
|
||||
L.DomUtil.get('custom_layers_add_overpass').onclick = L.bind(this._addOverpassQuery, this);
|
||||
L.DomUtil.get('custom_layers_remove').onclick = L.bind(this._remove, this);
|
||||
|
||||
this._loadLayers();
|
||||
|
|
@ -83,10 +92,10 @@ BR.Layers = L.Class.extend({
|
|||
}
|
||||
},
|
||||
|
||||
_addFromInput: function (isOverlay) {
|
||||
_addFromInput: function (isOverlay, dataSource) {
|
||||
var layer_name = L.DomUtil.get('layer_name').value;
|
||||
var layer_url = L.DomUtil.get('layer_url').value;
|
||||
if (layer_name.length > 0 && layer_url.length > 0) this._addLayer(layer_name, layer_url, isOverlay);
|
||||
if (layer_name.length > 0 && layer_url.length > 0) this._addLayer(layer_name, layer_url, isOverlay, dataSource);
|
||||
},
|
||||
|
||||
_addBaseLayer: function (evt) {
|
||||
|
|
@ -95,18 +104,28 @@ BR.Layers = L.Class.extend({
|
|||
_addOverlay: function (evt) {
|
||||
this._addFromInput(true);
|
||||
},
|
||||
_addOverpassQuery: function (evt) {
|
||||
this._addFromInput(true, 'OverpassAPI');
|
||||
},
|
||||
|
||||
_addLayer: function (layerName, layerUrl, isOverlay) {
|
||||
_addLayer: function (layerName, layerUrl, isOverlay, dataSource) {
|
||||
if (layerName in this._layers) return;
|
||||
|
||||
if (layerName in this._customLayers) return;
|
||||
|
||||
try {
|
||||
var layer = L.tileLayer(layerUrl);
|
||||
var layer;
|
||||
|
||||
if (dataSource === 'OverpassAPI') {
|
||||
layer = this._layersControl.layersConfig.createOverpassLayer(layerUrl);
|
||||
} else {
|
||||
layer = L.tileLayer(layerUrl);
|
||||
}
|
||||
|
||||
this._customLayers[layerName] = {
|
||||
layer: layer,
|
||||
isOverlay: isOverlay,
|
||||
dataSource: dataSource,
|
||||
};
|
||||
|
||||
if (isOverlay) {
|
||||
|
|
@ -128,6 +147,18 @@ BR.Layers = L.Class.extend({
|
|||
localStorage.setItem(
|
||||
'map/customLayers',
|
||||
JSON.stringify(this._customLayers, function (k, v) {
|
||||
if (v === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (v.dataSource === 'OverpassAPI') {
|
||||
return {
|
||||
dataSource: 'OverpassAPI',
|
||||
isOverlay: true,
|
||||
layer: v.layer.options.query,
|
||||
};
|
||||
}
|
||||
|
||||
// dont write Leaflet.Layer in localStorage; simply keep the URL
|
||||
return v._url || v;
|
||||
})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue