]> git.openstreetmap.org Git - rails.git/commitdiff
When downloading image, allow other map styles
authornertc <davidtsiklauri7@gmail.com>
Wed, 10 Jul 2024 10:04:58 +0000 (14:04 +0400)
committernertc <davidtsiklauri7@gmail.com>
Mon, 15 Jul 2024 15:08:49 +0000 (19:08 +0400)
app/assets/javascripts/leaflet.share.js
app/controllers/export_controller.rb
config/locales/en.yml
test/controllers/export_controller_test.rb

index b92d7079686d41aea396554a270bf96b91946a25..40ba020e6c36ac0ac82cd6367a934cf9cf24897d 100644 (file)
@@ -160,6 +160,7 @@ L.OSM.share = function (options) {
     $("<div>")
       .appendTo($form)
       .attr("class", "row mb-3")
+      .attr("id", "mapnik_scale_row")
       .append($("<label>")
         .attr("for", "mapnik_scale")
         .attr("class", "col-auto col-form-label")
@@ -195,7 +196,7 @@ L.OSM.share = function (options) {
             .attr("class", "form-check-input")
             .bind("change", toggleFilter))));
 
-    ["minlon", "minlat", "maxlon", "maxlat"].forEach(function (name) {
+    ["minlon", "minlat", "maxlon", "maxlat", "lat", "lon"].forEach(function (name) {
       $("<input>")
         .attr("id", "mapnik_" + name)
         .attr("name", name)
@@ -204,11 +205,33 @@ L.OSM.share = function (options) {
     });
 
     $("<input>")
+      .attr("id", "map_format")
       .attr("name", "format")
       .attr("value", "mapnik")
       .attr("type", "hidden")
       .appendTo($form);
 
+    $("<input>")
+      .attr("id", "map_zoom")
+      .attr("name", "zoom")
+      .attr("value", map.getZoom())
+      .attr("type", "hidden")
+      .appendTo($form);
+
+    $("<input>")
+      .attr("id", "map_width")
+      .attr("name", "width")
+      .attr("value", 0)
+      .attr("type", "hidden")
+      .appendTo($form);
+
+    $("<input>")
+      .attr("id", "map_height")
+      .attr("name", "height")
+      .attr("value", 0)
+      .attr("type", "hidden")
+      .appendTo($form);
+
     var csrf_param = $("meta[name=csrf-param]").attr("content"),
         csrf_token = $("meta[name=csrf-token]").attr("content");
 
@@ -219,6 +242,7 @@ L.OSM.share = function (options) {
       .appendTo($form);
 
     var args = {
+      layer: "<span id=\"mapnik_image_layer\"></span>",
       width: "<span id=\"mapnik_image_width\"></span>",
       height: "<span id=\"mapnik_image_height\"></span>"
     };
@@ -381,11 +405,34 @@ L.OSM.share = function (options) {
         $("#mapnik_scale").val(scale);
       }
 
-      $("#mapnik_image_width").text(Math.round(size.x / scale / 0.00028));
-      $("#mapnik_image_height").text(Math.round(size.y / scale / 0.00028));
+      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 layer = map.getMapBaseLayerId();
+      const layerKeys = new Map([
+        ["mapnik", "standard"],
+        ["cyclemap", "cycle_map"],
+        ["transportmap", "transport_map"]
+      ]);
 
-      if (map.getMapBaseLayerId() === "mapnik") {
+      $("#mapnik_image_layer").text(layerKeys.has(layer) ? I18n.t(`javascripts.map.base.${layerKeys.get(layer)}`) : "");
+      $("#map_format").val(layer);
+
+      $("#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();
index cddc97b6883e13044601c5b4a3a24b1f84d83f74..5a2b159ef6f991b96992367b3fd69e7c074de5a2 100644 (file)
@@ -13,19 +13,27 @@ class ExportController < ApplicationController
   # When the user clicks 'Export' we redirect to a URL which generates the export download
   def finish
     bbox = BoundingBox.from_lon_lat_params(params)
-    format = params[:format]
+    style = params[:format]
+    format = params[:mapnik_format]
 
-    case format
+    case style
     when "osm"
       # redirect to API map get
       redirect_to :controller => "api/map", :action => "index", :bbox => bbox
 
     when "mapnik"
       # redirect to a special 'export' cgi script
-      format = params[:mapnik_format]
       scale = params[:mapnik_scale]
 
       redirect_to "https://render.openstreetmap.org/cgi-bin/export?bbox=#{bbox}&scale=#{scale}&format=#{format}", :allow_other_host => true
+    when "cyclemap", "transportmap"
+      zoom = params[:zoom]
+      lat = params[:lat]
+      lon = params[:lon]
+      width = params[:width]
+      height = params[:height]
+
+      redirect_to "https://tile.thunderforest.com/static/#{style[..-4]}/#{lon},#{lat},#{zoom}/#{width}x#{height}.#{format}?apikey=#{Settings.thunderforest_key}", :allow_other_host => true
     end
   end
 
index 4c743b03353487a3db53bb9de125f29d8e596eac..92ca501b4027621ef506b1b9a83aa005a6dd8369 100644 (file)
@@ -3111,14 +3111,14 @@ en:
       custom_dimensions: "Set custom dimensions"
       format: "Format:"
       scale: "Scale:"
-      image_dimensions: "Image will show standard layer at %{width} x %{height}"
+      image_dimensions: "Image will show %{layer} layer at %{width} x %{height}"
       download: "Download"
       short_url: "Short URL"
       include_marker: "Include marker"
       center_marker: "Center map on marker"
       paste_html: "Paste HTML to embed in website"
       view_larger_map: "View Larger Map"
-      only_standard_layer: "Only the standard layer can be exported as an image"
+      only_standard_layer: "Only the Standard, Cycle Map and Transport layers can be exported as an image"
     embed:
       report_problem: "Report a problem"
     key:
index e7539b41e560aabd3cfc5d0e4a63bb003a095141..64d5a686615e9d23988f759865eb872643b8bc4a 100644 (file)
@@ -28,6 +28,20 @@ class ExportControllerTest < ActionDispatch::IntegrationTest
     assert_redirected_to "https://render.openstreetmap.org/cgi-bin/export?bbox=0.0,50.0,1.0,51.0&scale=12&format=test"
   end
 
+  ###
+  # test the finish action for cyclemap images
+  def test_finish_cyclemap
+    post export_finish_path(:minlon => 0, :minlat => 50, :maxlon => 1, :maxlat => 51, :format => "cyclemap", :mapnik_scale => 12, :mapnik_format => "png", :zoom => 17, :lat => 1, :lon => 2, :width => 400, :height => 300)
+    assert_redirected_to "https://tile.thunderforest.com/static/cycle/2,1,17/400x300.png?apikey=#{Settings.thunderforest_key}"
+  end
+
+  ###
+  # test the finish action for transport images
+  def test_finish_transport
+    post export_finish_path(:minlon => 0, :minlat => 50, :maxlon => 1, :maxlat => 51, :format => "transportmap", :mapnik_scale => 12, :mapnik_format => "png", :zoom => 17, :lat => 1, :lon => 2, :width => 400, :height => 300)
+    assert_redirected_to "https://tile.thunderforest.com/static/transport/2,1,17/400x300.png?apikey=#{Settings.thunderforest_key}"
+  end
+
   ##
   # test the embed action
   def test_embed