X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/411748a48ccf366a371558060a0eb6367f0f41d3..c71209507bbc80c3e90006e67b93388b61fd0336:/app/assets/javascripts/index/export.js diff --git a/app/assets/javascripts/index/export.js b/app/assets/javascripts/index/export.js index 46cd105e4..417dfabd3 100644 --- a/app/assets/javascripts/index/export.js +++ b/app/assets/javascripts/index/export.js @@ -1,4 +1,4 @@ -$(document).ready(function () { +function initializeExport(map) { $("#exportanchor").click(function (e) { $.ajax({ url: $(this).data('url'), success: function (sidebarHtml) { startExport(sidebarHtml); @@ -11,10 +11,14 @@ $(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("baselayerchange", htmlUrlChanged); @@ -24,7 +28,7 @@ $(document).ready(function () { $("#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 (map.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("baselayerchange", htmlUrlChanged); - map.off('draw:rectangle-created', endDrag); - - drawHandler.disable(); + 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 = map.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()) { @@ -212,7 +203,7 @@ $(document).ready(function () { var zoom = map.getBoundsZoom(bounds); - var layers = getMapLayers(); + var layers = map.getLayersCode(); var text = I18n.t('export.start_rjs.view_larger_map'); var escaped = []; @@ -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) { @@ -290,4 +281,4 @@ $(document).ready(function () { validateControls(); } } -}); +}