Uno store locator in PHP per trovare il negozio piu’ vicino all’indirizzo inserito

Posted on luglio 15, 2011
Filed Under Appunti di Php | 4 Comments

Nell’articolo verra’ spiegato come trovare il negozio piu’ vicino data una tabella di negozi (chiamata negozi) con latitudine, longitudine e dati descrittivi (email, descrizione del negozio,  indirizzo etc. etc.) gia’ calcolati in precedenza. Qualora i dati della latitudine non fossero gia’ stati calcolati sara’ banale riapplicare il tool in maniera automatica per calcolare la latitudine e la longitudine e memorizzarli in apposite colonne della tabella cosi’ da poter realizzare uno store locator a tutti gli effetti per trovare il negozio piu’ vicino ad un dato indirizzo.

Supponiamo di avere un modulo ove inserire:
– indirizzo
– numero civico
– citta’
– provincia

i dati vengono passati ad una pagina PHP che prende tali dati, estrae la latitudine e la longitudine dall’indirizzo inserito e, confrontandoli con i dati nel database, estrae il negozio piu’ vicino all’indirizzo immesso.

Tutti i dati in grassetto devono essere sostituiti con i propri dati affinche’ il tool funzioni correttamente.

Nel seguito il codice del modulo nell pagina index.html:
<form method=”post” action=”trova_latitudine.php”>
Indirizzo: <input type=”text” name=”indirizzo”><br>
Civico <input type=”text” name=”civico”><br>
Citta’: <input type=”text” name=”citta”><br>
Provincia: <input type=”text” name=”provincia”><br>
<input type=”submit” value=”Trova negozio >>”>

</form>

Questo il codice della pagina trova_latitudine.php:
<?php
include ‘db.php’;

isset($_POST[‘indirizzo’]) ? $indi = addslashes($_POST[‘indirizzo’]) : $indi = “”;
isset($_POST[‘civico’]) ? $civ = addslashes($_POST[‘civico’]) : $civ = “”;
isset($_POST[‘citta’]) ? $citta = addslashes($_POST[‘citta’]) : $citta = “”;
isset($_POST[‘provincia’]) ? $prov = addslashes($_POST[‘provincia’]) : $prov = “”;

// Do in pasto l’indirizzo al tool…
$ind = $civ.” – “.$indi;
$stringa = trim(str_replace(” – “,”+”,$ind.” – “.$citta.” – “.$prov));
$stringa = str_replace(” “,”+”,$stringa);
$api = 12345;
$url = ‘http://maps.google.com/maps/geo?q=’.$stringa.’,+IT&output=csv&oe=utf8&sensor=true_or_false&key=METTICILATUAAPI‘;
$datiGeocode = htmlspecialchars(file_get_contents($url));
$arrayDati = explode(“,”,$datiGeocode);
$lat = $arrayDati[2];
$lng = $arrayDati[3];

$query_filiali=”SELECT *, ( 6371 * acos( cos( radians(“.$lat.”) ) * cos( radians( lat ) ) * cos( radians( lng ) – radians(“.$lng.”) ) + sin( radians(“.$lat.”) ) * sin( radians( lat ) ) ) ) AS distance FROM negozi ORDER BY distance LIMIT 1;”;

$filiali = mysql_query($query_filiali);
if (mysql_num_rows($filiali)>0)
{
while ($dati = mysql_fetch_array($filiali))
echo(“<br>==> “.$ind.” – “.$citta.” – “.$prov.” —- “.stripslashes($dati[‘addr’]).” – “.stripslashes($dati[‘desc’]).” – “.stripslashes($dati[‘email’]));
}
else
echo(‘Nessun risultato trovato’);

?>

Il file di configurazione (db.php) sara’ cosi’ fatto:

<?php

$dbhost = ‘localhost’;
$dbusername = ‘USERNAME‘;
$dbpasswd = ‘PASSWORD‘;
$database_name = ‘NOMEDB‘;

$connection = mysql_pconnect(“$dbhost”,”$dbusername”,”$dbpasswd”) or die (“Impossibile collegarsi al server.”);
$db = mysql_select_db(“$database_name”, $connection) or die(“Impossibile selezionare il database.”);

?>

Il tool e’ una base per poter realizzare un tool che dato il caricamento di un file Excel con una serie di indirizzi calcoli la distanza e restituisca a video o Le in formato Excel il negozio piu’ vicino.

Analogamente a quanto inserito puo’ essere realizzato un tool che dato una serie di indirizzi estragga in automatico la latitudine e la longitudine.
Qualunque suggerimento o miglioria fatta al tool sara’ un piacere pubblicarla gratuitamente…

Others Script adv

4 Responses to “Uno store locator in PHP per trovare il negozio piu’ vicino all’indirizzo inserito”

  1. Leonardo on novembre 29th, 2011 13:48

    Lo script e’ funzionante parzialmente. Infatti, come riportato nelle specifiche sono disponibili un massimo di 15.000 query al giorno per IP.
    Inoltre, in alcuni casi il sistema restituisce il codice 620 che significa una velocita’ troppo alta nelle query.
    E’ quindi conveniente ritardare lo script modificando questa parte:
    $datiGeocode = htmlspecialchars(file_get_contents($url));
    $arrayDati = explode(“,”,$datiGeocode);
    $lat = $arrayDati[2];
    $lng = $arrayDati[3];

    con:
    // Talvota Google restituisce: “620,0,0,0”; in tal caso riprovo…
    // Limite massimo per IP: 15.000 richieste al giorno
    // codice: 620 –> richieste troppo veloci.
    $datiGeocode = htmlspecialchars(file_get_contents($url));
    $arrayDati = explode(“,”,$datiGeocode);
    $geo = $arrayDati[0];
    $lat = $arrayDati[2];
    $lng = $arrayDati[3];

    if ($geo == 620)
    {
    $delay += 1000000;
    usleep($delay);
    $datiGeocode = htmlspecialchars(file_get_contents($url));
    $arrayDati = explode(“,”,$datiGeocode);
    $geo = $arrayDati[0];
    $lat = $arrayDati[2];
    $lng = $arrayDati[3];
    } else usleep(“10000”);

    Rif.:
    http://code.google.com/apis/maps/articles/phpsqlgeocode.html

  2. Petra on maggio 24th, 2013 23:19

    This post is really a good one it assists new internet people, who are wishing for blogging.

  3. Max on aprile 23rd, 2014 16:59

    Ciao, l’indirizzo del geolocator di Google è cambiato, essendo passati dalla v2 alla v3.
    https://developers.google.com/maps/documentation/geocoding/

  4. leofire on settembre 22nd, 2014 18:02

    Ciao Max,

    grazie per l’aggiornamento!

Leave a Reply