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: '© <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.