X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/87e8cf3b5860509c0344cb34ee939ae73ea99c00..2d7e0a397a1b2dbed74f40439c1305b1b48a063e:/app/assets/javascripts/index/export.js diff --git a/app/assets/javascripts/index/export.js b/app/assets/javascripts/index/export.js index ae1871b50..a953920f8 100644 --- a/app/assets/javascripts/index/export.js +++ b/app/assets/javascripts/index/export.js @@ -1,318 +1,84 @@ -function startExport(sidebarHtml) { - var vectors, - box, - transform, - markerLayer, - markerControl, - epsg4326 = new OpenLayers.Projection("EPSG:4326"), - epsg900913 = new OpenLayers.Projection("EPSG:900913"); +OSM.Export = function (map) { + var page = {}; - vectors = new OpenLayers.Layer.Vector("Vector Layer", { - displayInLayerSwitcher: false - }); - map.addLayer(vectors); + var locationFilter = new L.LocationFilter({ + enableButton: false, + adjustButton: false + }).on("change", update); - box = new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, { - handlerOptions: { - sides: 4, - snapAngle: 90, - irregular: true, - persist: true - } - }); - box.handler.callbacks.done = endDrag; - map.addControl(box); - - transform = new OpenLayers.Control.TransformFeature(vectors, { - rotate: false, - irregular: true - }); - transform.events.register("transformcomplete", transform, transformComplete); - map.addControl(transform); - - map.events.register("moveend", map, mapMoved); - map.events.register("changebaselayer", map, htmlUrlChanged); - - $("#sidebar_title").html(I18n.t('export.start_rjs.export')); - $("#sidebar_content").html(sidebarHtml); - - $("#maxlat,#minlon,#maxlon,#minlat").change(boundsChanged); - - $("#drag_box").click(startDrag); - - $("#add_marker").click(startMarker); - - $("#format_osm,#format_mapnik,#format_html").click(formatChanged); - - $("#mapnik_scale").change(mapnikSizeChanged); - - openSidebar(); - - if (map.baseLayer.name == "Mapnik") { - $("#format_mapnik").prop("checked", true); - } - - formatChanged(); - setBounds(map.getExtent()); - - $("body").removeClass("site-index").addClass("site-export"); - - $("#sidebar").one("closed", function () { - $("body").removeClass("site-export").addClass("site-index"); - - clearBox(); - clearMarker(); - map.events.unregister("moveend", map, mapMoved); - map.events.unregister("changebaselayer", map, htmlUrlChanged); - map.removeLayer(vectors); - }); - - function getMercatorBounds() { - var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), - $("#maxlon").val(), $("#maxlat").val()); - - return bounds.transform(epsg4326, epsg900913); + function getBounds() { + return L.latLngBounds( + L.latLng($("#minlat").val(), $("#minlon").val()), + L.latLng($("#maxlat").val(), $("#maxlon").val())); } function boundsChanged() { - var bounds = getMercatorBounds(); - - map.events.unregister("moveend", map, mapMoved); - map.zoomToExtent(bounds); - - clearBox(); - drawBox(bounds); - + var bounds = getBounds(); + map.fitBounds(bounds); + locationFilter.setBounds(bounds); + locationFilter.enable(); validateControls(); - mapnikSizeChanged(); } - function startDrag() { - $("#drag_box").html(I18n.t('export.start_rjs.drag_a_box')); - - clearBox(); - box.activate(); - }; - - function endDrag(bbox) { - var bounds = bbox.getBounds(); - - map.events.unregister("moveend", map, mapMoved); - setBounds(bounds); - drawBox(bounds); - box.deactivate(); - validateControls(); + function enableFilter(e) { + e.preventDefault(); - $("#drag_box").html(I18n.t('export.start_rjs.manually_select')); - } + $("#drag_box").hide(); - function transformComplete(event) { - setBounds(event.feature.geometry.bounds); + locationFilter.setBounds(map.getBounds().pad(-0.2)); + locationFilter.enable(); validateControls(); } - function startMarker() { - $("#add_marker").html(I18n.t('export.start_rjs.click_add_marker')); - - if (!markerLayer) { - markerLayer = new OpenLayers.Layer.Vector("",{ - displayInLayerSwitcher: false, - style: { - externalGraphic: OpenLayers.Util.getImageLocation("marker.png"), - graphicXOffset: -10.5, - graphicYOffset: -25, - graphicWidth: 21, - graphicHeight: 25 - } - }); - map.addLayer(markerLayer); - - markerControl = new OpenLayers.Control.DrawFeature(markerLayer, OpenLayers.Handler.Point); - map.addControl(markerControl); - - markerLayer.events.on({ "featureadded": endMarker }); - } - - markerLayer.destroyFeatures(); - markerControl.activate(); - - return false; - } - - function endMarker(event) { - markerControl.deactivate(); - - $("#add_marker").html(I18n.t('export.start_rjs.change_marker')); - $("#marker_inputs").show(); - - var geom = event.feature.geometry.clone().transform(epsg900913, epsg4326); - - $("#marker_lon").val(geom.x.toFixed(5)); - $("#marker_lat").val(geom.y.toFixed(5)); - - htmlUrlChanged(); - } - - function clearMarker() { - $("#marker_lon,#marker_lat").val(""); - $("#marker_inputs").hide(); - $("#add_marker").html(I18n.t('export.start_rjs.add_marker')); - - if (markerLayer) { - markerControl.destroy(); - markerLayer.destroy(); - markerLayer = null; - markerControl = null; - } - } - - function mapMoved() { - setBounds(map.getExtent()); + function update() { + setBounds(locationFilter.isEnabled() ? locationFilter.getBounds() : map.getBounds()); validateControls(); } function setBounds(bounds) { - var toPrecision = zoomPrecision(map.getZoom()); + var precision = OSM.zoomPrecision(map.getZoom()); + $("#minlon").val(bounds.getWest().toFixed(precision)); + $("#minlat").val(bounds.getSouth().toFixed(precision)); + $("#maxlon").val(bounds.getEast().toFixed(precision)); + $("#maxlat").val(bounds.getNorth().toFixed(precision)); - bounds = bounds.clone().transform(map.getProjectionObject(), epsg4326); - - $("#minlon").val(toPrecision(bounds.left)); - $("#minlat").val(toPrecision(bounds.bottom)); - $("#maxlon").val(toPrecision(bounds.right)); - $("#maxlat").val(toPrecision(bounds.top)); - - mapnikSizeChanged(); - htmlUrlChanged(); - } - - function clearBox() { - transform.deactivate(); - vectors.destroyFeatures(); - } - - function drawBox(bounds) { - var feature = new OpenLayers.Feature.Vector(bounds.toGeometry()); - - vectors.addFeatures(feature); - transform.setFeature(feature); + $("#export_overpass").attr("href", + "https://overpass-api.de/api/map?bbox=" + + $("#minlon").val() + "," + $("#minlat").val() + "," + + $("#maxlon").val() + "," + $("#maxlat").val()); } function validateControls() { - var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), $("#maxlon").val(), $("#maxlat").val()); - - if (bounds.getWidth() * bounds.getHeight() > OSM.MAX_REQUEST_AREA) { - $("#export_osm_too_large").show(); - } else { - $("#export_osm_too_large").hide(); - } - - var max_scale = maxMapnikScale(); - var disabled = true; - - if ($("#format_osm").prop("checked")) { - disabled = bounds.getWidth() * bounds.getHeight() > OSM.MAX_REQUEST_AREA; - } else if ($("#format_mapnik").prop("checked")) { - disabled = $("#mapnik_scale").val() < max_scale; - } - - $("#export_commit").prop("disabled", disabled); - $("#mapnik_max_scale").html(roundScale(max_scale)); + $("#export_osm_too_large").toggle(getBounds().getSize() > OSM.MAX_REQUEST_AREA); + $("#export_commit").toggle(getBounds().getSize() < OSM.MAX_REQUEST_AREA); } - function htmlUrlChanged() { - var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), $("#maxlon").val(), $("#maxlat").val()); - var layerName = map.baseLayer.keyid; - var url = "http://" + OSM.SERVER_URL + "/export/embed.html?bbox=" + bounds.toBBOX() + "&layer=" + layerName; - var markerUrl = ""; - - if ($("#marker_lat").val() && $("#marker_lon").val()) { - markerUrl = "&mlat=" + $("#marker_lat").val() + "&mlon=" + $("#marker_lon").val(); - url += "&marker=" + $("#marker_lat").val() + "," + $("#marker_lon").val(); - } - - var html = ''; - - // Create "larger map" link - var center = bounds.getCenterLonLat(); - - bounds.transform(epsg4326, epsg900913); - var zoom = map.getZoomForExtent(bounds); - - var layers = getMapLayers(); - - var text = I18n.t('export.start_rjs.view_larger_map'); - var escaped = []; - - for (var i = 0; i < text.length; ++i) { - var c = text.charCodeAt(i); - escaped.push(c < 127 ? text.charAt(i) : "&#" + c + ";"); - } - - html += '
'+escaped.join("")+''; - - $("#export_html_text").val(html); - - if ($("#format_html").prop("checked")) { - $("#export_html_text").prop("selected", true); - } + function checkSubmit(e) { + if (getBounds().getSize() > OSM.MAX_REQUEST_AREA) e.preventDefault(); } - function formatChanged() { - $("#export_commit").show(); - - if ($("#format_osm").prop("checked")) { - $("#export_osm").show(); - } else { - $("#export_osm").hide(); - } - - if ($("#format_mapnik").prop("checked")) { - $("#mapnik_scale").val(roundScale(map.getScale())); - $("#export_mapnik").show(); - - mapnikSizeChanged(); - } else { - $("#export_mapnik").hide(); - } - - if ($("#format_html").prop("checked")) { - $("#export_html").show(); - $("#export_commit").hide(); - $("#export_html_text").prop("selected", true); - } else { - $("#export_html").hide(); - - clearMarker(); - } - - validateControls(); - } - - function maxMapnikScale() { - var bounds = getMercatorBounds(); - - return Math.floor(Math.sqrt(bounds.getWidth() * bounds.getHeight() / 0.3136)); - } - - function mapnikImageSize(scale) { - var bounds = getMercatorBounds(); - - return new OpenLayers.Size(Math.round(bounds.getWidth() / scale / 0.00028), - Math.round(bounds.getHeight() / scale / 0.00028)); - } + page.pushstate = page.popstate = function (path) { + OSM.loadSidebarContent(path, page.load); + }; - function roundScale(scale) { - var precision = 5 * Math.pow(10, Math.floor(Math.LOG10E * Math.log(scale)) - 2); + page.load = function () { + map + .addLayer(locationFilter) + .on("moveend", update); - return precision * Math.ceil(scale / precision); - } + $("#maxlat, #minlon, #maxlon, #minlat").change(boundsChanged); + $("#drag_box").click(enableFilter); + $(".export_form").on("submit", checkSubmit); - function mapnikSizeChanged() { - var size = mapnikImageSize($("#mapnik_scale").val()); + update(); + return map.getState(); + }; - $("#mapnik_image_width").html(size.w); - $("#mapnik_image_height").html(size.h); + page.unload = function () { + map + .removeLayer(locationFilter) + .off("moveend", update); + }; - validateControls(); - } -} + return page; +};