console.log(' %c pp_draw v.0.1 ' ,'font-family:monospace;font-size:20px;color:darkblue;'); console.log(' %c peppepalma @4/2019 ' ,'font-family:monospace;font-size:11px;color:tomato;'); console.info("%cATTENZIONE", "color:Tomato", "\nla libreria presenta le seguenti dipendenze:\n - leaflet.pm.min.js \n - leaflet-control-button-group.js \n - leaflet.table.js \n - leaflet.shpfile.js \n - supagrid.js è stata modifica nella funzione relativa al focus ") //################################################################################ function getProperties(f) { return f.properties; } map.doubleClickZoom.disable(); map.pm.setPathOptions({ color: 'orange', fillColor: 'green', fillOpacity: 0.4, }); var table_control = new L.control.Table({}); function addToList(layer){ // NB: aggiungi alla lista layer.addTo(map); var r = /(.*)\.[^.]+$/; var _nameLayer = r.exec(fileName); if (_nameLayer!=null) { tempFileName = _nameLayer[1]; } else { tempFileName ="senza nome"; } panelLayers.addOverlay({active: true, name:tempFileName, layer: layer},tempFileName,"dati locali"); //list.enableButton(7); console.log("Layer ("+tempFileName+") aggiunto alla lista") makeLyrArrList(); } var fields = []; var arrLoadedItem = []; var lyrLoadedItem = lyrLoadedItem || L.geoJson(null, { pointToLayer: function(feature, latlng) { return new L.circle(latlng, { radius:12, fillOpacity: 0.85 }) }, pmIgnore: false, onEachFeature: function (feature, layer){ layer.on({ click:function (e) { var geom = feature.geometry; if (! map.pm.globalRemovalEnabled()){ if (globalSelect!=true) { // FIXME: trovare come bloccare il delete lyrSelected.addData(geom); lyrSelected.bringToFront(); lyrSelected.setStyle(selectedStyleOption); lyrSelected.addTo(map); } else { lyrSelectedItem.addData(geom); lyrSelectedItem.bringToFront(); lyrSelectedItem.setStyle(selectSTyleOption); lyrSelectedItem.addTo(map); } } attivaBottoni(); } }); if (feature.properties) { layer.bindPopup("id: "+feature.properties.id); } } }); // ############################################################### MODIFICATO var lyrSelectedItem = lyrSelectedItem || L.geoJson(null, { pointToLayer: function(feature, latlng) { return new L.circle(latlng, { radius: 16, fillOpacity: 0.85 }) }, pmIgnore: true, onEachFeature: function (feature, layer){ layer.on({ click:function (e) { console.log("lyrSelectedItem-->") lyrSelectedItem.removeLayer(e.target._leaflet_id); } }); } }); var lyrSelected = lyrSelected || L.geoJson(null, { pointToLayer: function(feature, latlng) { return new L.circle(latlng, { radius: 16, fillOpacity: 0.85 }) }, pmIgnore: true, onEachFeature: function (feature, layer){ layer.on({ click:function (e) { console.log("lyrSelected-->") lyrSelected.removeLayer(e.target._leaflet_id); } }); } }); // ############################################################################# var jsnSelectedItem; var lyrLoadedItemBuffer = L.geoJson(null, { pmIgnore: false}); var jsnLoadedItemBuffer; var lyrLoadedItemEnvelop; var jsnLoadedItemEnvelop; var selectSTyleOption = {color :'yellow',weight: 7, dashArray: '6 3', fillOpacity: 0}; //########## file da disco ####################################################### //########################################################## NB: save file on disk function saveSingleFile() { var json = lyrLoadedItem.toGeoJSON(); json.propToView = propToView; var data = JSON.stringify(json, null, 4); console.log(data) //console.log(data) var blob = new Blob( [ data ], { type: 'application/json' }); url = URL.createObjectURL( blob ); var link = document.createElement( 'a' ); link.setAttribute( 'href', url ); link.setAttribute( 'download', saveFileName ); var event = document.createEvent( 'MouseEvents' ); event.initMouseEvent( 'click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null); link.dispatchEvent( event ); } function zoomToXY(){ var coordinate = $("#xycoords").val().split(","); console.log(coordinate[0],coordinate[1]) zoomTo(coordinate[0],coordinate[1],17,1) } function readSingleFile(e) { var file = e.target.files[0]; if (!file) { return; } fileName = file.name; var r = /(.*)\.[^.]+$/; var _nameLayer = r.exec(fileName); tempFileName = _nameLayer[1]; console.log("file path: ",file.name) var reader = new FileReader(); if (file.name.slice(-3) === 'zip') { //########################################################## NB: load file from disk //###### load zip file ################################# reader.onload = function(e) { var contents = e.target.result; shp(contents).then(function(geojson){ if (! jQuery.isEmptyObject(lyrLoadedItem._layers)) { panelLayers.removeLayer({name:tempFileName ,layer: lyrLoadedItem}); lyrLoadedItem.clearLayers(); } console.log("zip loaded... "); for (var item in geojson.features){ var feature = geojson.features[item]; feature.properties.id = L.stamp(geojson.features[item]); feature.properties._modified = false; feature._polygonId = L.stamp(geojson.features[item]); } lyrLoadedItem.addData(geojson); addToList(lyrLoadedItem); setActive(); }); } reader.readAsArrayBuffer(file); } else if (file.name.slice(-4) === 'json'){ //###### load geoJSON file ############################# reader.onload = function(e) { var contents = e.target.result; var geojson = JSON.parse(contents) if (! jQuery.isEmptyObject(lyrLoadedItem._layers)) { panelLayers.removeLayer({name:tempFileName ,layer: lyrLoadedItem}); lyrLoadedItem.clearLayers(); } console.log("json loaded... "); lyrLoadedItem.addData(geojson); lyrLoadedItem.eachLayer(function(eve){ var jsnFeature = eve.feature; jsnFeature.properties._modified = false; eve._polygonId = jsnFeature.properties.id; }) addToList(lyrLoadedItem); setActive(); }; reader.readAsText(file); } else if (file.name.slice(-3) === 'gpx') { //###### load gpx file ####################################################### reader.onload = function(e) { var contents = e.target.result; console.log ("gpx file loaded..."); if (! jQuery.isEmptyObject(lyrLoadedItem._layers)) { panelLayers.removeLayer({name:tempFileName ,layer: lyrLoadedItem}); lyrLoadedItem.clearLayers(); } //propToView = []; var gpxLoadedItem = new L.GPX(contents, {async: true, marker_options: { startIconUrl: './src/css/img/pin-icon-start.png', endIconUrl: './src/css/img/pin-icon-end.png', shadowUrl: './src/css/img/pin-shadow.png'}}) .on('loaded', function(e) { map.fitBounds(e.target.getBounds()); alert("distanza: "+gpxLoadedItem.get_distance()+"\ntempo: "+gpxLoadedItem.get_duration_string(gpxLoadedItem.get_total_time())); jsnLoadedItem = gpxLoadedItem.toGeoJSON().features[0].geometry; for (var item in jsnLoadedItem.features){ var feature = jsnLoadedItem.features[item]; feature.properties.id = L.stamp(jsnLoadedItem.features[item]); feature.properties._modified = false; feature._polygonId = feature.properties.id; if (feature.geometry.type!="Point") { var dist = gpxLoadedItem.get_distance()/1000; dist = dist.toFixed(2)+" km "; feature.properties.descrizione = "distanza: "+dist+"\ntempo: "+gpxLoadedItem.get_duration_string(gpxLoadedItem.get_total_time()) } else { feature.properties.descrizione = "start/stop"; } } lyrLoadedItem.addData(jsnLoadedItem); addToList(lyrLoadedItem); }); }; reader.readAsText(file); } //############################################################################## } //############################################################ NB: display table /* * PURPOSE : Crea la lista dei valori degli attributi partendo dalle properties e le rappresenta in una Tabella * PARAMS : geojson - * RETURNS : function - * NOTES : la tabella viene preparata mediante la libreria Supagrid.js . Fare attenzione alle modifiche apportate alla libreria... modificata la funzione on.change() */ function displayContents(geojson) { fields = []; if (!geojson || !geojson.geometry && (!geojson.features || !geojson.features.length)) { } else { rows = geojson.geometry ? [geojson.properties] : geojson.features.map(getProperties); // dati in tabella } for( var j in rows[0] ) { if (($.inArray(j, noFieldsArr.filter(function(string){return string !="id";}) )<0 ) && (j.charAt(0)!="_")) { fields.push(j.replace(/ /g,"_")); // lista nome campi } } // crea tabella var table = new Supagrid({ fields: fields, id_field: ((fields.indexOf("id")>0)?"id":fields[0]), data: rows, on: { change: function(obj) { console.log("table change: ",obj); bindPop(lyrLoadedItem); }, focus: function(obj) { console.log("table focus: ",obj); findFeature(lyrLoadedItem,obj); } } }) var my_table = table; lyrLoadedItem.on('popupopen',function(e){ feature = e.layer.feature; console.log("popup open: ", feature.properties[((fields.indexOf("id")>0)?"id":fields[0])]) my_table.focus(feature.properties[((fields.indexOf("id")>0)?"id":fields[0])]); }); table_control.visibile = true; table_control.addTo(map); table_control.addTable(my_table.supagrid,'my_table',fileName) // $("#closeTable").click(function() { // alert("close") // }); $(table_control.getContainer()).appendTo(".leaflet-control-container:first"); } function findFeature(layer,obj){ jsnLoadedItem = layer.toGeoJSON(); lyrLoadedItem.eachLayer(function(lyr) { highlightFeature(lyr,obj); }); } function highlightFeature(layer,obj) { //if (layer.feature.geometry.type!="Point") layer.setStyle({color: '#3388ff'}) layer.setStyle({color: '#3388ff'}) if (layer.feature._polygonId==obj){ layer.setStyle({color :'tomato'}); //if (layer.feature.geometry.type!="Point") layer.setStyle({color :'tomato'}); } if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) { lyrLoadedItem.bringToFront(); } } function resetFeature() { lyrLoadedItem.eachLayer(function(item) { console.log("Reset style: ",item.feature.geometry.type) item.setStyle({color: '#3388ff'}) // if (item.feature.geometry.type!="Point") item.setStyle({color: '#3388ff'}) }); if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) { // lyrSelectedItem.bringToFront(); } } //########################################################################### //##### BUTTUN LIST ########################################## NB: bottoni funzioni function creaDrawTools(){ // aggiungi bottone editor console.log("PMOptions",jQuery.isEmptyObject(PMOptions)) if (jQuery.isEmptyObject(PMOptions)) PMOptions = { drawMarker: true, drawPolygon: true, editPolygon: false, drawPolyline: true, drawCircle: false, deleteLayer: true, editMode:false }; if (leggiCookie("draw") == "drawON") map.pm.addControls(PMOptions); } // aggiungi bottone funzioni var myButtons = [ {icon:'bacon', hoverColor: 'red', title: "Crea Buffer", //text:'Set marker', separatorBefore:true, containerBefore:false, onClick:bufferButton, hidden:true }, {icon:'object-group', hoverColor: 'red', title: "Unione", //text:'Set marker', separatorBefore:false, containerBefore:false, onClick:unionButton, hidden:true }, {icon:'ruler', hoverColor: 'red', title: "Misura", separatorBefore:false, containerBefore:false, onClick:misureButton }, {icon:'clone', hoverColor: 'red', title: "Incolla", separatorBefore:true, containerBefore:false, onClick:copyButton }, {icon:'expand-arrows-alt', hoverColor: 'red', title: "Zoom to..", containerBefore:false, onClick:extendButton }, {icon:'hand-pointer', hoverColor: 'red', title: "Seleziona", separatorBefore:false, containerBefore:false, onClick:selectButton, selectable: true, disabled: false }, {icon:'trash-alt', hoverColor: 'red', title: "Annulla selezione", separatorBefore:false, containerBefore:false, onClick:clearSelect } ] var list = new L.Control.ButtonGroup({ horizontal:false, separateButtons: false, small: false, equalWidth: true, buttons: myButtons }) list.addTo(map); //############################################################################## //##### AZIONI DI DEFAULT SU MAPPA ########################################### //############################################################### NB: map events map.on('click', function (e) { // lyrSelectedItem.clearLayers(); // CANCELLA I SELEZIONATI // lyrLoadedItemBuffer.clearLayers(); // CANCELLA I BUFFER }); map.on('dblclick', function (e) { lyrSelectedItem.clearLayers(); // CANCELLA I SELEZIONATI lyrLoadedItemBuffer.clearLayers(); // CANCELLA I BUFFER }) lyrSelectedItem.on('contextmenu',function(e){ lyrSelectedItem.removeLayer(e.layer._leaflet_id); }) lyrSelected.on('contextmenu',function(e){ lyrSelected.removeLayer(e.layer._leaflet_id); }) //############################################################################## //##### AGGIUNGI FILE FROM DISK ############################################### //############################################################### NB: loadButton var fileButton = L.control.custom({ // position: 'topright', content : ''+ '
descrizione | ||
---|---|---|
'+(i+1)+' | '+field+' |