PageSourceSearch

https://www.ohlsdorf.at/system/statV.1789655742/Javascript/rismap3/rismap3leaflet.js

js ohlsdorf.at collected 2026-09-25 06:55:21 UTC 18,044 bytes, 415 lines download raw bytes

1function rismap3(ctrl) {
2    var self = this;
3    var curCtrl = ctrl;
4    var baseLayers = {};
5    var overlayLayers = {};
6    var lStreetMap;
7    var lSatellite;
8    var lBasemapat;
9    var lBasemapatgrau;
10    var lBasemapathighdpi;
11    var lBasemapatorthofoto;
12    var oStreets;
13    var mymap;
14    var geoRefMarker;
15    // Function to merge objects (similar to $.extend() in jQuery)
16    const mergeObjects = (target, ...sources) => {
17        sources.forEach(source => {
18            for (let key in source) {
19                if (source.hasOwnProperty(key)) {
20                    target[key] = source[key];
21                }
22            }
23        });
24        return target;
25    };
26
27    var options = {
28        "clickMessage": "Klicken Sie hier um die Karte zu laden",
29        "showbasemap": true,
30        "sgvgisenableorthophoto": false,
31        "sgvgisenableaddress": false,
32        "sgvgisenablestreet": false,
33        "streetslbl": "Strassen",
34        "addresslbl": "Adressen",
35        "orthofotolbl": "Orthofoto"
36    };
37
38    // Merge options with rismap3_global_settings
39    options = mergeObjects(options, rismap3_global_settings);
40
41    // Assuming ctrl is the element reference, fetching its map3_settings
42    if (ctrl.dataset.map3_settings) {
43        options = mergeObjects(options, JSON.parse(ctrl.dataset.map3_settings));
44    }
45
46    function loadScript(url, id) {
47        return new Promise(function (resolve, reject) {
48            if (id && document.getElementById(id)) { resolve(); return; }
49            var s = document.createElement("script");
50            if (id) s.id = id;
51            s.type = "text/javascript";
52            s.src = url;
53            s.onload = resolve;
54            s.onerror = function () { reject(new Error("Failed to load " + url)); };
55            document.getElementsByTagName("head")[0].appendChild(s);
56        });
57    }
58
59    function loadCss(url, id) {
60        if (id && document.getElementById(id)) return;
61        var l = document.createElement("link");
62        if (id) l.id = id;
63        l.rel = "stylesheet";
64        l.type = "text/css";
65        l.href = url;
66        document.getElementsByTagName("head")[0].appendChild(l);
67    }
68
69    this.loadLeaflet = function () {
70        if (typeof (L) === 'undefined') {
71            loadCss("https://cdnfile.gem2go.page/cdnstatic/system/Javascript/leaflet/leaflet.css", "leafletCSS");
72            loadScript("https://cdnfile.gem2go.page/cdnstatic/system/Javascript/leaflet/leaflet.js", "leafletScript")
73                .then(function () {
74                    loadCss("https://cdn.jsdelivr.net/npm/[email protected]/dist/maplibre-gl.css", "maplibreCss");
75                    return Promise.all([
76                        loadScript(envurl + "system/JavaScript/rismap3/leaflet-providers.js", "leafletProviderScript"),
77                        loadScript("https://cdn.jsdelivr.net/npm/[email protected]/dist/maplibre-gl.js", "maplibreScript")
78                            .then(function () {
79                                // plugin depends on both L and maplibregl being present
80                                return loadScript("https://cdn.jsdelivr.net/npm/@maplibre/[email protected]/leaflet-maplibre-gl.js", "maplibreLeafletScript");
81                            })
82                            .catch(function (err) {
83                                console.warn("MapLibre not available, falling back to raster basemaps.", err);
84                            })
85                    ]);
86                })
87                .then(function () {
88                    self.setUpMap(curCtrl);
89                })
90                .catch(function (err) {
91                    console.error("Leaflet failed to load:", err);
92                });
93        } else {
94            self.setUpMap(curCtrl);
95        }
96    }
97
98    this.updateLatLng = function (lat, lng) {
99        geoRefMarker.setLatLng([lat, lng]);
100        mymap.panTo([lat, lng]);
101    }
102
103    this.getMarker = function () {
104        return geoRefMarker;
105    }
106
107    this.setUpMap = function (ctrl) {
108        if (options.sgvgisenableaddress) {
109            var buergernetzUrl = 'https://geoservices.buergernetz.bz.it/mapproxy/512-p_bz-BaseMap/ows?' +
110                'layer=Basemap-Standard-Background' + // <-- No street names / labels
111                '&style=default' +
112                '&tilematrixset=EPSG_3857_512' +
113                '&Service=WMTS' +
114                '&Request=GetTile' +
115                '&Version=1.0.0' +
116                '&Format=image/jpeg' +
117                '&TileMatrix={z}' +
118                '&TileCol={x}' +
119                '&TileRow={y}';
120
121            lStreetMap = L.tileLayer(buergernetzUrl, {
122                tileSize: 512,
123                zoomOffset: -1,
124                minZoom: 0,
125                maxZoom: 24,
126                attribution: '&copy; <a href="https://buergernetz.bz.it">Bürgernetz Südtirol</a>'
127            });
128        } else {
129            lStreetMap = L.tileLayer.provider('OpenStreetMap.Mapnik');
130        }
131        lSatellite = L.tileLayer.provider('Esri.WorldImagery');
132
133        baseLayers = {
134            'Map': lStreetMap,
135            'Satellite': lSatellite,
136        };
137
138        overlayLayers = {
139        };
140
141        // --- Basemap: support vector styles via MapLibre if style URLs provided ---
142        if (options.showbasemap) {
143            rismap3_global_settings.basemapat_vector_styles = {
144                basemap: envurl + "system/JavaScript/rismap3/styles/basemap-style.json",
145                grau: null,   // see below
146                highdpi: envurl + "system/JavaScript/rismap3/styles/basemap-style.json",
147                orthofoto: null    // stays raster
148            };
149            var basemapVectorStyles = {};
150            if (rismap3_global_settings && rismap3_global_settings.basemapat_vector_styles) {
151                basemapVectorStyles = rismap3_global_settings.basemapat_vector_styles;
152            }
153            if (options.basemapat_vector_styles) {
154                basemapVectorStyles = mergeObjects(basemapVectorStyles, options.basemapat_vector_styles);
155            }
156
157            var maplibreAvailable = (typeof maplibregl !== 'undefined' && typeof L !== 'undefined' && typeof L.maplibreGL === 'function');
158
159            if (maplibreAvailable && (basemapVectorStyles.basemap || basemapVectorStyles.grau || basemapVectorStyles.highdpi || basemapVectorStyles.orthofoto)) {
160                // Create MapLibre-backed layers where styles are provided; otherwise fall back to raster provider
161                if (basemapVectorStyles.basemap) {
162                    lBasemapat = L.maplibreGL({
163                        style: basemapVectorStyles.basemap,
164                        interactive: false,
165                        attribution: 'Datenquelle: <a href="https://basemap.at">basemap.at</a>'
166                    });
167                } else {
168                    lBasemapat = L.tileLayer.provider('BasemapAT.basemap');
169                }
170
171                if (basemapVectorStyles.grau) {
172                    lBasemapatgrau = L.maplibreGL({ style: basemapVectorStyles.grau, interactive: false });
173                } else {
174                    lBasemapatgrau = L.tileLayer.provider('BasemapAT.grau');
175                }
176
177                if (basemapVectorStyles.highdpi) {
178                    lBasemapathighdpi = L.maplibreGL({ style: basemapVectorStyles.highdpi, interactive: false });
179                } else {
180                    lBasemapathighdpi = L.tileLayer.provider('BasemapAT.highdpi');
181                }
182
183                // orthophoto often remains raster; if a vector style provided, use it; otherwise keep raster WMTS fallback
184                if (basemapVectorStyles.orthofoto) {
185                    lBasemapatorthofoto = L.maplibreGL({ style: basemapVectorStyles.orthofoto, interactive: false });
186                } else {
187                    lBasemapatorthofoto = L.tileLayer.provider('BasemapAT.orthofoto');
188                }
189
190            } else {
191                // No vector styles configured or MapLibre not loaded: preserve existing raster providers (safe fallback)
192                lBasemapat = L.tileLayer.provider('BasemapAT.basemap');
193                lBasemapatgrau = L.tileLayer.provider('BasemapAT.grau');
194                lBasemapathighdpi = L.tileLayer.provider('BasemapAT.highdpi');
195                lBasemapatorthofoto = L.tileLayer.provider('BasemapAT.orthofoto');
196            }
197
198            baseLayers = mergeObjects(baseLayers, {
199                'Basemap.at': lBasemapat,
200                'Basemap.at (GRAU)': lBasemapatgrau,
201                'Basemap.at (HIGHDPI)': lBasemapathighdpi,
202                'Basemap.at (ORTHOFOTO)': lBasemapatorthofoto,
203            });
204            oStreets = L.tileLayer.provider('BasemapAT.overlay');
205            overlayLayers = mergeObjects(overlayLayers, {
206                'Streets': oStreets
207            });
208        }
209
210        mymap = L.map(ctrl);
211        if (options.sgvgisenableorthophoto) {
212            var orthFoto = L.tileLayer('https://geoservices.buergernetz.bz.it/mapproxy/p_bz-Orthoimagery/ows?layer=Aerial-2023-RGB&style=default&tilematrixset=EPSG_3857&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/png&TileMatrix={z}&TileCol={x}&TileRow={y}', {});
213            baseLayers[options.orthofotolbl] = orthFoto;
214        }
215
216        if (options.sgvgisenableaddress) {
217            var wmsLayer = L.tileLayer.wms('https://geoservices3.civis.bz.it/geoserver/gvcc-Address/wms?', {
218                styles: 'Addresses-Web',
219                layers: 'Addresses',
220                format: 'image/png',
221                transparent: true
222            });
223            overlayLayers[options.addresslbl] = wmsLayer;
224            if (rismap3_global_settings.defaultlayer === 'hybrid' || rismap3_global_settings.defaultlayer === 'roadmap')
225                wmsLayer.addTo(mymap);
226        }
227
228        if (options.sgvgisenablestreet) {
229            var lang = 'language=' + (rissprachid == '1' ? 'de' : 'it');
230            var streetLayer = L.tileLayer.wms('https://geoservices1.civis.bz.it/geoserver/p_bz-TransportNetwork/ows?' + lang, {
231                layers: 'LinksSequences-Rendering,LinksSequences-Labels',
232                styles: 'LinksSequences-Rendering,LinksSequences-Labels',
233                format: 'image/png8',
234                version: '1.3.1',
235                transparent: true,
236            });
237            overlayLayers[options.streetslbl] = streetLayer;
238            if (rismap3_global_settings.defaultlayer === 'hybrid' || rismap3_global_settings.defaultlayer === 'roadmap')
239                streetLayer.addTo(mymap);
240        }
241
242        //Erweiterung für L3G0 werden mehrere Marker als Array übergeben werden diese hier ausgegeben.
243        const map3_pin_DataArray = JSON.parse(ctrl.dataset.map3_pin);
244        if (Array.isArray(map3_pin_DataArray)) {
245            if (map3_pin_DataArray.length > 0) {
246                console.log(map3_pin_DataArray.length > 0)
247                let fitBoundsRange = [];
248                let fitBoundsCoordinates;
249                for (let i = 0; i < map3_pin_DataArray.length; i++) {
250                    var loc = map3_pin_DataArray[i];
251                    mymap.setView([loc.lat, loc.lng], 10);
252                    var marker = L.marker([loc.lat, loc.lng], { draggable: (loc.geocoding === "true") }).addTo(mymap);
253                    geoRefMarker = marker;
254
255                    fitBoundsCoordinates = [
256                        loc.lat,
257                        loc.lng
258                    ]
259                    fitBoundsRange.push(fitBoundsCoordinates);
260                    if (loc.description) {
261                        var description = loc.description;
262                        var content = "<strong>" + description.titel + "</strong>";
263                        if (description.link != 'false') {
264                            var furtherLink = document.createElement('a');
265                            var linkText = "Weitere Informationen"
266                            content = "<strong>" + description.titel + "</strong><br /><p>" + description.text + "</p><br /><a href='" + description.link + "' title='" + linkText + "' target='_blank'>" + linkText + "</a>";
267                        }
268                        marker.bindPopup(content);
269                    }
270                }
271
272                mymap.fitBounds(fitBoundsRange);
273
274            } else {
275
276                var noGeoCordinatesText = "Leider sind keine Geokoordinaten für diese Einträge vorhanden."
277                var noGeoCordinatesAlert = document.createElement("div");
278                noGeoCordinatesAlert.innerHTML += noGeoCordinatesText;
279                noGeoCordinatesAlert.classList += "alert alert-warning"
280
281                var alertIcon = document.createElement("span");
282                alertIcon.classList += "fa-light fa-circle-exclamation me-2";
283
284                document.querySelector(".bemContainer--mapPlaceholder").replaceWith(noGeoCordinatesAlert);
285                noGeoCordinatesAlert.prepend(alertIcon);
286            }
287
288        } else {
289
290            var loc = JSON.parse(ctrl.dataset.map3_pin)
291            mymap.setView([loc.lat, loc.lng], rismap3_global_settings.zoom);
292            var marker = L.marker([loc.lat, loc.lng], { draggable: (loc.geocoding === "true") }).addTo(mymap);
293            geoRefMarker = marker;
294
295            if (loc.description) {
296                var description = loc.description;
297                var content = "<strong>" + description.titel + "</strong>";
298                if (description.strasse)
299                    content += "<br />" + description.strasse + " ";
300                if (description.hnr)
301                    content += description.hnr;
302                if (description.plz || description.ortname)
303                    content += "<br />";
304                if (description.plz)
305                    content += description.plz;
306                if (description.ortname) {
307                    if (description.plz)
308                        content += " ";
309                    content += description.ortname;
310                }
311                marker.bindPopup(content);
312            }
313        }
314
315        layerControl = L.control.layers(baseLayers, overlayLayers, {
316            collapsed: true
317        }).addTo(mymap);
318
319        switch (rismap3_global_settings.defaultlayer) {
320            case 'roadmap':
321                lStreetMap.addTo(mymap);
322                break;
323            case 'hybrid':
324            case 'satellite':
325                lSatellite.addTo(mymap);
326                break;
327            case 'basemap':
328                lBasemapat.addTo(mymap);
329                silenceMissingSprites(lBasemapat);
330                break;
331            case 'grau':
332                lBasemapatgrau.addTo(mymap);
333                break;
334            case 'hidpi':
335                lBasemapathighdpi.addTo(mymap);
336                break;
337            case 'ortho':
338                lBasemapatorthofoto.addTo(mymap);
339                break;
340        }
341
342        if (rismap3_global_settings.defaultlayer === 'hybrid')
343            oStreets.addTo(mymap);
344
345        // ResizeObserver einbauen, um Map bei Größenänderung neu zu zentrieren
346        if (typeof ResizeObserver !== 'undefined') {
347            const mapContainer = ctrl;
348            const resizeObserver = new ResizeObserver(() => {
349                mymap.invalidateSize();
350                if (typeof fitBoundsRange !== 'undefined' && fitBoundsRange.length > 0) {
351                    mymap.fitBounds(fitBoundsRange);
352                } else if (geoRefMarker) {
353                    mymap.setView(geoRefMarker.getLatLng());
354                }
355            });
356            resizeObserver.observe(mapContainer);
357        } else {
358            window.addEventListener('resize', () => {
359                mymap.invalidateSize();
360                if (typeof fitBoundsRange !== 'undefined' && fitBoundsRange.length > 0) {
361                    mymap.fitBounds(fitBoundsRange);
362                } else if (geoRefMarker) {
363                    mymap.setView(geoRefMarker.getLatLng());
364                }
365            });
366        }
367        mymap.on('baselayerchange', function (e) { silenceMissingSprites(e.layer); });
368    }
369
370    this.initialiseRisMap3 = function () {
371        if (options.clicktostart === false) {
372            self.loadLeaflet();
373        } else {
374            self.addLeafletClickDiv(curCtrl);
375        }
376    }
377
378    this.addLeafletClickDiv = function (ctrl) {
379        var clkDiv = document.createElement('div');
380        clkDiv.className = 'mfClickToLoadWrapper';
381        var innerDiv = document.createElement('div');
382        innerDiv.className = 'mfClickToLoad';
383        innerDiv.innerHTML = "<p class='mapIcon'></p><p>" + options.clickMessage + "</p>";
384        clkDiv.appendChild(innerDiv);
385
386        clkDiv.addEventListener('click', function () {
387            ctrl.removeChild(clkDiv);
388            self.loadLeaflet();
389        });
390
391        ctrl.appendChild(clkDiv);
392    }
393}
394
395function initializeMaps() {
396    var mapdivs = document.querySelectorAll(".rismap3_map, .bemContainer--mapPlaceholder");
397    mapdivs.forEach(function (mapdiv) {
398        var lf = new rismap3(mapdiv);
399        lf.initialiseRisMap3();
400    });
401}
402
403document.addEventListener("DOMContentLoaded", initializeMaps);
404
405function silenceMissingSprites(maplibreLayer) {
406    if (!maplibreLayer || typeof maplibreLayer.getMaplibreMap !== 'function') return;
407    var m = maplibreLayer.getMaplibreMap();
408    if (!m || m.__missingSpriteHandler) return;
409    m.__missingSpriteHandler = true;
410    m.on('styleimagemissing', function (e) {
411        if (!m.hasImage(e.id)) {
412            m.addImage(e.id, { width: 1, height: 1, data: new Uint8Array(4) });
413        }
414    });
415}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.