Merge pull request #727 from zod/geojson

Support remote GeoJSON layers
This commit is contained in:
Norbert Renner 2023-05-08 17:29:08 +02:00 committed by GitHub
commit c715d2bab1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 2 deletions

View file

@ -348,6 +348,15 @@ BR.LayersConfig = L.Class.extend({
} }
}, },
createGeoJsonLayer: function (props) {
const layer = L.geoJSON(undefined, BR.Track.getGeoJsonOptions());
fetch(props.url).then(async (response) => {
const geojson = await response.json();
layer.addData(geojson);
});
return layer;
},
createLayer: function (layerData) { createLayer: function (layerData) {
var props = layerData.properties; var props = layerData.properties;
var url = props.url; var url = props.url;
@ -436,6 +445,8 @@ BR.LayersConfig = L.Class.extend({
layer = this.createOpenStreetMapNotesLayer(); layer = this.createOpenStreetMapNotesLayer();
} else if (props.type === 'mvt') { } else if (props.type === 'mvt') {
layer = this.createMvtLayer(props, options); layer = this.createMvtLayer(props, options);
} else if (props.type === 'geojson') {
layer = this.createGeoJsonLayer(props);
} else { } else {
// JOSM // JOSM
var josmUrl = url; var josmUrl = url;

View file

@ -10,13 +10,27 @@ BR.Track = {
* @returns {Object} to pass as `options` parameter to `L.geoJson` * @returns {Object} to pass as `options` parameter to `L.geoJson`
*/ */
getGeoJsonOptions: function (layersControl) { getGeoJsonOptions: function (layersControl) {
// https://github.com/mapbox/simplestyle-spec/tree/master/1.1.0
const styleMapping = [
['stroke', 'color'],
['stroke-width', 'weight'],
['stroke-opacity', 'opacity'],
['fill', 'fillColor'],
['fill-opacity', 'fillOpacity'],
];
return { return {
style: function (geoJsonFeature) { style: function (geoJsonFeature) {
var currentLayerId = layersControl.getActiveBaseLayer().layer.id; var currentLayerId = layersControl?.getActiveBaseLayer().layer.id;
return { const featureStyle = {
color: currentLayerId === 'cyclosm' ? 'yellow' : 'blue', color: currentLayerId === 'cyclosm' ? 'yellow' : 'blue',
weight: 4, weight: 4,
}; };
for (const [simpleStyle, leafletStyle] of styleMapping) {
if (geoJsonFeature?.properties?.[simpleStyle]) {
featureStyle[leafletStyle] = geoJsonFeature.properties[simpleStyle];
}
}
return featureStyle;
}, },
interactive: false, interactive: false,
filter: function (geoJsonFeature) { filter: function (geoJsonFeature) {