From e8016e04e899dc115c7af374fe91e68b7b0e9254 Mon Sep 17 00:00:00 2001 From: Marwin Hochfelsner <50826859+hlfan@users.noreply.github.com> Date: Sat, 1 Aug 2026 06:25:08 +0200 Subject: [PATCH] Rework map url getters --- app/assets/javascripts/leaflet.map.js | 54 +++++++++++++++---------- app/assets/javascripts/leaflet.share.js | 25 ++++-------- 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/app/assets/javascripts/leaflet.map.js b/app/assets/javascripts/leaflet.map.js index ba12d7fbb..785ebcf37 100644 --- a/app/assets/javascripts/leaflet.map.js +++ b/app/assets/javascripts/leaflet.map.js @@ -138,22 +138,20 @@ L.OSM.Map = L.Map.extend({ }, getUrl: function (marker) { - const params = {}; + const search = new URLSearchParams(); if (marker && this.hasLayer(marker)) { const { lat, lng } = OSM.cropLocation(marker.getLatLng(), this.getZoom()); - params.mlat = lat; - params.mlon = lng; + search.set("mlat", lat); + search.set("mlon", lng); } - let url = location.protocol + "//" + OSM.SERVER_URL + "/"; - const query = new URLSearchParams(params), + const protocol = location.protocol, + hostname = OSM.SERVER_URL, + pathname = "/", hash = OSM.formatHash(this); - if (query) url += "?" + query; - if (hash) url += hash; - - return url; + return `${protocol}//${hostname}${pathname}${search.toString() ? "?" + search : ""}${hash || ""}`; }, getShortUrl: function (marker) { @@ -167,17 +165,19 @@ L.OSM.Map = L.Map.extend({ // and drops the last 4 bits of the full 64 bit Morton code. c1 = interlace(x >>> 17, y >>> 17), c2 = interlace((x >>> 2) & 0x7fff, (y >>> 2) & 0x7fff); - let str = location.protocol + "//" + location.hostname.replace(/^www\.openstreetmap\.org/i, "osm.org") + "/go/"; + const protocol = location.protocol, + hostname = location.hostname.replace(/^www\.openstreetmap\.org/i, "osm.org"); + let pathname = "/go/"; for (let i = 0; i < Math.ceil((zoom + 8) / 3.0) && i < 5; ++i) { const digit = (c1 >> (24 - (6 * i))) & 0x3f; - str += char_array.charAt(digit); + pathname += char_array[digit]; } for (let i = 5; i < Math.ceil((zoom + 8) / 3.0); ++i) { const digit = (c2 >> (24 - (6 * (i - 5)))) & 0x3f; - str += char_array.charAt(digit); + pathname += char_array[digit]; } - for (let i = 0; i < ((zoom + 8) % 3); ++i) str += "-"; + for (let i = 0; i < ((zoom + 8) % 3); ++i) pathname += "-"; // Called to interlace the bits in x and y, making a Morton code. function interlace(x, y) { @@ -194,27 +194,39 @@ L.OSM.Map = L.Map.extend({ return (interlaced_x << 1) | interlaced_y; } - const params = new URLSearchParams(); + const search = new URLSearchParams(); const layers = this.getLayersCode().replace("M", ""); if (layers) { - params.set("layers", layers); + search.set("layers", layers); } if (marker && this.hasLayer(marker)) { - params.set("m", ""); + search.set("m", ""); } if (this._object) { - params.set(this._object.type, this._object.id); + search.set(this._object.type, this._object.id); } - const query = params.toString(); - if (query) { - str += "?" + query; + return `${protocol}//${hostname}${pathname}${search.toString() ? "?" + search : ""}`; + }, + + getEmbedUrl: function (marker) { + const protocol = OSM.SERVER_PROTOCOL + ":", + hostname = OSM.SERVER_URL, + pathname = "/export/embed.html"; + const search = new URLSearchParams({ + bbox: this.getBounds().toBBoxString(), + layer: this.getMapBaseLayerId() + }); + + if (this.hasLayer(marker)) { + const latLng = marker.getLatLng().wrap(); + search.set("marker", latLng.lat + "," + latLng.lng); } - return str; + return `${protocol}//${hostname}${pathname}?${search}`; }, getGeoUri: function (marker) { diff --git a/app/assets/javascripts/leaflet.share.js b/app/assets/javascripts/leaflet.share.js index 5896eed9e..b0c19098b 100644 --- a/app/assets/javascripts/leaflet.share.js +++ b/app/assets/javascripts/leaflet.share.js @@ -120,7 +120,6 @@ L.OSM.share = function (options) { function update() { const layer = map.getMapBaseLayer(); const canEmbed = Boolean(layer && layer.options.canEmbed); - let bounds = map.getBounds(); $("#link_marker") .prop("checked", map.hasLayer(marker)); @@ -130,20 +129,12 @@ L.OSM.share = function (options) { // Link / Embed - $("#short_input").val(map.getShortUrl(marker)); - $("#long_input").val(map.getUrl(marker)); - $("#short_link").attr("href", map.getShortUrl(marker)); $("#long_link").attr("href", map.getUrl(marker)); + $("#short_link").attr("href", map.getShortUrl(marker)); + $("#embed_link").attr("href", map.getEmbedUrl(marker)); - const params = new URLSearchParams({ - bbox: bounds.toBBoxString(), - layer: map.getMapBaseLayerId() - }); - - if (map.hasLayer(marker)) { - const latLng = marker.getLatLng().wrap(); - params.set("marker", latLng.lat + "," + latLng.lng); - } + $("#long_input").val($("#long_link").prop("href")); + $("#short_input").val($("#short_link").prop("href")); if (!canEmbed && $("#nav-embed").hasClass("active")) { bootstrap.Tab.getOrCreateInstance($("#long_link")).show(); @@ -155,9 +146,9 @@ L.OSM.share = function (options) { $("#embed_html").val( "
" + - "" + + "" + escapeHTML(OSM.i18n.t("javascripts.share.view_larger_map")) + ""); // Geo URI @@ -168,9 +159,7 @@ L.OSM.share = function (options) { // Image - if (locationFilter.isEnabled()) { - bounds = locationFilter.getBounds(); - } + const bounds = locationFilter.isEnabled() ? locationFilter.getBounds() : map.getBounds(); let scale = $("#mapnik_scale").val(); const size = L.bounds(L.CRS.EPSG3857.project(bounds.getSouthWest()), -- 2.47.3