L.OSM.share = function (options) { var control = L.OSM.sidebarPane(options, "share", "javascripts.share.title", "javascripts.share.title"), marker = L.marker([0, 0], { draggable: true }), locationFilter = new L.LocationFilter({ enableButton: false, adjustButton: false }); control.onAddPane = function (map, button, $ui) { // Link / Embed $("#content").addClass("overlay-right-sidebar"); var $linkSection = $("
") .attr("class", "text-body-secondary") .text(I18n.t("javascripts.share.paste_html"))); // Geo URI var $geoUriSection = $("
") .attr("class", "text-body-secondary") .html(I18n.t("javascripts.share.image_dimensions", args)) .appendTo($form); $("") .attr("type", "submit") .attr("class", "btn btn-primary") .attr("value", I18n.t("javascripts.share.download")) .appendTo($form); locationFilter .on("change", update) .addTo(map); marker.on("dragend", movedMarker); map.on("move", movedMap); map.on("moveend layeradd layerremove", update); $ui .on("show", shown) .on("hide", hidden); function shown() { $("#mapnik_scale").val(getScale()); update(); } function hidden() { map.removeLayer(marker); map.options.scrollWheelZoom = map.options.doubleClickZoom = true; locationFilter.disable(); update(); } function toggleMarker() { if ($(this).is(":checked")) { marker.setLatLng(map.getCenter()); map.addLayer(marker); map.options.scrollWheelZoom = map.options.doubleClickZoom = "center"; } else { map.removeLayer(marker); map.options.scrollWheelZoom = map.options.doubleClickZoom = true; } update(); } function toggleFilter() { if ($(this).is(":checked")) { locationFilter.setBounds(map.getBounds().pad(-0.2)); locationFilter.enable(); } else { locationFilter.disable(); } update(); } function movedMap() { marker.setLatLng(map.getCenter()); update(); } function movedMarker() { if (map.hasLayer(marker)) { map.off("move", movedMap); map.on("moveend", updateOnce); map.panTo(marker.getLatLng()); } } function updateOnce() { map.off("moveend", updateOnce); map.on("move", movedMap); update(); } function escapeHTML(string) { var htmlEscapes = { "&": "&", "<": "<", ">": ">", "\"": """, "'": "'" }; return string === null ? "" : String(string).replace(/[&<>"']/g, function (match) { return htmlEscapes[match]; }); } function update() { var canEmbed = map.getMapBaseLayerId() !== "tracestracktopo"; var bounds = map.getBounds(); $("#link_marker") .prop("checked", map.hasLayer(marker)); $("#image_filter") .prop("checked", locationFilter.isEnabled()); // 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)); var params = { bbox: bounds.toBBoxString(), layer: map.getMapBaseLayerId() }; if (map.hasLayer(marker)) { var latLng = marker.getLatLng().wrap(); params.marker = latLng.lat + "," + latLng.lng; } $("#embed_link") .toggleClass("btn-primary", canEmbed) .toggleClass("btn-secondary", !canEmbed) .tooltip(canEmbed ? "disable" : "enable"); if (!canEmbed && $("#embed_link").hasClass("active")) { $("#long_link").click(); } $("#embed_html").val( "" + "" + escapeHTML(I18n.t("javascripts.share.view_larger_map")) + ""); // Geo URI $("#geo_uri") .attr("href", map.getGeoUri(marker)) .html(map.getGeoUri(marker)); // Image if (locationFilter.isEnabled()) { bounds = locationFilter.getBounds(); } var scale = $("#mapnik_scale").val(), size = L.bounds(L.CRS.EPSG3857.project(bounds.getSouthWest()), L.CRS.EPSG3857.project(bounds.getNorthEast())).getSize(), maxScale = Math.floor(Math.sqrt(size.x * size.y / 0.3136)); $("#mapnik_minlon").val(bounds.getWest()); $("#mapnik_minlat").val(bounds.getSouth()); $("#mapnik_maxlon").val(bounds.getEast()); $("#mapnik_maxlat").val(bounds.getNorth()); if (scale < maxScale) { scale = roundScale(maxScale); $("#mapnik_scale").val(scale); } const mapWidth = Math.round(size.x / scale / 0.00028); const mapHeight = Math.round(size.y / scale / 0.00028); $("#mapnik_image_width").text(mapWidth); $("#mapnik_image_height").text(mapHeight); const layerId = map.getMapBaseLayerId(); const layerKeys = new Map([ ["mapnik", "standard"], ["cyclemap", "cycle_map"], ["transportmap", "transport_map"] ]); $("#mapnik_image_layer").text(layerKeys.has(layerId) ? I18n.t(`javascripts.map.base.${layerKeys.get(layerId)}`) : ""); $("#map_format").val(layerId); $("#map_zoom").val(map.getZoom()); $("#mapnik_lon").val(map.getCenter().lng); $("#mapnik_lat").val(map.getCenter().lat); $("#map_width").val(mapWidth); $("#map_height").val(mapHeight); if (["cyclemap", "transportmap"].includes(map.getMapBaseLayerId())) { $("#export-image").show(); $("#mapnik_scale_row").hide(); $("#export-warning").hide(); } else if (map.getMapBaseLayerId() === "mapnik") { $("#export-image").show(); $("#mapnik_scale_row").show(); $("#export-warning").hide(); } else { $("#export-image").hide(); $("#export-warning").show(); } } function select() { $(this).select(); } function getScale() { var bounds = map.getBounds(), centerLat = bounds.getCenter().lat, halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180), meters = halfWorldMeters * (bounds.getEast() - bounds.getWest()) / 180, pixelsPerMeter = map.getSize().x / meters, metersPerPixel = 1 / (92 * 39.3701); return Math.round(1 / (pixelsPerMeter * metersPerPixel)); } function roundScale(scale) { var precision = 5 * Math.pow(10, Math.floor(Math.LOG10E * Math.log(scale)) - 2); return precision * Math.ceil(scale / precision); } }; return control; };