[PHP] geocoding e geolocalizzazione

skull_beta82

Nuovo Utente
19 Feb 2018
4
0
1
42
Ciao!
devo trasformare un elenco di indirizzi in coordinate google maps per poi geolocalizzarle dove posso trovare qualche esempio?

grazie
 
Questo servizio non richiede API KEY e non è stringente come google in modalità free....
https://wiki.openstreetmap.org/wiki/Nominatim

Per effettuare la chiamata:
PHP:
$indirizzo='Via pippo pippo, ROMA';
$url='https://nominatim.openstreetmap.org/search/'.$indirizzo.'?format=json';
Naturalmente dovrai effettuare delle lavorazioni per renderlo compatibile con google....

Spero sia utili
 
@marino51 Ciao....
Google blocca 2500 chiamate al giorno in free plan... Se avesse più record rimarrebbe a piedi... e solo alle 00:00 si resetta il limite.
un elenco di indirizzi ... non un'applicazione online
e ribadisco,
il servizio che hai proposto mi fornisce risultato per la città di milano ma non per il mio paese,
quindi rimane a piedi ....
 
un elenco di indirizzi ... non un'applicazione online

Sai quanti indirizzi ha????

Vabbe hai ragione tu...

@marino51 sentimi... Non so dove abiti, ma osm normalizza come google le informazioni passate...
Essendo open e non a pagamento purtroppo qualche volta non risponde come desiderato, a questo punto si utilizza google...
Poi scusa se proprio la tua strada non viene trovata.... In quel caso utilizza google... ma non generalizzare un tuo prob.....

Vabbè.... 1 problema su base italiana.... OK OK.... Trank.
 
Ultima modifica:
Vabbè.... 1 problema su base italiana.... OK OK.... Trank.
non è un problema italiano, se il servizio funziona su tutto il territorio bene altrimenti devi fare due sviluppi
uno per un sistema ed il secondo per le eccezioni che rischiano di essere la regola ... avendone provato più di uno,
se vuoi provare anche tu,

HTML:
https://nominatim.openstreetmap.org/search/2%20Via%20Monastero%20Calascibetta?format=xml&polygon=1&addressdetails=1

https://nominatim.openstreetmap.org/search/14%20Via%20Larga%20Milano?format=xml&polygon=1&addressdetails=1
 
Vabbe... ;)
avendone provato più di uno,
se vuoi provare anche tu,
Vabbè, ne hai provati 2-4-4000-40000, ok... Dammi una stima....

Comunque l'80/85 % del territorio è coperto da osm, se uno necessita di più dati è l'unico in modalità free...

altrimenti devi fare due sviluppi
uno per un sistema ed il secondo per le eccezioni che rischiano di essere la regola
Spiegami i 2 sviluppi perchè non capisco... Sarebbero i 2 parserini?
Se ti servono su git ci sono i miei... puoi scaricarli sono free...

Dai cmq l'eccezione di alcuni indirizzi non fanno testo...
Pensieri diversi, approcci diversi, esperienze diverse... ;)
 
questo è lo script php che uso,
PHP:
<?php
 
function lookup($string){
 
    $string = str_replace (" ", "+", urlencode($string));
    $details_url = "http://maps.googleapis.com/maps/api/geocode/json?address=".$string."&sensor=false";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $details_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = json_decode(curl_exec($ch), true);

    // print_r($response);
    echo "<h2>curl response</h2>".show_var($response);

    // If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST
    if ($response['status'] != 'OK') { return null; }

    $geometry = $response['results'][0]['geometry']['location'];

    $array = array(
        'formatted_address' => $response['results'][0]['formatted_address'],
        'address_type'      => $response['results'][0]['types'][0],
        'latitude'          => $geometry['lat'],
        'longitude'         => $geometry['lng'],
    );
    return $array;
}

require_once 'myUtils/show_vars.php';

$city = '2 Via Monastero Calascibetta';
 
$array = lookup($city);

// print_r($array);
echo "<h2>received values</h2>".show_var($array);

?>
con relativo risultato
upload_2018-2-21_13-21-32.png
 
ok... Va bene...
Magari a classe....
PHP:
/**
 * Created by PhpS.
 * User: MArco. A.
 * Date: 21/02/2018
 * Time: 11:52
 */

namespace MadiGeocoding {


    use GuzzleHttp\Client;

    class Geocoding
    {


        protected $priority=['osm','google'];


        private $api='';

        private $url='';
        private $use=[];
        private $ind='';

        private $client;

        private $call_response;

        private $data=[];
        public function __construct()
        {

            $this->api=GOOGLE_API;
            $this->client=new Client();
            return $this;
        }

        public function set_ind($ind){
            $this->ind=$ind;
            return $this;
        }


        public function init(){

            if(empty($this->ind)){
                return ['data'=>[],'use'=>$this->use,'error'=>TRUE,'response'=>$this->make_error(0)];
            }else{
                foreach ($this->priority as $item){
                    if(empty($this->data)) call_user_func([$this,$item],[]);
                }
            }
            if(empty($this->data))return ['data'=>[],'use'=>$this->use,'error'=>TRUE,'response'=>$this->make_error(1)];
            else{
                return ['data'=>$this->data,'use'=>$this->use,'error'=>FALSE];
            }
        }

        private function call(){
            $this->call_response=json_decode($this->client->get($this->url)->getBody()->getContents());
        }


        private function google(){
            $this->url='https://maps.googleapis.com/maps/api/geocode/json?address='.$this->ind.'&key='.$this->api;
            $this->call();
            if($this->call_response->status=='OK'){
                if(isset($this->call_response->results[0]->formatted_address))$this->data['formatted_address']=$this->call_response->results[0]->formatted_address;
                if(isset($this->call_response->results[0]->geometry->location)){
                    $this->data['lat']=$this->call_response->results[0]->geometry->location->lat;
                    $this->data['lon']=$this->call_response->results[0]->geometry->location->lng;
                    $this->use[]='google';
                }
            }
        }

        private function osm(){
            $this->url='https://nominatim.openstreetmap.org/search/'.$this->ind.'?format=json';
            $this->call();
            if(!empty($this->call_response)){
                $this->data['lat']=$this->call_response[0]->lat;
                $this->data['lon']=$this->call_response[0]->lon;
                $this->data['formatted_address']=$this->call_response[0]->display_name;
                $this->use[]='osm';
            }
        }

        private function make_error($index){
            $error[]='Indirizzo non settato';
            $error[]='Indirizzo non trovato';
            return $error[$index];
        }

    }
}

Come si usa...
PHP:
$geo=new \MadiGeocoding\Geocoding();
print_r($geo->set_ind('INDIRIZZO DA CERCARE')->init());
@marino51 Quanto scritto è una rivisitazione di ciò che avevo in 20 minuti... ma non l'ho postata per E-PENE dell'altra volta....
Quindi credo che per scalabilità sarebbe meglio una notazione così...
 
@macus_adi
nel forum si da supporto a persone che hanno una situazione da risolvere,
non si deve dimostrare le proprie capacita per nulla e a nessuno,
si deve giungere ad una soluzione semplice e di facile applicazione agendo sul codice (quando) proposto senza sconvolgerlo

Quanto scritto è una rivisitazione di ciò che avevo in 20 minuti
bravissimo .... scusa se non l'ho guardato, non mi interessa

nel caso degli script che pubblico, moltissimi sono miei originali (uno per tutti, 730 precompilato, leggi quanti ne hanno tratto beneficio), più o meno belli (e non mi interessa il giudizio) ma tutti funzionanti
ho anche diversi script ripresi da altri spesso modificati in modo sostanziale qualche volta ripuliti dagli errori
(inutile inventare la ruota ogni volta)
ma non l'ho postata per E-PENE dell'altra volta....
se poi sei qui sempre per la tua dimensione ... mi spiace ....

con questo messaggio sappi che ignorerò tutti i tuoi interventi
at salut
 
Vabbè.... Si come sopra
Vabbe hai ragione tu...

ma non l'ho postata per E-PENE dell'altra volta
Semplicemente per evitare polemiche, ma dato che con te non è così...
Quando aiuti ricordati di citare le fonti, perchè nessuno è nato imparato...
uno per tutti, 730 precompilato, leggi quanti ne hanno tratto beneficio
Non sto qui a dirti le lib. free che ho dato, magari le utilizzi anche tu... quindi...
datti una ridimensionata e non fare la prima donna....
Chiudo, la tua inutile e disperata replica...
 

Discussioni simili