Immagini (grandi) da GMaps

 
Immagine che rappresenta l'unione di diverse mappe di google in un unica immagine

Se a qualcuno di voi sono servite delle immagini satellitari, sicuramente siete corsi su gmap, ma l'impossibilità di scaricare le immagini direttamente porta a notevoli problemi, ci sono diversi workaround per risolvere, come andare a stampare il monitor, salvare l'immagine, ritagliarla; se però ci servono mappe che non stanno s di un unica pagina? Qui iniziano i problemi e le perdite di tempo, si passa a sctampare diverse immagini, attaccarle assieme, cosa non certo comoda, soprattutto per avere immagini su grandi formati.

Di recente mi è servito ottenere un immagine da stampare su di un cartellone (A2) per una scuola, quindi serviva un immagine molto grande, all'incirca 50MPx per avere una risoluzione decente per la stampa, per fare questo (odiando perdere tempo per stare li a fare le diverse operazioni a mano), mi sono inventato una serie di script che fanno queste operazioni, vediamo come usarli e ottenere il risultato finale.

Innazitutto dobbiamo avere uno spazio web dove possiamo mettere in esecuzione questo script (PHP) per ottenere le immagini da google (tramite il sevizio Static Maps), e poi dobbiamo avere una chiave di google maps per poter scaricare le immagini sul nostro server. Per ottenere la chiave andiamo alla pagina di richiesta di Google, inseriamo l'indirizzo del nostro sito ed accettiamo le condizioni, ovviamente dobbiamo avere un account google per avere la chiave, ma ormai chi non lo ha?

Fatta questa prima operazione dobbiamo andare a capire quale zona vogliamo esportare, ci serivranno le coordinate GPS del punto iniziale e finale della mappa che vogliamo ottenere, in pratica le coordinate dei due angoli (superiore sinistro ed inferiore destro) dello spazio che vogliamo estrapolare, il nostro script estrarrà un pò di spazio in più ai lato, ma poi potremmo andare a ritagliarlo. Per trovare le coordinate... ci sono molti modi, vi rimando ad una breve ricerca con google sul come fare.

Fatto questo andiamo a modificare il nostro script inserendo le informazioni così estratte:

<html>
  <body>
    <h2>File aviable</h2>
      <ul>
<?php
  $i
= 1;
 
// Mettere qui la chiave di google ottenuta
 
$key = 'qwertyuiooooopasdfghjkllzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm3456789';
 
// Mettere qui le coordinate di partenza e di arrivo
 
$start['lat'] = 44.100;
 
$start['lng'] = 9.500;
 
$stop['lat'] = 45.100;
 
$stop['lng'] = 10.500;
 
// Scarico le immagii sul server
 
for( $lat = $start['lat']; $lat < $stop['lat'];$lat += 0.009) {
   
$j = 1;
    for(
$lng = $start['lng']; $lng < $stop['lng']; $lng += 0.0135) {
     
# Genrate file url
     
$file_in = 'http://maps.google.com/staticmap?center=' . $lat . ',' . $lng .
                 
'&zoom=16&maptype=satellite&size=640x640&key=' . $key;
     
$file_out = 'mappa_' . $i . '-' . $j . '.jpg';
      print
'<li>' . $file_out . '</li>';
     
# Save file
     
download($file_in, $file_out);
     
$j++;
    }
   
$i++;
  }
function
download ($file_source, $file_target) {
 
// Preparations
 
$file_source = str_replace(' ', '%20', html_entity_decode($file_source)); // fix url format
 
if (file_exists($file_target)) { chmod($file_target, 0777); } // add write permission
  // Begin transfer
 
if (($rh = fopen($file_source, 'rb')) === FALSE) { return false; } // fopen() handles
 
if (($wh = fopen($file_target, 'wb')) === FALSE) { return false; } // error messages.
 
while (!feof($rh)) {
   
// unable to write to file, possibly because the harddrive has filled up
   
if (fwrite($wh, fread($rh, 1024)) === FALSE) { fclose($rh); fclose($wh); return false; }
  }
 
// Finished without errors
 
fclose($rh);
 
fclose($wh);
  return
true;
}
?>

    </ul>
    <h2>X: <?php print $i; ?><h2>
    <h2>Y: <?php print $j; ?><h2>
  </body>
</html>

A questo punto salviamo tutto in un file estraimappe.php, carichiamolo sul server e mandiamolo in esecuzione (basta andare con il browser a visitare questa pagina). Il server ci mostrerà l'output con tutti i file scaricati.

Fatto questo il primo pezzoè fatto, ora apriamo il nostro client FTP preferito, e scarichiamo tutti i file che abbiamo scaricato, copiamoli sul nostro PC in una cartella apposita.

Ora per poter procede al montaggio è necesasrio che andiamo ad installare il paccehtto imagemagik, quindi:

sudo apt-get install imagemagick

Nella stessa cartella andiamo a creare un file contenente lo script bash per andare a ritagliare e unire le diverse immagini. Lo script makeimage.sh è il seguente:

#!/bin/sh
# Set data
tot_row=X # Numero righe
tot_col=6 # Numero colonne
col_px=629
row_px=598
# Crop image to remove unused element.
for i in $( seq 1 $tot_row ); do
  for j in $( seq 1 $tot_col ); do
    convert -crop $col_px\x$row_px\+0+0 +repage mappa_$i-$j.jpg mappa_$i-$j.jpeg
  done;
done;
# Generate horiz strip
for i in $( seq 1 $tot_row ); do
  montage -tile $tot_col\x1 -geometry +0+0 mappa_$i*.jpeg result_$(($tot_col - $i + 1)).jpeg;
done;
# Generate complete element
montage -tile 1x$tot_row -geometry +0+0 result_*.jpeg mappa_tot.jpeg;
# Remove temp image
rm mappa_[0-9]*.jpeg
rm result_*.jpeg

andate a modificare i valori di X ed Y in funzione dei valori che avete ottenuto dalla pagina web precedentemente aperta, fatto questo assegnamo i giusti permessi al nostro script e mandiamolo in esecuzione. Lo script deve essere inserito nella stessa cartella con tutte le immagini precedenti.

chmod +x makeimage.sh
./makeimage.sh

Alla fine dovremmo trovarci una bella immagine con l'immagine satellitare della zona da noi indicata.

in questo modo abbiamo estratto al nostra immagine satellitare, ma nulla ci vieta di estrarre le le mappe anzichè le viste satellitari, o di andare ad aggiungere a queste le diverse informazioni (nome delle strade, dei paesi, ...), ovviamente non mi metterò a spiegare come fare qui, vi rimando alla documentazione di google maps, ma se serve fate un fischio nei commenti qui sotto.

Questo script è funzionante ma testato in maniera molto limitata, pertanto in caso di problemi o errori se prrovederete a segnalarmeli vedrò di correggerli.

Altri contenuti che potrebbero interessarti

  • SASS per i CSS con Compass (in ruby)
    Come indicato nell'articolo precedente abbiamo visto la comodità di usare un metalinguaggio per i CSS come SASS. Ovviamente i browser non sono in grado di utilizzare direttamente questi file, ma necessitano di ricevere del codice CSS standard. Questa operazione (NdA:la conversione da SASS a CSS)...
  • Nello sviluppo di siti web è preferibile operare in locale e trasferire il tutto sul server remoto solo una volta che si è ottimizzata la configurazione per lo scopo che ci si è prefissi. Ciò permette di avere una maggior velocità poiché non è necessario operare sul server trasferendo i file ogni...
  • SASS per i CSS
    I CSS sono uno degli elementi che nel corso degli anni, nel settore del web, si sono meno evoluti dal pundo ti vista della struttura utilizzata. Nelle corso delle diverse versioni sono state aggiunge solo proprietà e selettori nuovi. Probabilmente penserete: Se non sono cambiati tantomeglio, evito...
  • Pagina di ricerca con filtri dinamici nelle views
    Le viste sono uno strumento estremamente potente e permettono di andare ad elaborare le informazioni creando degli elementi (pagine, blocchi, ...) di presentazione. La possibilità di usare dei filtri esposti ne fa degli strumenti adatti alla creazione di strumenti di ricerca dei contenuti. L'...

Commenti

Ritratto di came88

Mi sa che c'è un errorino...

for( $lng = 9.775; $lng < $stop['lng']; $lng += 0.0135)

mi sa che doveva essere così...

for( $lng = $start['lng']; $lng < $stop['lng']; $lng += 0.0135)

Ciao

Ritratto di mavimo

Hai perfettamente ragione

Hai perfettamente ragione, grazie per la segnalazione, correggo subito :)

Invia nuovo commento





  • Elementi HTML permessi: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <h2> <h3> <h4> <table> <thead> <tbody> <tr> <th> <td>
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Linee e paragrafi vanno a capo automaticamente.
  • Indirizzi web o e-mail vengono trasformati in link automaticamente

Maggiori informazioni sulle opzioni di formattazione.



Condividi contenuti