diff --git a/web/app/static/borders.js b/web/app/static/borders.js index a78c40a..f407620 100644 --- a/web/app/static/borders.js +++ b/web/app/static/borders.js @@ -1,14 +1,39 @@ -var STYLE_BORDER = { stroke: true, color: '#03f', weight: 3, fill: true, fillOpacity: 0.1 }; -var STYLE_SELECTED = { stroke: true, color: '#ff3', weight: 3, fill: true, fillOpacity: 0.75 }; +var STYLE_BORDER = { + stroke: true, + color: '#03f', + weight: 3, + fill: true, + fillOpacity: 0.1 +}; +var STYLE_SELECTED = { + stroke: true, + color: '#ff3', + weight: 3, + fill: true, + fillOpacity: 0.75 +}; +var STYLE_OLD = { + color: 'purple', + weight: 5, + fill: false, + clickable: false +}; +var STYLE_PARENT = { + color: 'black', + weight: 6, + fill: false +}; + var FILL_TOO_SMALL = '#0f0'; var FILL_TOO_BIG = '#800'; var FILL_ZERO = 'black'; -var map, borders = {}, bordersLayer, selectedId, editing = false; -var config = { // server config +var map, borders = {}, + bordersLayer, selectedId, editing = false; +var config = { // server config READONLY: false, MWM_SIZE_THR: 70, - OLD_BORDERS_NAME: undefined // may be filled in getServerConfiguration() + OLD_BORDERS_NAME: undefined // may be filled in getServerConfiguration() }; var size_good, size_bad; var maxRank = 1; @@ -16,26 +41,31 @@ var tooSmallLayer = null; var oldBordersLayer = null; function init() { - map = L.map('map', { editable: true }).setView([30, 0], 3); - var hash = new L.Hash(map); - L.tileLayer('https://tile.openstreetmap.de/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap' }).addTo(map); - //L.tileLayer('https://b.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap' }).addTo(map); + map = L.map('map', { + editable: true + }).setView([30, 0], 3); + var hash = new L.Hash(map); + L.tileLayer('https://tile.openstreetmap.de/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap' + }).addTo(map); + //L.tileLayer('https://b.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap' }).addTo(map); //L.tileLayer('http://tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap' }).addTo(map); - bordersLayer = L.layerGroup(); - map.addLayer(bordersLayer); + bordersLayer = L.layerGroup(); + map.addLayer(bordersLayer); - map.on('moveend', function() { - if( map.getZoom() >= 5 ) - updateBorders(); - $('#b_josm').css('visibility', map.getZoom() >= 7 ? 'visible' : 'hidden'); - }); + map.on('moveend', function() { + if (map.getZoom() >= 5) + updateBorders(); + $('#b_josm').css('visibility', map.getZoom() >= 7 ? 'visible' : + 'hidden'); + }); - $('#poly_all').attr('href', getPolyDownloadLink()); - $('#poly_bbox').on('mousedown', function() { - $(this).attr('href', getPolyDownloadLink(true)); - }); - $('#r_green').val(size_good); - $('#r_red').val(size_bad); + $('#poly_all').attr('href', getPolyDownloadLink()); + $('#poly_bbox').on('mousedown', function() { + $(this).attr('href', getPolyDownloadLink(true)); + }); + $('#r_green').val(size_good); + $('#r_red').val(size_bad); $('#hide_import_button').click(function() { $('#import_div').hide(); $('#filefm input[type=file]').val(''); @@ -44,267 +74,294 @@ function init() { console.log('frame loaded'); var frame_doc = $('#h_iframe')[0].contentWindow.document; var frame_body = $('body', frame_doc); - frame_body.css({'font-size': '9pt'}); + frame_body.css({ + 'font-size': '9pt' + }); updateBorders(); }); - $('#fsearch').keyup(function(e) { - if( e.keyCode == 13 ) - $('#b_search').click(); - }); - $('#b_comment').keyup(function(e) { - if( e.keyCode == 13 ) - $('#b_comment_send').click(); - }); + $('#fsearch').keyup(function(e) { + if (e.keyCode == 13) + $('#b_search').click(); + }); + $('#b_comment').keyup(function(e) { + if (e.keyCode == 13) + $('#b_comment_send').click(); + }); $('#auto_divide').change(function() { if (this.checked) $('#population_thresholds').show(); else $('#population_thresholds').hide(); }); - getServerConfiguration(); - filterSelect(true); + getServerConfiguration(); + filterSelect(true); } function getServerConfiguration() { - $.ajax(getServer('config'), { - success: function(res) { - if( res.osm ) { - $('#unbound_actions').show(); - $('#b_divide').show(); - } - if( res.tables && res.tables.length > 0 ) { - config.OLD_BORDERS_NAME = res.tables[0]; - $('#old_action').show(); - $('#josm_old').css('display', 'inline'); - } - if( res.backup ) { - $('#backups').show(); - } - if( res.readonly ) { - $('#action_buttons').hide(); - $('#backups').hide(); - config.READONLY = true; - } - if( !res.readonly && IMPORT_ENABLED ) { - $('#filefm').css('display', 'block'); - $('#filefm').attr('action', getServer('import')); - var iframe = ''; - } - size_bad = config.MWM_SIZE_THR = Math.round(parseInt(res.mwm_size_thr)/1024); + $.ajax(getServer('config'), { + success: function(res) { + if (res.osm) { + $('#unbound_actions').show(); + $('#b_divide').show(); + } + if (res.tables && res.tables.length > 0) { + config.OLD_BORDERS_NAME = res.tables[0]; + $('#old_action').show(); + $('#josm_old').css('display', 'inline'); + } + if (res.backup) { + $('#backups').show(); + } + if (res.readonly) { + $('#action_buttons').hide(); + $('#backups').hide(); + config.READONLY = true; + } + if (!res.readonly && IMPORT_ENABLED) { + $('#filefm').css('display', 'block'); + $('#filefm').attr('action', getServer('import')); + var iframe = + ''; + } + size_bad = config.MWM_SIZE_THR = Math.round(parseInt(res + .mwm_size_thr) / 1024); size_good = Math.round(size_bad * 0.7 / 10) * 10; $('#r_green').val(size_good); - $('#r_red').val(size_bad); - $('#mwm_size_thr').val(config.MWM_SIZE_THR); - } - }); + $('#r_red').val(size_bad); + $('#mwm_size_thr').val(config.MWM_SIZE_THR); + } + }); } function updateBorders() { - var b = map.getBounds(), - simplified = map.getZoom() < 7 ? 2 : (map.getZoom() < 11 ? 1 : 0); - $.ajax(getServer('bbox'), { - data: { - 'simplify' : simplified, - 'xmin': b.getWest(), - 'xmax': b.getEast(), - 'ymin': b.getSouth(), - 'ymax': b.getNorth() - }, - success: makeAnswerHandler(processBorders), - dataType: 'json', - simplified: simplified - }); + var b = map.getBounds(), + simplified = map.getZoom() < 7 ? 2 : (map.getZoom() < 11 ? 1 : 0); + $.ajax(getServer('bbox'), { + data: { + 'simplify': simplified, + 'xmin': b.getWest(), + 'xmax': b.getEast(), + 'ymin': b.getSouth(), + 'ymax': b.getNorth() + }, + success: makeAnswerHandler(processBorders), + dataType: 'json', + simplified: simplified + }); - if( oldBordersLayer != null && config.OLD_BORDERS_NAME ) { - oldBordersLayer.clearLayers(); - $.ajax(getServer('bbox'), { - data: { - 'table': config.OLD_BORDERS_NAME, - 'simplify': simplified, - 'xmin': b.getWest(), - 'xmax': b.getEast(), - 'ymin': b.getSouth(), - 'ymax': b.getNorth() - }, - success: makeAnswerHandler(processOldBorders), - dataType: 'json' - }); - } + if (oldBordersLayer != null && config.OLD_BORDERS_NAME) { + oldBordersLayer.clearLayers(); + $.ajax(getServer('bbox'), { + data: { + 'table': config.OLD_BORDERS_NAME, + 'simplify': simplified, + 'xmin': b.getWest(), + 'xmax': b.getEast(), + 'ymin': b.getSouth(), + 'ymax': b.getNorth() + }, + success: makeAnswerHandler(processOldBorders), + dataType: 'json' + }); + } } function makeAnswerHandler(on_ok_func) { - return function(answer) { - if (answer.status !== 'ok') - alert(answer.status); - else { - if (answer.warnings && answer.warnings.length) - alert(answer.warnings.join('\n')); - on_ok_func(answer); - } - }; + return function(answer) { + if (answer.status !== 'ok') + alert(answer.status); + else { + if (answer.warnings && answer.warnings.length) + alert(answer.warnings.join('\n')); + on_ok_func(answer); + } + }; } function processBorders(data) { data = data.geojson; - for( var id in borders ) { - if( id != selectedId || !editing ) { - bordersLayer.removeLayer(borders[id].layer); - delete borders[id]; - } - } + for (var id in borders) { + if (id != selectedId || !editing) { + bordersLayer.removeLayer(borders[id].layer); + delete borders[id]; + } + } - for( var f = 0; f < data.features.length; f++ ) { - var layer = L.GeoJSON.geometryToLayer(data.features[f].geometry), - props = data.features[f].properties; + for (var f = 0; f < data.features.length; f++) { + var layer = L.GeoJSON.geometryToLayer(data.features[f].geometry), + props = data.features[f].properties; props.simplified = this.simplified; updateBorder(props.id, layer, props); - } - if( selectedId in borders ) { - selectLayer({ target: borders[selectedId].layer }); - } else { - selectLayer(null); - } + } + if (selectedId in borders) { + selectLayer({ + target: borders[selectedId].layer + }); + } + else { + selectLayer(null); + } [subregionsLayer, clustersLayer, - parentLayer, potentialParentLayer].forEach( - function(layer) { - if (layer) - layer.bringToFront(); - } + parentLayer, potentialParentLayer + ].forEach( + function(layer) { + if (layer) + layer.bringToFront(); + } ); - var b = map.getBounds(); - if( tooSmallLayer != null ) { - tooSmallLayer.clearLayers(); - $.ajax(getServer('small'), { - data: { - 'xmin': b.getWest(), - 'xmax': b.getEast(), - 'ymin': b.getSouth(), - 'ymax': b.getNorth() - }, - success: processTooSmall, - dataType: 'json' - }); - } + var b = map.getBounds(); + if (tooSmallLayer != null) { + tooSmallLayer.clearLayers(); + $.ajax(getServer('small'), { + data: { + 'xmin': b.getWest(), + 'xmax': b.getEast(), + 'ymin': b.getSouth(), + 'ymax': b.getNorth() + }, + success: processTooSmall, + dataType: 'json' + }); + } } function processOldBorders(data) { - var layer = L.geoJson(data.geojson, { - style: { fill: false, color: 'purple', weight: 5, clickable: false } - }); - oldBordersLayer.addLayer(layer); + var layer = L.geoJson(data.geojson, { + style: STYLE_OLD + }); + oldBordersLayer.addLayer(layer); } function processTooSmall(data) { - if (tooSmallLayer == null || !data || !('rings' in data)) - return; - tooSmallLayer.clearLayers(); - for (var i = 0; i < data.rings.length; i++) { - var point = data.rings[i]; - if (point.id in borders) { - var marker = L.marker( - [point.lat, point.lon], - {title: point.name + '\n' + 'Площадь: ' - + L.Util.formatNum(point.area, 2) + ' км²' } - ); - marker.pLayer = borders[point.id].layer; - marker.on('click', selectLayer); - tooSmallLayer.addLayer(marker); - } - } + if (tooSmallLayer == null || !data || !('rings' in data)) + return; + tooSmallLayer.clearLayers(); + for (var i = 0; i < data.rings.length; i++) { + var point = data.rings[i]; + if (point.id in borders) { + var marker = L.marker( + [point.lat, point.lon], { + title: point.name + '\n' + 'Площадь: ' + + L.Util.formatNum(point.area, 2) + ' км²' + } + ); + marker.pLayer = borders[point.id].layer; + marker.on('click', selectLayer); + tooSmallLayer.addLayer(marker); + } + } } function updateBorder(id, layer, props) { - if( id in borders ) { - if( id == selectedId && editing ) - return; - bordersLayer.removeLayer(borders[id].layer); - } - borders[id] = props; - borders[id].layer = layer; - layer.id = id; - bordersLayer.addLayer(layer); - layer.setStyle(STYLE_BORDER); - if( borders[id]['disabled'] ) - layer.setStyle({ fillOpacity: 0.01 }); - var color = getColor(borders[id]); - layer.setStyle({ color: color }); - layer.defStyle = color; - layer.on('click', selectLayer); + if (id in borders) { + if (id == selectedId && editing) + return; + bordersLayer.removeLayer(borders[id].layer); + } + borders[id] = props; + borders[id].layer = layer; + layer.id = id; + bordersLayer.addLayer(layer); + layer.setStyle(STYLE_BORDER); + if (borders[id]['disabled']) + layer.setStyle({ + fillOpacity: 0.01 + }); + var color = getColor(borders[id]); + layer.setStyle({ + color: color + }); + layer.defStyle = color; + layer.on('click', selectLayer); } function selectLayer(e) { - if( e != null && 'pLayer' in e.target ) - e.target = e.target.pLayer; + if (e != null && 'pLayer' in e.target) + e.target = e.target.pLayer; - if( e != null && joinSelected != null ) { - bJoinSelect(e.target); - return; - } - if( selectedId && selectedId in borders ) { - borders[selectedId].layer.setStyle(STYLE_BORDER); - if( borders[selectedId]['disabled'] ) - borders[selectedId].layer.setStyle({ fillOpacity: 0.01 }); - if( 'defStyle' in borders[selectedId].layer ) - borders[selectedId].layer.setStyle({ color: borders[selectedId].layer.defStyle }); - } - if( e != null && 'id' in e.target && e.target.id in borders ) { - selectedId = e.target.id; + if (e != null && joinSelected != null) { + bJoinSelect(e.target); + return; + } + if (selectedId && selectedId in borders) { + borders[selectedId].layer.setStyle(STYLE_BORDER); + if (borders[selectedId]['disabled']) + borders[selectedId].layer.setStyle({ + fillOpacity: 0.01 + }); + if ('defStyle' in borders[selectedId].layer) + borders[selectedId].layer.setStyle({ + color: borders[selectedId].layer.defStyle + }); + } + if (e != null && 'id' in e.target && e.target.id in borders) { + selectedId = e.target.id; if (selectedIdForParentAssigning && - selectedIdForParentAssigning != selectedId) { + selectedIdForParentAssigning != selectedId) { finishChooseParent(); } - e.target.setStyle(STYLE_SELECTED); - var props = borders[selectedId]; - if( props['disabled'] ) - e.target.setStyle({ fillOpacity: 0.01 }); - $('#b_name').text(props['name']); - $('#b_al').text(props['admin_level'] ? '('+props['admin_level']+')' : ''); - $('#b_parent_name').text(getParentBorderRepresentation(props)); - $('#b_size').text(Math.round(props['count_k'] * BYTES_FOR_NODE / 1024 / 1024) + ' MB'); - $('#pa_size').text(Math.round(props['mwm_size_est']/1024) + ' MB'); - //$('#b_nodes').text(borders[selectedId].layer.getLatLngs()[0].length); - $('#b_nodes').text(props['nodes']); - $('#b_date').text(props['modified']); - $('#b_area').text(L.Util.formatNum(props['area'] / 1000000, 2)); - $('#b_comment').val(props['comment'] || ''); - //$('#b_status').text(props['disabled'] ? 'Отключено' : 'В сборке'); - $('#b_disable').text(props['disabled'] ? 'Вернуть' : 'Убрать'); - } else - selectedId = null; + e.target.setStyle(STYLE_SELECTED); + var props = borders[selectedId]; + if (props['disabled']) + e.target.setStyle({ + fillOpacity: 0.01 + }); + $('#b_name').text(props['name']); + $('#b_al').text( + props['admin_level'] ? '(' + props['admin_level'] + ')' : '' + ); + $('#b_parent_name').text(getParentBorderRepresentation(props)); + $('#b_size').text( + Math.round(props['count_k'] * BYTES_FOR_NODE / 1024 / 1024) + ' MB' + ); + $('#pa_size').text(Math.round(props['mwm_size_est'] / 1024) + ' MB'); + //$('#b_nodes').text(borders[selectedId].layer.getLatLngs()[0].length); + $('#b_nodes').text(props['nodes']); + $('#b_date').text(props['modified']); + $('#b_area').text(L.Util.formatNum(props['area'] / 1000000, 2)); + $('#b_comment').val(props['comment'] || ''); + //$('#b_status').text(props['disabled'] ? 'Отключено' : 'В сборке'); + $('#b_disable').text(props['disabled'] ? 'Вернуть' : 'Убрать'); + } + else + selectedId = null; - if (selectedId) - $('#selected_border_actions').show(); - else - $('#selected_border_actions').hide(); + if (selectedId) + $('#selected_border_actions').show(); + else + $('#selected_border_actions').hide(); - $('#rename').hide(); + $('#rename').hide(); } function filterSelect(noRefresh) { - var value = $('#f_type').val(); - $('#f_size').css('display', value.endsWith('size') ? 'block' : 'none'); - $('#f_chars').css('display', value == 'chars' ? 'block' : 'none'); - $('#f_comments').css('display', value == 'comments' ? 'block' : 'none'); - $('#f_topo').css('display', value == 'topo' ? 'block' : 'none'); - if( value == 'topo' ) { - tooSmallLayer = L.layerGroup(); - map.addLayer(tooSmallLayer); - } else if( tooSmallLayer != null ) { - map.removeLayer(tooSmallLayer); - tooSmallLayer = null; - } - if( !noRefresh ) - updateBorders(); + var value = $('#f_type').val(); + $('#f_size').css('display', value.endsWith('size') ? 'block' : 'none'); + $('#f_chars').css('display', value == 'chars' ? 'block' : 'none'); + $('#f_comments').css('display', value == 'comments' ? 'block' : 'none'); + $('#f_topo').css('display', value == 'topo' ? 'block' : 'none'); + if (value == 'topo') { + tooSmallLayer = L.layerGroup(); + map.addLayer(tooSmallLayer); + } + else if (tooSmallLayer != null) { + map.removeLayer(tooSmallLayer); + tooSmallLayer = null; + } + if (!noRefresh) + updateBorders(); } -var colors = ['red', 'orange', 'yellow', 'lime', 'green', 'olive', 'cyan', 'darkcyan', - 'blue', 'navy', 'magenta', 'purple', 'deeppink', 'brown'] //'black'; +var colors = ['red', 'orange', 'yellow', 'lime', 'green', 'olive', 'cyan', + 'darkcyan', 'blue', 'navy', 'magenta', 'purple', 'deeppink', 'brown' +] //'black'; var alphabet = 'abcdefghijklmnopqrstuvwxyz'; function getStringHash(str) { - var hash = 0, i, chr; + var hash = 0, + i, chr; /* for (i = 0; i < str.length; i++) { chr = str.charCodeAt(i); @@ -320,161 +377,169 @@ function getCountryColor(props) { var country_name = props.country_name; if (!country_name) return 'black'; - var hash = getStringHash(country_name); + var hash = getStringHash(country_name); var indexInColors = Math.abs(hash) % colors.length; return colors[indexInColors]; } function getColor(props) { - var color = STYLE_BORDER.color; - var fType = $('#f_type').val(); - if( fType == 'nodes_size' ) { - if( props['count_k'] <= 0 ) - color = FILL_ZERO; - else if( props['count_k'] * BYTES_FOR_NODE < size_good * 1024 * 1024 ) - color = FILL_TOO_SMALL; - else if( props['count_k'] * BYTES_FOR_NODE > size_bad * 1024 * 1024 ) - color = FILL_TOO_BIG; - } else if( fType == 'predict_size' ) { - if( props['mwm_size_est'] <= 0 ) - color = FILL_ZERO; - else if( props['mwm_size_est'] < size_good * 1024 ) - color = FILL_TOO_SMALL; - else if( props['mwm_size_est'] > size_bad * 1024 ) - color = FILL_TOO_BIG; - } - else if( fType == 'topo' ) { - var rings = countRings([0, 0], props.layer); - if( rings[1] > 0 ) - color = FILL_TOO_BIG; - else if( rings[0] == 1 ) - color = FILL_TOO_SMALL; - else if( rings[0] == 0 ) - color = FILL_ZERO; - } else if( fType == 'chars' ) { - if( !/^[\x20-\x7F]*$/.test(props['name']) ) - color = FILL_TOO_BIG; - else if( props['name'].indexOf(' ') < 0 ) - color = FILL_TOO_SMALL; - } else if( fType == 'comments' ) { - if( props['comment'] && props['comment'] != '' ) - color = FILL_TOO_BIG; - } + var color = STYLE_BORDER.color; + var fType = $('#f_type').val(); + if (fType == 'nodes_size') { + if (props['count_k'] <= 0) + color = FILL_ZERO; + else if (props['count_k'] * BYTES_FOR_NODE < size_good * 1024 * 1024) + color = FILL_TOO_SMALL; + else if (props['count_k'] * BYTES_FOR_NODE > size_bad * 1024 * 1024) + color = FILL_TOO_BIG; + } + else if (fType == 'predict_size') { + if (props['mwm_size_est'] <= 0) + color = FILL_ZERO; + else if (props['mwm_size_est'] < size_good * 1024) + color = FILL_TOO_SMALL; + else if (props['mwm_size_est'] > size_bad * 1024) + color = FILL_TOO_BIG; + } + else if (fType == 'topo') { + var rings = countRings([0, 0], props.layer); + if (rings[1] > 0) + color = FILL_TOO_BIG; + else if (rings[0] == 1) + color = FILL_TOO_SMALL; + else if (rings[0] == 0) + color = FILL_ZERO; + } + else if (fType == 'chars') { + if (!/^[\x20-\x7F]*$/.test(props['name'])) + color = FILL_TOO_BIG; + else if (props['name'].indexOf(' ') < 0) + color = FILL_TOO_SMALL; + } + else if (fType == 'comments') { + if (props['comment'] && props['comment'] != '') + color = FILL_TOO_BIG; + } else if (fType == 'country') { color = getCountryColor(props); } - return color; + return color; } -function countRings( rings, polygon ) { - if( polygon instanceof L.MultiPolygon ) { - polygon.eachLayer(function(layer) { - rings = countRings(rings, layer); - }); - } else if( polygon instanceof L.Polygon ) { - rings[0]++; - if( '_holes' in polygon && 'length' in polygon._holes ) - rings[1] += polygon._holes.length; - } - return rings; +function countRings(rings, polygon) { + if (polygon instanceof L.MultiPolygon) { + polygon.eachLayer(function(layer) { + rings = countRings(rings, layer); + }); + } + else if (polygon instanceof L.Polygon) { + rings[0]++; + if ('_holes' in polygon && 'length' in polygon._holes) + rings[1] += polygon._holes.length; + } + return rings; } function doSearch() { - var query = $('#fsearch').val(); - if( query.length > 1 ) { - $.ajax(getServer('search'), { - data: { 'q': query }, - success: makeAnswerHandler(zoomToFound) - }); - } + var query = $('#fsearch').val(); + if (query.length > 1) { + $.ajax(getServer('search'), { + data: { + 'q': query + }, + success: makeAnswerHandler(zoomToFound) + }); + } } function zoomToFound(result) { - $('#fsearch').val(''); - if( !('bounds' in result)) - return; - var b = result['bounds']; - if( b.length != 4 ) - return; - map.fitBounds([[b[1], b[0]], [b[3], b[2]]]); + $('#fsearch').val(''); + if (!('bounds' in result)) + return; + var b = result['bounds']; + if (b.length != 4) + return; + map.fitBounds([[b[1], b[0]], [b[3], b[2]]]); } function bUpdateColors() { - size_good = +$('#r_green').val(); - if( size_good <= 0 ) - size_good = 10; - size_bad = +$('#r_red').val(); - if( size_bad <= size_good ) - size_bad = size_good * 10; - $('#r_green').val(size_good); - $('#r_red').val(size_bad); - updateBorders(); + size_good = +$('#r_green').val(); + if (size_good <= 0) + size_good = 10; + size_bad = +$('#r_red').val(); + if (size_bad <= size_good) + size_bad = size_good * 10; + $('#r_green').val(size_good); + $('#r_red').val(size_bad); + updateBorders(); } function bOldBorders() { - if( $('#old').prop('checked') ) { - oldBordersLayer = L.layerGroup(); - map.addLayer(oldBordersLayer); - updateBorders(); - } else if( oldBordersLayer != null ) { - map.removeLayer(oldBordersLayer); - oldBordersLayer = null; - } + if ($('#old').prop('checked')) { + oldBordersLayer = L.layerGroup(); + map.addLayer(oldBordersLayer); + updateBorders(); + } + else if (oldBordersLayer != null) { + map.removeLayer(oldBordersLayer); + oldBordersLayer = null; + } } function importInJOSM(method, data) { - var url = getServer(method) + '?' + $.param(data); + var url = getServer(method) + '?' + $.param(data); var params = [ - ['new_layer', 'true'], - ['format', '.osm'], - ['layer_name', 'borders_' + Date.now()], - ['url', url] + ['new_layer', 'true'], + ['format', '.osm'], + ['layer_name', 'borders_' + Date.now()], + ['url', url] ]; var params_str = params.map(x => (x[0] + '=' + x[1])).join('&'); - $.ajax({ - url: 'http://127.0.0.1:8111/import?' + encodeURI(params_str), + $.ajax({ + url: JOSM_IMPORT_LISTEN_ADDRESS + '?' + encodeURI(params_str), // Don't use ajax 'data' param since the order of // params in url matters: url= must be the last // otherwise all the rest params would be a part of that url. - complete: function(t) { - if( t.status != 200 ) - window.alert('Please enable remote_control in JOSM'); - } - }); + complete: function(t) { + if (t.status != 200) + window.alert( + 'Please enable remote_control in JOSM'); + } + }); } function bJOSM() { - var b = map.getBounds(); - importInJOSM('josm', { - 'xmin': b.getWest(), - 'xmax': b.getEast(), - 'ymin': b.getSouth(), - 'ymax': b.getNorth() - }); + var b = map.getBounds(); + importInJOSM('josm', { + 'xmin': b.getWest(), + 'xmax': b.getEast(), + 'ymin': b.getSouth(), + 'ymax': b.getNorth() + }); } function bJosmOld() { - var b = map.getBounds(); - importInJOSM('josm', { - 'table': config.OLD_BORDERS_NAME, - 'xmin': b.getWest(), - 'xmax': b.getEast(), - 'ymin': b.getSouth(), - 'ymax': b.getNorth() - }); + var b = map.getBounds(); + importInJOSM('josm', { + 'table': config.OLD_BORDERS_NAME, + 'xmin': b.getWest(), + 'xmax': b.getEast(), + 'ymin': b.getSouth(), + 'ymax': b.getNorth() + }); } function bJosmZoom() { - var b = map.getBounds(); - $.ajax({ - url: 'http://127.0.0.1:8111/zoom', - data: { - 'left': b.getWest(), - 'right': b.getEast(), - 'bottom': b.getSouth(), - 'top': b.getNorth() - } - }); + var b = map.getBounds(); + $.ajax({ + url: 'http://127.0.0.1:8111/zoom', + data: { + 'left': b.getWest(), + 'right': b.getEast(), + 'bottom': b.getSouth(), + 'top': b.getNorth() + } + }); } function bImport() { @@ -493,8 +558,8 @@ function finishRename() { } function bToggleRename() { - if( !selectedId || !(selectedId in borders) || config.READONLY ) - return; + if (!selectedId || !(selectedId in borders) || config.READONLY) + return; var rename_el = $('#rename'); if (rename_el.is(':hidden')) { $('#b_rename').val(borders[selectedId].name); @@ -507,37 +572,44 @@ function bToggleRename() { } function bRename() { - if( !selectedId || !(selectedId in borders) ) - return; - $.ajax(getServer('rename'), { - data: { 'id': selectedId, 'new_name': $('#b_rename').val() }, - success: makeAnswerHandler(function () { + if (!selectedId || !(selectedId in borders)) + return; + $.ajax(getServer('rename'), { + data: { + 'id': selectedId, + 'new_name': $('#b_rename').val() + }, + success: makeAnswerHandler(function() { finishRename(); updateBorders(); }) - }); + }); } function bDisable() { - if( !selectedId || !(selectedId in borders) ) - return; - $.ajax(getServer(borders[selectedId].disabled ? 'enable' : 'disable'), { - data: { 'id': selectedId }, - success: updateBorders - }); + if (!selectedId || !(selectedId in borders)) + return; + $.ajax(getServer(borders[selectedId].disabled ? 'enable' : 'disable'), { + data: { + 'id': selectedId + }, + success: updateBorders + }); } function bDelete() { - if( !selectedId || !(selectedId in borders) ) - return; + if (!selectedId || !(selectedId in borders)) + return; var name = borders[selectedId].name; - if( !window.confirm('Точно удалить регион ' - + name + ' (' + selectedId + ')' + '?') ) - return; - $.ajax(getServer('delete'), { - data: { 'id': selectedId }, - success: updateBorders - }); + if (!window.confirm('Точно удалить регион ' + + name + ' (' + selectedId + ')' + '?')) + return; + $.ajax(getServer('delete'), { + data: { + 'id': selectedId + }, + success: updateBorders + }); } var selectedIdForParentAssigning = null; @@ -547,7 +619,7 @@ var potentialParents = null; function finishChooseParent() { if (potentialParentLayer) { - map.removeLayer(potentialParentLayer); + map.removeLayer(potentialParentLayer); potentialParentLayer = null; } potentialParentLayers = {}; @@ -569,7 +641,9 @@ function bTogglePotentialParents() { $('#parent_link').html('Родитель ▲:'); potentialParentsDiv.html('Ожидайте...').show(); $.ajax(getServer('potential_parents'), { - data: {'id': selectedIdForParentAssigning}, + data: { + 'id': selectedIdForParentAssigning + }, success: processPotentialParents }); } @@ -581,10 +655,8 @@ function makeShowParent(parent_id) { if (!(parent_id in potentialParentLayers)) { potentialParentLayers[parent_id] = L.geoJson( potentialParents[parent_id], { - style: function(f) { - return { color: 'blue', weight: 2, fill: false }; - } - }); + style: STYLE_PARENT + }); } if (potentialParentLayer) { map.removeLayer(potentialParentLayer); @@ -612,7 +684,8 @@ function makeSetParent(parent_id) { } function processPotentialParents(answer) { - if (!selectedIdForParentAssigning || !(selectedIdForParentAssigning in borders)) + if (!selectedIdForParentAssigning || !(selectedIdForParentAssigning in + borders)) return; var parents = answer.parents; potentialParents = {}; @@ -638,145 +711,156 @@ function processPotentialParents(answer) { .appendTo(div); var isCurrentParent = (parent_id === selectedParentId); $(' ').appendTo(div); - $('' + (isCurrentParent ? 'отвязать': 'назначить') + '') + $('' + (isCurrentParent ? 'отвязать' : 'назначить') + + '') .click(makeSetParent(isCurrentParent ? null : parent_id)) .appendTo(div); } } -function sendComment( text ) { - if( !selectedId || !(selectedId in borders) ) - return; - $.ajax(getServer('comment'), { - data: { 'id': selectedId, 'comment': text }, - type: 'POST', - success: updateBorders - }); +function sendComment(text) { + if (!selectedId || !(selectedId in borders)) + return; + $.ajax(getServer('comment'), { + data: { + 'id': selectedId, + 'comment': text + }, + type: 'POST', + success: updateBorders + }); } function bComment() { - sendComment($('#b_comment').val()); + sendComment($('#b_comment').val()); } function bClearComment() { - $('#b_comment').val(''); - sendComment(''); + $('#b_comment').val(''); + sendComment(''); } var splitLayer = null, splitSelected = null; function bSplit() { - if( !selectedId || !(selectedId in borders) ) - return; - splitSelected = selectedId; + if (!selectedId || !(selectedId in borders)) + return; + splitSelected = selectedId; var name = borders[selectedId].name; - $('#s_sel').text(name + ' (' + selectedId + ')'); - $('#actions').css('display', 'none'); - $('#split').css('display', 'block'); - map.on('editable:drawing:end', bSplitDrawn); - bSplitStart(); + $('#s_sel').text(name + ' (' + selectedId + ')'); + $('#actions').css('display', 'none'); + $('#split').css('display', 'block'); + map.on('editable:drawing:end', bSplitDrawn); + bSplitStart(); } function bSplitStart() { - $('#s_do').css('display', 'none'); - splitLayer = null; - map.editTools.startPolyline(); + $('#s_do').css('display', 'none'); + splitLayer = null; + map.editTools.startPolyline(); } function bSplitDrawn(e) { - splitLayer = e.layer; - $('#s_do').css('display', 'block'); + splitLayer = e.layer; + $('#s_do').css('display', 'block'); } function bSplitAgain() { - map.editTools.stopDrawing(); - if( splitLayer != null ) - map.removeLayer(splitLayer); - bSplitStart(); + map.editTools.stopDrawing(); + if (splitLayer != null) + map.removeLayer(splitLayer); + bSplitStart(); } function bSplitDo() { - var wkt = '', lls = splitLayer.getLatLngs(); - for (var i = 0; i < lls.length; i++ ) { - if( i > 0 ) - wkt += ','; - wkt += L.Util.formatNum(lls[i].lng, 6) + ' ' + L.Util.formatNum(lls[i].lat, 6); - } - $.ajax(getServer('split'), { - data: { + var wkt = '', + lls = splitLayer.getLatLngs(); + for (var i = 0; i < lls.length; i++) { + if (i > 0) + wkt += ','; + wkt += L.Util.formatNum(lls[i].lng, 6) + ' ' + L.Util.formatNum(lls[i] + .lat, 6); + } + $.ajax(getServer('split'), { + data: { 'id': splitSelected, 'line': 'LINESTRING(' + wkt + ')', 'save_region': $('#save_split_region').prop('checked') }, - datatype: 'json', - success: makeAnswerHandler(updateBorders) - }); - bSplitCancel(); + datatype: 'json', + success: makeAnswerHandler(updateBorders) + }); + bSplitCancel(); } function bSplitJosm() { - var wkt = '', lls = splitLayer.getLatLngs(); - for( i = 0; i < lls.length; i++ ) { - if( i > 0 ) - wkt += ','; - wkt += L.Util.formatNum(lls[i].lng, 6) + ' ' + L.Util.formatNum(lls[i].lat, 6); - } - importInJOSM('josmbord', { - 'id': splitSelected, - 'line': 'LINESTRING(' + wkt + ')' - }); + var wkt = '', + lls = splitLayer.getLatLngs(); + for (i = 0; i < lls.length; i++) { + if (i > 0) + wkt += ','; + wkt += L.Util.formatNum(lls[i].lng, 6) + ' ' + L.Util.formatNum(lls[i] + .lat, 6); + } + importInJOSM('josmbord', { + 'id': splitSelected, + 'line': 'LINESTRING(' + wkt + ')' + }); } function bSplitCancel() { - map.editTools.stopDrawing(); - if( splitLayer != null ) - map.removeLayer(splitLayer); - $('#split').hide(); - $('#actions').show(); + map.editTools.stopDrawing(); + if (splitLayer != null) + map.removeLayer(splitLayer); + $('#split').hide(); + $('#actions').show(); } -var joinSelected = null, joinAnother = null; +var joinSelected = null, + joinAnother = null; function bJoin() { - if( !selectedId || !(selectedId in borders) ) - return; - joinSelected = selectedId; - joinAnother = null; + if (!selectedId || !(selectedId in borders)) + return; + joinSelected = selectedId; + joinAnother = null; var name = borders[selectedId].name; - $('#j_sel').text(name + '(' + selectedId + ')'); - $('#actions').css('display', 'none'); - $('#j_do').css('display', 'none'); - $('#join').css('display', 'block'); + $('#j_sel').text(name + '(' + selectedId + ')'); + $('#actions').css('display', 'none'); + $('#j_do').css('display', 'none'); + $('#join').css('display', 'block'); } // called from selectLayer() when joinSelected is not null function bJoinSelect(layer) { - if( 'id' in layer && layer.id in borders && layer.id != joinSelected ) { - joinAnother = layer.id; + if ('id' in layer && layer.id in borders && layer.id != joinSelected) { + joinAnother = layer.id; var name2 = borders[joinAnother].name; - $('#j_name2').text(name2 + '(' + joinAnother + ')'); - $('#j_do').css('display', 'block'); - } + $('#j_name2').text(name2 + '(' + joinAnother + ')'); + $('#j_do').css('display', 'block'); + } } function bJoinDo() { - if( joinSelected != null && joinAnother != null ) { - $.ajax(getServer('join'), { - data: { 'id1': joinSelected, 'id2': joinAnother }, - success: makeAnswerHandler(updateBorders) - }); - } - bJoinCancel(); + if (joinSelected != null && joinAnother != null) { + $.ajax(getServer('join'), { + data: { + 'id1': joinSelected, + 'id2': joinAnother + }, + success: makeAnswerHandler(updateBorders) + }); + } + bJoinCancel(); } function bJoinCancel() { - joinSelected = null; - $('#join').hide(); - $('#actions').show(); + joinSelected = null; + $('#join').hide(); + $('#actions').show(); } - var parentLayer = null; function getParentBorderRepresentation(props, long) { @@ -795,113 +879,130 @@ function getParentBorderRepresentation(props, long) { } function bJoinToParent() { - if( !selectedId || !(selectedId in borders) ) - return; + if (!selectedId || !(selectedId in borders)) + return; var props = borders[selectedId]; if (!props['parent_id']) { alert('Это регион верхнего уровня'); return; } - joinSelected = selectedId; - $('#j_to_parent_sel').text(props['name'] + ' (' + selectedId + ')'); - $('#j_sel_parent').text(getParentBorderRepresentation(props, true)); - $('#actions').hide(); - $('#join_to_parent').show(); + joinSelected = selectedId; + $('#j_to_parent_sel').text(props['name'] + ' (' + selectedId + ')'); + $('#j_sel_parent').text(getParentBorderRepresentation(props, true)); + $('#actions').hide(); + $('#join_to_parent').show(); } function bJoinToParentPreview() { - if (parentLayer != null) { - map.removeLayer(parentLayer); - parentLayer = null; - } + if (parentLayer != null) { + map.removeLayer(parentLayer); + parentLayer = null; + } var props = borders[selectedId]; - var simplified = map.getZoom() < 7 ? 2 : (map.getZoom() < 11 ? 1 : 0); + var simplified = map.getZoom() < 7 ? 2 : (map.getZoom() < 11 ? 1 : 0); $.ajax(getServer('border'), { - data: {'id': props['parent_id'], 'simplify': simplified}, + data: { + 'id': props['parent_id'], + 'simplify': simplified + }, success: makeAnswerHandler(processJoinToParentPreview) }); } function processJoinToParentPreview(answer) { - parentLayer = L.geoJson(answer.geojson, { - style: function(f) { - return { color: 'black', weight: 2, fill: false }; - } - }); - map.addLayer(parentLayer); + parentLayer = L.geoJson(answer.geojson, { + style: STYLE_PARENT + }); + map.addLayer(parentLayer); parentLayer.bringToFront(); } function bJoinToParentDo() { - if( joinSelected != null) { - $.ajax(getServer('join_to_parent'), { - data: { 'id': joinSelected }, - success: makeAnswerHandler(updateBorders) - }); - } - bJoinToParentCancel(); + if (joinSelected != null) { + $.ajax(getServer('join_to_parent'), { + data: { + 'id': joinSelected + }, + success: makeAnswerHandler(updateBorders) + }); + } + bJoinToParentCancel(); } function bJoinToParentCancel() { - joinSelected = null; + joinSelected = null; if (parentLayer != null) { map.removeLayer(parentLayer); parentLayer = null; } - $('#actions').show(); - $('#join_to_parent').hide(); + $('#actions').show(); + $('#join_to_parent').hide(); } -var pMarker = L.marker([0, 0], { draggable: true }); +var pMarker = L.marker([0, 0], { + draggable: true +}); function bPoint() { - $('#p_name').val('*'); - selectLayer(null); - $('#actions').css('display', 'none'); - $('#point').css('display', 'block'); - pMarker.setLatLng(map.getCenter()); - map.addLayer(pMarker); + $('#p_name').val('*'); + selectLayer(null); + $('#actions').css('display', 'none'); + $('#point').css('display', 'block'); + pMarker.setLatLng(map.getCenter()); + map.addLayer(pMarker); } function bPointList() { - var ll = pMarker.getLatLng(); - $.ajax(getServer('point'), { - data: { 'lat': ll.lat, 'lon': ll.lng }, - dataType: 'json', - success: updatePointList - }); + var ll = pMarker.getLatLng(); + $.ajax(getServer('point'), { + data: { + 'lat': ll.lat, + 'lon': ll.lng + }, + dataType: 'json', + success: updatePointList + }); } function updatePointList(data) { - var list = $('#p_list'); - list.text(''); - if( !data || !('borders' in data) ) - return; - for( var i = 0; i < data.borders.length; i++ ) { - var b = data.borders[i]; - var a = document.createElement('a'); - a.href = '#'; - a.onclick = (function(id, name) { return function() { pPointSelect(id, name); return false } })(b['id'], b['name']); - list.append(a, $('
')); - $(a).text(b['admin_level'] + ': ' + b['name'] + ' (' + Math.round(b['area']) + ' км²)'); - } + var list = $('#p_list'); + list.text(''); + if (!data || !('borders' in data)) + return; + for (var i = 0; i < data.borders.length; i++) { + var b = data.borders[i]; + var a = document.createElement('a'); + a.href = '#'; + a.onclick = (function(id, name) { + return function() { + pPointSelect(id, name); + return false + } + })(b['id'], b['name']); + list.append(a, $('
')); + $(a).text(b['admin_level'] + ': ' + b['name'] + ' (' + Math.round(b[ + 'area']) + ' км²)'); + } } function pPointSelect(id, name1) { - var name = $('#p_name').val(); - name = name.replace('*', name1); - $.ajax(getServer('from_osm'), { - data: { 'name': name, 'id': id }, - success: makeAnswerHandler(updateBorders) - }); - bPointCancel(); + var name = $('#p_name').val(); + name = name.replace('*', name1); + $.ajax(getServer('from_osm'), { + data: { + 'name': name, + 'id': id + }, + success: makeAnswerHandler(updateBorders) + }); + bPointCancel(); } function bPointCancel() { - $('#point').hide(); - $('#actions').show(); - $('#p_list').text(''); - map.removeLayer(pMarker); + $('#point').hide(); + $('#actions').show(); + $('#p_list').text(''); + map.removeLayer(pMarker); } var subregionsLayer = null, @@ -909,24 +1010,31 @@ var subregionsLayer = null, divSelectedId = null; function bDivide() { - if( !selectedId || !(selectedId in borders) ) - return; - divSelectedId = selectedId; - $('#actions').hide(); - $('#d_count').hide(); - $('#b_divide_do').hide(); - $('#divide').show(); - // pre-fill 'like' and 'where' fields - $('#region_to_divide').text(borders[divSelectedId].name + ' (' + - divSelectedId + ')'); + if (!selectedId || !(selectedId in borders)) + return; + divSelectedId = selectedId; + $('#actions').hide(); + $('#d_count').hide(); + $('#b_divide_do').hide(); + $('#divide').show(); + + $('#region_to_divide').text(borders[divSelectedId].name + ' (' + + divSelectedId + ')'); var next_admin_level = borders[divSelectedId].admin_level ? - borders[divSelectedId].admin_level + 1 : null; - $('#next_level').val(next_admin_level); + borders[divSelectedId].admin_level + 1 : null; + $('#next_level').val(next_admin_level); + if (next_admin_level === null) { // Divided region is not an administrative unit. // Do not allow 'auto_divide' and 'apply_to_similar' options. - $('#auto_divide').prop({'checked': false, 'disabled': true}); - $('#apply_to_similar').prop({'checked': false, 'disabled': true}); + $('#auto_divide').prop({ + 'checked': false, + 'disabled': true + }); + $('#apply_to_similar').prop({ + 'checked': false, + 'disabled': true + }); } else { $('#auto_divide').prop('disabled', false); @@ -935,14 +1043,14 @@ function bDivide() { } function clearDivideLayers() { - if (subregionsLayer != null) { - map.removeLayer(subregionsLayer); - subregionsLayer = null; - } - if (clustersLayer != null) { - map.removeLayer(clustersLayer); - clustersLayer = null; - } + if (subregionsLayer != null) { + map.removeLayer(subregionsLayer); + subregionsLayer = null; + } + if (clustersLayer != null) { + map.removeLayer(clustersLayer); + clustersLayer = null; + } } function bDividePreview() { @@ -952,54 +1060,63 @@ function bDividePreview() { return; } clearDivideLayers(); - $('#d_count').hide(); - $('#b_divide_do').hide(); - var apply_to_similar= $('#apply_to_similar').prop('checked'); + $('#d_count').hide(); + $('#b_divide_do').hide(); + var apply_to_similar = $('#apply_to_similar').prop('checked'); var params = { 'id': divSelectedId, - 'next_level': $('#next_level').val(), + 'next_level': $('#next_level').val(), 'auto_divide': auto_divide, 'apply_to_similar': apply_to_similar - }; + }; if (auto_divide) { params['mwm_size_thr'] = parseInt($('#mwm_size_thr').val()) * 1024; } - $.ajax(getServer('divide_preview'), { - data: params, - success: makeAnswerHandler(bDivideDrawPreview) - }); + $.ajax(getServer('divide_preview'), { + data: params, + success: makeAnswerHandler(bDivideDrawPreview) + }); } function bDivideDrawPreview(response) { var subregions = response.subregions; var clusters = response.clusters; - if( !('features' in subregions) || !subregions.features.length ) { - $('#d_count').text('Нет областей').show(); - return; - } - subregionsLayer = L.geoJson(subregions, { - style: function(f) { - return { color: 'blue', weight: 1, fill: false }; - } - }); - map.addLayer(subregionsLayer); + if (!('features' in subregions) || !subregions.features.length) { + $('#d_count').text('Нет областей').show(); + return; + } + subregionsLayer = L.geoJson(subregions, { + style: function(f) { + return { + color: 'blue', + weight: 1, + fill: false + }; + } + }); + map.addLayer(subregionsLayer); subregionsLayer.bringToFront(); - if (clusters) { + if (clusters) { clustersLayer = L.geoJson(clusters, { style: function(f) { - return { color: 'black', weight: 2, fill: false }; + return { + color: 'black', + weight: 2, + fill: false + }; } }); map.addLayer(clustersLayer); clustersLayer.bringToFront(); } - var subregions_count_text = '' + subregions.features.length + ' подрегионов'; + var subregions_count_text = '' + subregions.features.length + + ' подрегионов'; var show_divide_button = (subregions.features.length > 1); if (clusters) { subregions_count_text += ', ' + clusters.features.length + ' кластеров'; show_divide_button = (clusters.features.length > 1); } - $('#d_count').text(subregions_count_text).show(); + $('#d_count').text(subregions_count_text).show(); if (show_divide_button) $('#b_divide_do').show(); else @@ -1008,111 +1125,133 @@ function bDivideDrawPreview(response) { function bDivideDo() { var auto_divide = $('#auto_divide').prop('checked'); - var apply_to_similar= $('#apply_to_similar').prop('checked'); + var apply_to_similar = $('#apply_to_similar').prop('checked'); var params = { 'id': divSelectedId, - 'next_level': $('#next_level').val(), + 'next_level': $('#next_level').val(), 'auto_divide': auto_divide, 'apply_to_similar': apply_to_similar - }; + }; if (auto_divide) { params['mwm_size_thr'] = parseInt($('#mwm_size_thr').val()) * 1024; } - $.ajax(getServer('divide'), { - data: params, - success: updateBorders - }); - bDivideCancel(); + $.ajax(getServer('divide'), { + data: params, + success: updateBorders + }); + bDivideCancel(); } function bDivideCancel() { clearDivideLayers(); - divSelectedId = null; - $('#divide').hide(); - $('#actions').show(); + divSelectedId = null; + $('#divide').hide(); + $('#actions').show(); } function bLargest() { - if( !selectedId || !(selectedId in borders) ) - return; - $.ajax(getServer('chop1'), { - data: { 'id': selectedId }, - success: makeAnswerHandler(updateBorders) - }); + if (!selectedId || !(selectedId in borders)) + return; + $.ajax(getServer('chop1'), { + data: { + 'id': selectedId + }, + success: makeAnswerHandler(updateBorders) + }); } function bHull() { - if( !selectedId || !(selectedId in borders) ) - return; - $.ajax(getServer('hull'), { - data: { 'id': selectedId }, - success: makeAnswerHandler(updateBorders) - }); + if (!selectedId || !(selectedId in borders)) + return; + $.ajax(getServer('hull'), { + data: { + 'id': selectedId + }, + success: makeAnswerHandler(updateBorders) + }); } function bBackup() { - $('#actions').css('display', 'none'); - $('#backup_saving').css('display', 'none'); - $('#backup_restoring').css('display', 'none'); - $('#backup_save').attr('disabled', false); - $('#backup_list').text(''); - $('#backup').css('display', 'block'); - $.ajax(getServer('backlist'), { - success: updateBackupList - }); + $('#actions').css('display', 'none'); + $('#backup_saving').css('display', 'none'); + $('#backup_restoring').css('display', 'none'); + $('#backup_save').attr('disabled', false); + $('#backup_list').text(''); + $('#backup').css('display', 'block'); + $.ajax(getServer('backlist'), { + success: updateBackupList + }); } function bBackupCancel() { - $('#actions').css('display', 'block'); - $('#backup').css('display', 'none'); + $('#actions').css('display', 'block'); + $('#backup').css('display', 'none'); } function updateBackupList(data) { - var list = $('#backup_list'); - list.text(''); - if( !data || !('backups' in data) ) - return; - for( var i = 0; i < data.backups.length; i++ ) { - var b = data.backups[i]; - var a = document.createElement('a'); - a.href = '#'; - a.onclick = (function(id, name) { return function() { bBackupRestore(id); return false } })(b['timestamp']); - $(a).text(b['text'] + ' (' + b['count'] + ')'); - if( i > 0 ) { - var d = document.createElement('a'); - d.className = 'back_del'; - d.href = '#'; - d.onclick = (function(id, name) { return function() { bBackupDelete(id); return false } })(b['timestamp']); - $(d).text('[x]'); - list.append(a, document.createTextNode(' '), d, $('
')); - } else { - list.append(a, $('
')); - } - } + var list = $('#backup_list'); + list.text(''); + if (!data || !('backups' in data)) + return; + for (var i = 0; i < data.backups.length; i++) { + var b = data.backups[i]; + var a = document.createElement('a'); + a.href = '#'; + a.onclick = (function(id, name) { + return function() { + bBackupRestore(id); + return false + } + })(b['timestamp']); + $(a).text(b['text'] + ' (' + b['count'] + ')'); + if (i > 0) { + var d = document.createElement('a'); + d.className = 'back_del'; + d.href = '#'; + d.onclick = (function(id, name) { + return function() { + bBackupDelete(id); + return false + } + })(b['timestamp']); + $(d).text('[x]'); + list.append(a, document.createTextNode(' '), d, $('
')); + } + else { + list.append(a, $('
')); + } + } } function bBackupSave() { - $.ajax(getServer('backup'), { - success: bBackupCancel - }); - $('#backup_save').attr('disabled', true); - $('#backup_saving').css('display', 'block'); + $.ajax(getServer('backup'), { + success: bBackupCancel + }); + $('#backup_save').attr('disabled', true); + $('#backup_saving').css('display', 'block'); } function bBackupRestore(timestamp) { - $.ajax(getServer('restore'), { - data: { 'timestamp': timestamp }, - success: function() { bBackupCancel(); updateBorders(); } - }); - $('#backup_list').text(''); - $('#backup_restoring').css('display', 'block'); + $.ajax(getServer('restore'), { + data: { + 'timestamp': timestamp + }, + success: function() { + bBackupCancel(); + updateBorders(); + } + }); + $('#backup_list').text(''); + $('#backup_restoring').css('display', 'block'); } function bBackupDelete(timestamp) { - $.ajax(getServer('backdelete'), { - data: { 'timestamp': timestamp } - }); - bBackupCancel(); + $.ajax(getServer('backdelete'), { + data: { + 'timestamp': timestamp + } + }); + bBackupCancel(); } function getPolyDownloadLink(use_bbox) { @@ -1137,11 +1276,11 @@ function startOver() { finishChooseParent(); bSplitCancel(); bJoinCancel(); - bJoinToParentCancel(); - bPointCancel(); - bDivideCancel(); + bJoinToParentCancel(); + bPointCancel(); + bDivideCancel(); bBackupCancel(); - selectLayer(null); + selectLayer(null); $('#wait_start_over').show(); $.ajax(getServer('start_over'), { success: makeAnswerHandler(function() { diff --git a/web/app/static/config.js b/web/app/static/config.js index 2d7f45e..ba2c365 100644 --- a/web/app/static/config.js +++ b/web/app/static/config.js @@ -1,3 +1,5 @@ +const JOSM_IMPORT_LISTEN_ADDRESS = 'http://127.0.0.1:8111/import'; + const BYTES_FOR_NODE = 8; const IMPORT_ENABLED = true; @@ -9,8 +11,8 @@ const API_URL = SELF_URL; function getServer(endpoint, base_url) { - var url = base_url ? base_url : API_URL; - if (endpoint) - url += '/' + endpoint; - return url; + var url = base_url ? base_url : API_URL; + if (endpoint) + url += '/' + endpoint; + return url; } diff --git a/web/app/static/stat.js b/web/app/static/stat.js index 7438e81..62aa2eb 100644 --- a/web/app/static/stat.js +++ b/web/app/static/stat.js @@ -1,157 +1,206 @@ -var MB_LIMIT = 50, MB_LIMIT2 = 70; -var KM_LIMIT = 50, POINT_LIMIT = 50000; +var MB_LIMIT = 50, + MB_LIMIT2 = 70; +var KM_LIMIT = 50, + POINT_LIMIT = 50000; function statInit() { - $('.mb_limit').text(MB_LIMIT); - $('.mb_limit2').text(MB_LIMIT2); - $('.km_limit').text(KM_LIMIT); - $('.point_limit').text(Math.round(POINT_LIMIT / 1000)); - statQuery('total', statTotal); + $('.mb_limit').text(MB_LIMIT); + $('.mb_limit2').text(MB_LIMIT2); + $('.km_limit').text(KM_LIMIT); + $('.point_limit').text(Math.round(POINT_LIMIT / 1000)); + statQuery('total', statTotal); } function statOpen(id) { - var div = document.getElementById(id); - if( div.style.display != 'block' ) - div.style.display = 'block'; - else - div.style.display = 'none'; + var div = document.getElementById(id); + if (div.style.display != 'block') + div.style.display = 'block'; + else + div.style.display = 'none'; } function statQuery(id, callback) { - $.ajax(getServer('stat'), { - data: { 'group': id }, - success: function(data) { - callback(data); - document.getElementById(id).style.display = 'block'; - }, - error: function() { alert('Failed!'); } - }); + $.ajax(getServer('stat'), { + data: { + 'group': id + }, + success: function(data) { + callback(data); + document.getElementById(id).style.display = 'block'; + }, + error: function() { + alert('Failed!'); + } + }); } function formatNum(value, digits) { - if( digits != undefined ) { - var pow = Math.pow(10, digits); - return Math.round(value * pow) / pow; - } else - return value; + if (digits != undefined) { + var pow = Math.pow(10, digits); + return Math.round(value * pow) / pow; + } + else + return value; } function statFill(id, value, digits) { - document.getElementById(id).innerHTML = ('' + formatNum(value, digits)).replace('&', '&').replace('<', '<'); + document.getElementById(id).innerHTML = ('' + formatNum(value, digits)) + .replace('&', '&').replace('<', '<'); } function getIndexLink(region) { - var big = region.area > 1000; - return 'index.html#' + (big ? 8 : 12) + '/' + region.lat + '/' + region.lon; + var big = region.area > 1000; + return 'index.html#' + (big ? 8 : 12) + '/' + region.lat + '/' + region.lon; } function statFillList(id, regions, comment, count) { - var div = document.getElementById(id), i, a, html, p; - if( !div ) { - console.log('Div ' + id + ' not found'); - return; - } - if( count ) - statFill(count, regions.length); - for( i = 0; i < regions.length; i++ ) { - a = document.createElement('a'); - a.href = getIndexLink(regions[i]); - a.target = '_blank'; - html = regions[i].name; - if( comment ) { - if( typeof comment == 'string' ) - p = regions[i][comment]; - else - p = comment(regions[i]); - if( p ) - html += ' (' + p + ')'; - } - a.innerHTML = html.replace('&', '&').replace('<', '<'); - div.appendChild(a); - div.appendChild(document.createElement('br')); - } + var div = document.getElementById(id), + i, a, html, p; + if (!div) { + console.log('Div ' + id + ' not found'); + return; + } + if (count) + statFill(count, regions.length); + for (i = 0; i < regions.length; i++) { + a = document.createElement('a'); + a.href = getIndexLink(regions[i]); + a.target = '_blank'; + html = regions[i].name; + if (comment) { + if (typeof comment == 'string') + p = regions[i][comment]; + else + p = comment(regions[i]); + if (p) + html += ' (' + p + ')'; + } + a.innerHTML = html.replace('&', '&').replace('<', '<'); + div.appendChild(a); + div.appendChild(document.createElement('br')); + } } function statTotal(data) { - statFill('total_total', data.total); - statQuery('sizes', statSizes); + statFill('total_total', data.total); + statQuery('sizes', statSizes); } function statSizes(data) { - var list_1mb = [], list_50mb = [], list_100mb = []; - var list_spaces = [], list_bad = []; - var list_100km = [], list_100kp = [], list_zero = []; - var list_100p = []; - var list_disabled = [], list_commented = []; + var list_1mb = [], + list_50mb = [], + list_100mb = []; + var list_spaces = [], + list_bad = []; + var list_100km = [], + list_100kp = [], + list_zero = []; + var list_100p = []; + var list_disabled = [], + list_commented = []; - for( var i = 0; i < data.regions.length; i++ ) { - region = data.regions[i]; - if( region.area > 0 && region.area < KM_LIMIT ) - list_100km.push(region); - if( region.area <= 0 ) - list_zero.push(region); - if( region.nodes > POINT_LIMIT ) - list_100kp.push(region); - if( region.nodes < 50 ) - list_100p.push(region); - var size_mb = region.size * window.BYTES_FOR_NODE / 1024 / 1024; - region.size_mb = size_mb; - if( size_mb < 1 ) - list_1mb.push(region); - if( size_mb > MB_LIMIT ) - list_50mb.push(region); - if( size_mb > MB_LIMIT2 ) - list_100mb.push(region); - if( !/^[\x20-\x7F]*$/.test(region.name) ) - list_bad.push(region); - if( region.name.indexOf(' ') >= 0 ) - list_spaces.push(region); - if( region.disabled ) - list_disabled.push(region); - if( region.commented ) - list_commented.push(region); - } + for (var i = 0; i < data.regions.length; i++) { + region = data.regions[i]; + if (region.area > 0 && region.area < KM_LIMIT) + list_100km.push(region); + if (region.area <= 0) + list_zero.push(region); + if (region.nodes > POINT_LIMIT) + list_100kp.push(region); + if (region.nodes < 50) + list_100p.push(region); + var size_mb = region.size * window.BYTES_FOR_NODE / 1024 / 1024; + region.size_mb = size_mb; + if (size_mb < 1) + list_1mb.push(region); + if (size_mb > MB_LIMIT) + list_50mb.push(region); + if (size_mb > MB_LIMIT2) + list_100mb.push(region); + if (!/^[\x20-\x7F]*$/.test(region.name)) + list_bad.push(region); + if (region.name.indexOf(' ') >= 0) + list_spaces.push(region); + if (region.disabled) + list_disabled.push(region); + if (region.commented) + list_commented.push(region); + } - statFill('names_spaces', list_spaces.length); - statFillList('names_bad_list', list_bad, null, 'names_bad'); - statFillList('total_disabled_list', list_disabled, null, 'total_disabled'); - statFillList('total_commented_list', list_commented, null, 'total_commented'); + statFill('names_spaces', list_spaces.length); + statFillList('names_bad_list', list_bad, null, 'names_bad'); + statFillList('total_disabled_list', list_disabled, null, 'total_disabled'); + statFillList('total_commented_list', list_commented, null, + 'total_commented'); - list_1mb.sort(function(a, b) { return a.size_mb - b.size_mb; }); - list_50mb.sort(function(a, b) { return a.size_mb - b.size_mb; }); - list_100mb.sort(function(a, b) { return b.size_mb - a.size_mb; }); - statFillList('sizes_1mb_list', list_1mb, function(r) { return formatNum(r.size_mb, 2) + ' МБ'; }, 'sizes_1mb'); - statFillList('sizes_50mb_list', list_50mb, function(r) { return formatNum(r.size_mb, 0) + ' МБ'; }, 'sizes_50mb'); - statFillList('sizes_100mb_list', list_100mb, function(r) { return formatNum(r.size_mb, 0) + ' МБ'; }, 'sizes_100mb'); + list_1mb.sort(function(a, b) { + return a.size_mb - b.size_mb; + }); + list_50mb.sort(function(a, b) { + return a.size_mb - b.size_mb; + }); + list_100mb.sort(function(a, b) { + return b.size_mb - a.size_mb; + }); + statFillList('sizes_1mb_list', list_1mb, function(r) { + return formatNum(r.size_mb, 2) + ' МБ'; + }, 'sizes_1mb'); + statFillList('sizes_50mb_list', list_50mb, function(r) { + return formatNum(r.size_mb, 0) + ' МБ'; + }, 'sizes_50mb'); + statFillList('sizes_100mb_list', list_100mb, function(r) { + return formatNum(r.size_mb, 0) + ' МБ'; + }, 'sizes_100mb'); - list_100km.sort(function(a, b) { return a.area - b.area; }); - list_100kp.sort(function(a, b) { return b.nodes - a.nodes; }); - list_100p.sort(function(a, b) { return a.nodes - b.nodes; }); - statFillList('areas_100km_list', list_100km, function(r) { return formatNum(r.area, 2) + ' км²'; }, 'areas_100km'); - statFillList('areas_50k_points_list', list_100kp, 'nodes', 'areas_50k_points'); - statFillList('areas_100_points_list', list_100p, 'nodes', 'areas_100_points'); - statFillList('areas_0_list', list_zero, null, 'areas_0'); + list_100km.sort(function(a, b) { + return a.area - b.area; + }); + list_100kp.sort(function(a, b) { + return b.nodes - a.nodes; + }); + list_100p.sort(function(a, b) { + return a.nodes - b.nodes; + }); + statFillList('areas_100km_list', list_100km, function(r) { + return formatNum(r.area, 2) + ' км²'; + }, 'areas_100km'); + statFillList('areas_50k_points_list', list_100kp, 'nodes', + 'areas_50k_points'); + statFillList('areas_100_points_list', list_100p, 'nodes', + 'areas_100_points'); + statFillList('areas_0_list', list_zero, null, 'areas_0'); - statQuery('topo', statTopo); + statQuery('topo', statTopo); } function statTopo(data) { - var list_holed = [], list_multi = [], list_100km = []; - for( var i = 0; i < data.regions.length; i++ ) { - region = data.regions[i]; - if( region.outer > 1 ) - list_multi.push(region); - if( region.inner > 0 ) - list_holed.push(region); - if( region.outer > 1 && region.min_area > 0 && region.min_area < KM_LIMIT ) - list_100km.push(region); - } + var list_holed = [], + list_multi = [], + list_100km = []; + for (var i = 0; i < data.regions.length; i++) { + region = data.regions[i]; + if (region.outer > 1) + list_multi.push(region); + if (region.inner > 0) + list_holed.push(region); + if (region.outer > 1 && region.min_area > 0 && region.min_area < + KM_LIMIT) + list_100km.push(region); + } - list_multi.sort(function(a, b) { return b.outer - a.outer; }); - list_holed.sort(function(a, b) { return b.inner - a.inner; }); - list_100km.sort(function(a, b) { return a.min_area - b.min_area; }); - statFillList('topo_holes_list', list_holed, 'inner', 'topo_holes'); - statFillList('topo_multi_list', list_multi, 'outer', 'topo_multi'); - statFillList('topo_100km_list', list_100km, function(r) { return formatNum(r.min_area, 2) + ' км²'; }, 'topo_100km'); + list_multi.sort(function(a, b) { + return b.outer - a.outer; + }); + list_holed.sort(function(a, b) { + return b.inner - a.inner; + }); + list_100km.sort(function(a, b) { + return a.min_area - b.min_area; + }); + statFillList('topo_holes_list', list_holed, 'inner', 'topo_holes'); + statFillList('topo_multi_list', list_multi, 'outer', 'topo_multi'); + statFillList('topo_100km_list', list_100km, function(r) { + return formatNum(r.min_area, 2) + ' км²'; + }, 'topo_100km'); } diff --git a/web/app/templates/index.html b/web/app/templates/index.html index 307a6d1..e595049 100644 --- a/web/app/templates/index.html +++ b/web/app/templates/index.html @@ -1,229 +1,346 @@ - - - Редактор границ для MAPS.ME - - - - - - - - - - -
- -
-
-
-
-
-
- - -
- -
-
- -
-
-
-
- Название ▼: - -
-
- - -
- -
-
- Оценка размера по точкам:
- Оценка размера по нас+пл:
- Последняя правка:
- Количество точек:
- Площадь: км²
- - Комментарий:
-
- - Очистить -
-
-
-
- Выбрана область .

- Нарисуйте линию через выбранную область (повторный клик на последней точке для завершения), затем нажмите кнопку
-
- - -
-
- -
-
- -
-
- Выбрана область .

- Выберите область, которую к ней присоединить.
-
- Выбрана:
- -
-
- -
-
- Выбрана область .
- Родительская область .

-
-
- -
-
- Переместите маркер в нужную точку и нажмите
-
- Название
-
-
- -
-
- Выбранная область - будет заменена вложенными областями уровня - .
-
-
- - -
- Верхняя граница размера mwm: - Мб -
+ + + +
+ +
+
+ +
+
+
+
+ + +
+ + +
+ +
+ + +
+ +
+
+
+ Название ▼: + +
+
+ +
- - + Родитель + ▼: +
-
-
- -
- -
-
- -
Копирую границы...
-
Восстанавливаю границы...
-
Или выберите набор границ для восстановления:
-
- -
-
-
- +
+
+ Оценка размера по точкам:
+ Оценка размера по нас+пл:
+ Последняя правка:
+ Количество точек:
+ Площадь: км²
+ + Комментарий:
+
+ + Очистить +
+
+
+
+ Выбрана область .

+ Нарисуйте линию через выбранную область (повторный клик на последней точке для завершения), затем нажмите кнопку
+
+ + +
+ +
+ +
+
+ +
+
+ Выбрана область .

+ Выберите область, которую к ней присоединить.
+
+ Выбрана:
+ +
+
+ +
+
+ Выбрана область .
+ Родительская область .

+ +
+ +
+ +
+
+ Переместите маркер в нужную точку и нажмите
+ +
+ Название
+
+
+ +
+
+ Выбранная область + будет заменена вложенными областями уровня + .
+
+
+ + +
+ Верхняя граница размера mwm: + Мб +
+
+
+ + +
+ +
+
+ +
+ +
+
+ +
Копирую границы...
+
Восстанавливаю границы...
+
Или выберите набор границ для восстановления:
+
+ +
+
+
+ diff --git a/web/app/templates/stat.html b/web/app/templates/stat.html index a888083..4bf6256 100644 --- a/web/app/templates/stat.html +++ b/web/app/templates/stat.html @@ -1,61 +1,97 @@ - - - Статистика границ для MAPS.ME - - - - - - -

Статистика по границам

-
- Всего границ:
-
-
-
- Отключено из сборки: (список)
-
- Прокомментировано: (список)
-
-
-
- Названий с пробелами:
- Названий с левыми символами: (список)
-
-
-
- Размер MWM до 1 МБ: (список)
-
- Размер MWM больше МБ: (список)
-
- Из них больше МБ: (список)
-
-
-
- Регионов меньше км²: (список)
-
- Регионов от тысяч точек в контуре: (список)
-
- Регионов до 50 точек в контуре: (список)
-
- Регионов с неизвестной площадью: (список)
-
-
-
-
- Регионов с дырками: (список)
-
- Регионов из нескольких частей: (список)
-
- Регионов с островами меньше км²: (список)
-
-
-
- + + + + Статистика границ для MAPS.ME + + + + + + + +

Статистика по границам

+
+ Всего границ:
+
+
+
+ Отключено из сборки: (список)
+
+ Прокомментировано: (список)
+
+
+
+ Названий с пробелами:
+ Названий с левыми символами: (список)
+
+
+
+ Размер MWM до 1 МБ: (список)
+
+ Размер MWM больше МБ: (список)
+
+ Из них больше МБ: (список)
+
+
+
+ Регионов меньше км²: (список)
+
+ Регионов от тысяч точек в контуре: + (список)
+
+ Регионов до 50 точек в контуре: + (список)
+
+ Регионов с неизвестной площадью: (список)
+
+
+
+
+ Регионов с дырками: (список)
+
+ Регионов из нескольких частей: (список)
+
+ Регионов с островами меньше км²: (список)
+
+
+
+ +