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

Realizzare uno store locator in PHP che dato un modulo con indirizzo, numero civico, citta e provincia restituisca il negozio piu’ vicino alla posizione inserita.

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…

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

  1. 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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *