Passa ai contenuti principali

Lavori Pubblici

Come un Assessore ai Lavori Pubblici può tenere traccia degli interventi e mostrare in tempo quasi-reale l'uso dei soldi in bilancio ai suoi concittadini.

La solfa è sempre quella già vista in altri post:

1. Creare uno spreadsheet googleSheets con File-Impostazioni : Regno  Unito (per via delle virgole e dei punti come separatori decimali accettati da umap)


2. Intestare le colonne senza dimenticare in fondo a destra le tre colonne con : l'indirizzo dell'intervento ,  lat  e long.

(a questo punto vedere più sotto lo script che calcola latitudine e longitudine in automatico, se non si vuole perdere tempo a metterle da soli)

3. compilare le righe, una per intervento




4. pubblicare (File-Pubblica sul Web) il foglio  dello spreadsheet come csv e copiare il link che viene presentato (da incollare nella umap successivamente)

5. Creare una mappa umap e collegare Dati Remoti incollando  il link del punto 4. Formato: csv e Dinamico su "ON", così la mappa si aggiornerà ogni volta che si aggiungerà una riga nuova allo spreadsheet



6. per mostrare nel popup le informazioni scrivere nel campo "Template del contenuto del popup" le intestazioni delle colonne fra parentesi graffe; cancelletto # se si vuole il grassetto


# {intervento}
{data}
{indirizzo}
{costo}



la mappa apparirà così:


Visualizza a schermo intero


Osservazioni:
1. se esiste già un file di testo con le informazioni (data, indirizzo, impresa, costo etc) , questo può essere importato tramite GoogleSheets (File-Importa) in un altro foglio e poi le info copiate nel foglio che è collegato alla mappa; l'importante è che esistano le colonne lat long che servono ad umap per mettere i segnaposto



2. Siccome il comune è sempre quello, si può evitare di scrivere sempre "Crema" usando una formula che concateni indirizzo e la parola "Crema"

3. si può anche creare il modulo google corrispondente:
https://docs.google.com/forms/d/e/1FAIpQLSe4PASXtHrHQ0BeGHMiW0cWwVXcf_JUJDGiFwPa30RKEPJKWQ/viewform



PER I PIU' PIGRI.

Lo script per calcolare le coordinate senza doverle trovare a mano è il seguente (tratto da https://github.com/nuket/google-sheets-geocoding-macro/edit/master/Code.gs). Occhio che contiene due funzioni una che ricava lat,long dall'indirizzo e una che ricava l'indirizzo dalla latitudine e longitudine. A noi serve ovviamente la prima.
Abilitare lo script quando google lo chiede.
Chiudere foglio e riaprirlo.
Per far convertire, selezionare le celle e cliccare in alto Geocode e poi la prima funzione (Address to Latitude, Longitude)


SCRIPT:

// Geocode Addresses
// Copyright (c) 2016 - 2017 Max Vilimpoc
//

function getGeocodingRegion() {
  return PropertiesService.getDocumentProperties().getProperty('GEOCODING_REGION') || 'us';
}



// Forward Geocoding -- convert address to GPS position.
function addressToPosition() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cells = sheet.getActiveRange();
  
  var popup = SpreadsheetApp.getUi();
  
  // Must have selected at least 3 columns (Address, Lat, Lng).
  // Must have selected at least 1 row.
  
  var columnCount = cells.getNumColumns();
  var rowCount = cells.getNumRows();

  if (columnCount < 3) {
    popup.alert("Select at least 3 columns: Address in the leftmost column(s); the geocoded Latitude, Longitude will go into the last 2 columns.");
    return;
  }
  
  var addressRow;

//  var addressColumnStart = 1; // Address data is in columns [1 .. columnCount - 2].
//  var addressColumnStop  = columnCount - 2; 
  
  var addressColumn;
  
  var latColumn = columnCount - 1; // Latitude  goes into the next-to-last column.
  var lngColumn = columnCount;     // Longitude goes into the last column.
  
  var geocoder = Maps.newGeocoder().setRegion(getGeocodingRegion());
  var location;

  var addresses = sheet.getRange(cells.getRow(), cells.getColumn(), rowCount, columnCount - 2).getValues();
  
  // For each row of selected data...
  for (addressRow = 1; addressRow <= rowCount; ++addressRow) {
    var address = addresses[addressRow - 1].join(' ');

    // Replace problem characters.
    address = address.replace(/'/g, "%27");

    Logger.log(address);
    
    // Geocode the address and plug the lat, lng pair into the 
    // last 2 elements of the current range row.
    location = geocoder.geocode(address);
   
    // Only change cells if geocoder seems to have gotten a 
    // valid response.
    if (location.status == 'OK') {
      lat = location["results"][0]["geometry"]["location"]["lat"];
      lng = location["results"][0]["geometry"]["location"]["lng"];
      
      cells.getCell(addressRow, latColumn).setValue(lat);
      cells.getCell(addressRow, lngColumn).setValue(lng);
    } else {
      Logger.log(location.status);
    }
  }
};

// Reverse Geocode -- GPS position to nearest address.
function positionToAddress() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cells = sheet.getActiveRange();

  var popup = SpreadsheetApp.getUi();
  
  // Must have selected at least 3 columns (Address, Lat, Lng).
  // Must have selected at least 1 row.

  var columnCount = cells.getNumColumns();

  if (columnCount < 3) {
    popup.alert("Select at least 3 columns: Latitude, Longitude in the first 2 columns; the reverse-geocoded Address will go into the last column.");
    return;
  }

  var latColumn     = 1;
  var lngColumn     = 2;

  var addressRow;
  var addressColumn = columnCount;

  var geocoder = Maps.newGeocoder().setRegion(getGeocodingRegion());
  var location;
  
  for (addressRow = 1; addressRow <= cells.getNumRows(); ++addressRow) {
    var lat = cells.getCell(addressRow, latColumn).getValue();
    var lng = cells.getCell(addressRow, lngColumn).getValue();
    
    // Geocode the lat, lng pair to an address.
    location = geocoder.reverseGeocode(lat, lng);
   
    // Only change cells if geocoder seems to have gotten a 
    // valid response.
    Logger.log(location.status);
    if (location.status == 'OK') {
      var address = location["results"][0]["formatted_address"];

      cells.getCell(addressRow, addressColumn).setValue(address);
    }
  }
};

function generateMenu() {
  // var setGeocodingRegionMenuItem = 'Set Geocoding Region (Currently: ' + getGeocodingRegion() + ')';
  
  // {
  //   name: setGeocodingRegionMenuItem,
  //   functionName: "promptForGeocodingRegion"
  // },
  
  var entries = [{
    name: "Geocode Selected Cells (Address to Latitude, Longitude)",
    functionName: "addressToPosition"
  },
  {
    name: "Geocode Selected Cells (Latitude, Longitude to Address)",
    functionName: "positionToAddress"
  }];
  
  return entries;
}

function updateMenu() {
  SpreadsheetApp.getActiveSpreadsheet().updateMenu('Geocode', generateMenu())
}

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the readRows() function specified above.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 *
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('Geocode', generateMenu());
  // SpreadsheetApp.getActiveSpreadsheet().addMenu('Region',  generateRegionMenu());
  // SpreadsheetApp.getUi()
  //   .createMenu();
};


per esempio di uso nominatim

Commenti

Post popolari in questo blog

UMAP: mappare con fotografie nel popup

Premessa: come esempio non userò alberi perché non ho il tempo di uscire , ma foto di Crema del passato prese da Gruppi facebook. I dati saranno messi in un Google Sheet: ogni riga un segnaposto sulla mappa ogni colonna una proprietà del segnaposto della mappa per il tutorial di un prof per alunni delle medie, vedere qui:   https://sites.google.com/view/lucascalzullo/tutorial/umap  Cosa serve modificare nel LAYER della mappa? 1. La cosa che si vuol far apparire quando il mouse passa sopra il segnaposto (in questo caso l'autore ) 2. l'elenco delle colonne da importare nel popup , okkio al numero di parentesi graffe: 3 per le foto le possibilità sono: *asterisco per l'italico* **due asterischi per il testo marcato** # un cancelletto per l'intestazione principale ## due cancelletti per le intestazioni di secondo livello ### tre cancelletti per intestazione di terzo livello Link semplice: [[http://example.com]] Link con testo: [[http://example.com|te

Esportare tracciati (e reimportarli) in umap

------------------  Fase1. Preparare una mappa umap "d'appoggio" in cui lo sfondo è una mappa (*) sulla quale tirare delle linee o poligoni come tracciati che poi verrano esportati in un formato re-importabile in un'altra umap. esempio:  https://umap.openstreetmap.fr/it/map/moruzzi_408788#16/45.3632/9.6832 (*) metodo illustrato qui Fase2. una volta tracciata la linea ( anche più di una linea in realtà), andare sull'unico layer (dove risiede quindi la linea) e scegliere Azioni Avanzate -> Scarica si aprirà un'altra pagina web con il codice geojson : per controllarlo, importarlo (anche con un 'seleziona tutto" e  copia incolla) in geojson.io : (fra l'altro geojson è collegabile a github ) FASE3. salvarlo come 'geojson' nel PC  e importarlo nella umap desiderata cliccando sulla icona "freccia verso l'alto", formato geojson, scegli file risultato

mapwarper e sovrapposizione mappe

come sovrapporre mappe alla mappa di openstreet map? Vediamo come sovrapporre una delle meravigliose mappe di T. Moruzzi alla mappa di Crema su openstreetmap. mura venete , di T Moruzzi Si usa  http://mapwarper.net  . Cliccare sulla linguetta  Upload Map e caricare l'immagine della mappa di Moruzzi. Dopo di che occorre "rettificare" in modo che si adatti (venga "stirata") sulla mappa di osm. Cliccare sulla linguetta Rectify . Appaiono le due mappe una accanto all'altra : per far capire a mapwarper come stirarla occorre piazzare dei punti di riferimento sull'una e sull'altra , usando l'iconcina segnalibro azzurra in alto e poi cliccando sul bottone in basso per aggiungere la coppia di punti e dopo averne piazzati almeno 3 (coppie), cliccare il comando warp image! corrispondenze esecuzione comando Cliccando la linguetta Preview , si possono vedere le mappe una sull'altra, dosando la trasparenza col cursore: