]> git.openstreetmap.org Git - rails.git/blobdiff - app/assets/javascripts/index/export.js
Port map key to new UI
[rails.git] / app / assets / javascripts / index / export.js
index b014e8cb2acdacc61e52eb77b9de97a58f5499ab..3715cbf9970a57a185dafe3c8f0ee1c68f832722 100644 (file)
@@ -11,20 +11,24 @@ $(document).ready(function () {
   }
 
   function startExport(sidebarHtml) {
-    var marker, rectangle;
+    var marker;
 
-    var drawHandler = new L.Rectangle.Draw(map, {title: I18n.t('export.start_rjs.drag_a_box')});
-    map.on('draw:rectangle-created', endDrag);
+    var locationFilter = new L.LocationFilter({
+      enableButton: false,
+      adjustButton: false
+    }).addTo(map);
+
+    locationFilter.on("change", filterChanged);
 
     map.on("moveend", mapMoved);
-    map.on("layeradd layerremove", htmlUrlChanged);
+    map.on("baselayerchange", htmlUrlChanged);
 
     $("#sidebar_title").html(I18n.t('export.start_rjs.export'));
     $("#sidebar_content").html(sidebarHtml);
 
     $("#maxlat,#minlon,#maxlon,#minlat").change(boundsChanged);
 
-    $("#drag_box").click(startDrag);
+    $("#drag_box").click(enableFilter);
 
     $("#add_marker").click(startMarker);
 
@@ -34,7 +38,7 @@ $(document).ready(function () {
 
     openSidebar();
 
-    if (map.hasLayer(layers[0].layer)) {
+    if (getMapBaseLayerId() == "mapnik") {
       $("#format_mapnik").prop("checked", true);
     }
 
@@ -46,14 +50,12 @@ $(document).ready(function () {
     $("#sidebar").one("closed", function () {
       $("body").removeClass("site-export").addClass("site-index");
 
-      clearBox();
+      map.removeLayer(locationFilter);
       clearMarker();
 
       map.off("moveend", mapMoved);
-      map.off("layeradd layerremove", htmlUrlChanged);
-      map.off('draw:rectangle-created', endDrag);
-
-      drawHandler.disable();
+      map.off("baselayerchange", htmlUrlChanged);
+      locationFilter.off("change", filterChanged);
     });
 
     function getBounds() {
@@ -61,6 +63,16 @@ $(document).ready(function () {
                             L.latLng($("#maxlat").val(), $("#maxlon").val()));
     }
 
+    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 getMercatorBounds() {
       var bounds = getBounds();
       return L.bounds(L.CRS.EPSG3857.project(bounds.getSouthWest()),
@@ -70,36 +82,25 @@ $(document).ready(function () {
     function boundsChanged() {
       var bounds = getBounds();
 
-      map.off("moveend", mapMoved);
       map.fitBounds(bounds);
+      locationFilter.setBounds(bounds);
 
-      clearBox();
-      drawBox(bounds);
-
+      enableFilter();
       validateControls();
       mapnikSizeChanged();
     }
 
-    function startDrag() {
-      $("#drag_box").html(I18n.t('export.start_rjs.drag_a_box'));
-
-      clearBox();
-      drawHandler.enable();
-    }
-
-    function endDrag(e) {
-      var bounds = e.rect.getBounds();
-
-      map.off("moveend", mapMoved);
-      setBounds(bounds);
-      drawBox(bounds);
-      validateControls();
+    function enableFilter() {
+      if (!locationFilter.getBounds().isValid()) {
+        locationFilter.setBounds(map.getBounds().pad(-0.2));
+      }
 
-      $("#drag_box").html(I18n.t('export.start_rjs.manually_select'));
+      $("#drag_box").hide();
+      locationFilter.enable();
     }
 
-    function transformComplete(event) {
-      setBounds(event.feature.geometry.bounds);
+    function filterChanged() {
+      setBounds(locationFilter.getBounds());
       validateControls();
     }
 
@@ -142,34 +143,24 @@ $(document).ready(function () {
     }
 
     function mapMoved() {
-      setBounds(map.getBounds());
-      validateControls();
+      if (!locationFilter.isEnabled()) {
+        setBounds(map.getBounds());
+        validateControls();
+      }
     }
 
     function setBounds(bounds) {
       var toPrecision = zoomPrecision(map.getZoom());
 
-      $("#minlon").val(toPrecision(bounds.getWestLng()));
-      $("#minlat").val(toPrecision(bounds.getSouthLat()));
-      $("#maxlon").val(toPrecision(bounds.getEastLng()));
-      $("#maxlat").val(toPrecision(bounds.getNorthLat()));
+      $("#minlon").val(toPrecision(bounds.getWest()));
+      $("#minlat").val(toPrecision(bounds.getSouth()));
+      $("#maxlon").val(toPrecision(bounds.getEast()));
+      $("#maxlat").val(toPrecision(bounds.getNorth()));
 
       mapnikSizeChanged();
       htmlUrlChanged();
     }
 
-    function clearBox() {
-      if (rectangle) {
-        map.removeLayer(rectangle);
-      }
-      rectangle = null;
-    }
-
-    function drawBox(bounds) {
-      rectangle = L.rectangle(bounds);
-      rectangle.addTo(map);
-    }
-
     function validateControls() {
       var bounds = getBounds();
 
@@ -195,9 +186,9 @@ $(document).ready(function () {
 
     function htmlUrlChanged() {
       var bounds = getBounds();
-      var layerName = getMapBaseLayer().keyid;
+      var layerName = getMapBaseLayerId();
 
-      var url = "http://" + OSM.SERVER_URL + "/export/embed.html?bbox=" + bounds.toBBOX() + "&layer=" + layerName;
+      var url = "http://" + OSM.SERVER_URL + "/export/embed.html?bbox=" + bounds.toBBoxString() + "&layer=" + layerName;
       var markerUrl = "";
 
       if ($("#marker_lat").val() && $("#marker_lon").val()) {
@@ -241,7 +232,7 @@ $(document).ready(function () {
       }
 
       if ($("#format_mapnik").prop("checked")) {
-//        $("#mapnik_scale").val(roundScale(map.getScale()));
+        $("#mapnik_scale").val(getScale());
         $("#export_mapnik").show();
 
         mapnikSizeChanged();
@@ -263,16 +254,16 @@ $(document).ready(function () {
     }
 
     function maxMapnikScale() {
-      var bounds = getMercatorBounds();
+      var size = getMercatorBounds().getSize();
 
-      return Math.floor(Math.sqrt(bounds.getWidth() * bounds.getHeight() / 0.3136));
+      return Math.floor(Math.sqrt(size.x * size.y / 0.3136));
     }
 
     function mapnikImageSize(scale) {
-      var bounds = getMercatorBounds();
+      var size = getMercatorBounds().getSize();
 
-      return {w: Math.round(bounds.getWidth() / scale / 0.00028),
-              h: Math.round(bounds.getHeight() / scale / 0.00028)};
+      return {w: Math.round(size.x / scale / 0.00028),
+              h: Math.round(size.y / scale / 0.00028)};
     }
 
     function roundScale(scale) {