Reverse geocoding in PHP
Last Updated: Dec 11 2019 09:30, Started by
dagobar
, Dec 07 2019 23:21
·
0
#1
Posted 07 December 2019 - 23:25
Salut all
Ce este reverse geocoding ? https://en.wikipedia...verse_geocoding Pe plan international exista un numar restrans de furnizori de servicii gratuite de reverse geocoding probabil cel mai cusoscut fiind Google (sau era... nu stiu daca mai este gratis). Diversii furnizori de astfel de servici gratuite le limiteaza ca numar de interograri per unitate de timp (ex. 10000 interograri pe luna la locationiq)... pe buna dreptate ca doar sunt gratuite dar si pentru a prevenii abuzuri. Eu doresc extinderea unui script PHP existent (atasat de acest post) care in momentul de fata accepta primirea unei cereri de la o anumita adresa de IP, verifica cererea de bube (sanitize) si daca este corecta o trimite mai departe catre un astfel de furnizor de reverse geocoding si evident returneaza raspunsul. Scripul a fost facut initial deoarece furnizorul a impus introducerea de AGENT in cerere si cam asta face primeste cererea fara AGENT si o introduce inainte sa o trimita mai departe. Eu am testat pe Linux CLI: curl -A "" 'https://nominatim.op...ddressdetails=1' Response: Access blocked console: curl -A "mozilla" 'https://nominatim.op...ddressdetails=1' Response: OK Pentru a accesa scriptul PHP pe localhost: http://localhost/reverse</entry> Cum as dorii sa extind scriptul ? 1. sa suporte furnizori multipi (pentru load balancing, redundanta, e.t.c) 2. limitare nr. interogari per unitate de timp per furnizor (pentru a evita flood-area involuntara) 3. mod rutare cereri - round robin, procentual, preffered, e.t.c. Nota: Scriptul nu este facut de mine este preluat de pe forumul traccar (nu dau link sa nu se considere reclama) iar rezultatul dezvoltarii noului script (sau scripturi) o sa fie facut public pe Git sa-l poata folosii oricine si eventual extinde... adica munca voluntara neplatita Later edit: Am atasat de post fisierul reverse.php insa vad ca nu apare in post... poate trebuie aprobat de un moderator. Daca nu apare in perioada urmatoare o sa-l pun aici cu copy&paste. Edited by dagobar, 07 December 2019 - 23:22. |
#2
Posted 09 December 2019 - 10:54
<p>
$user_agent = 'traccar'; // specify your user-agent $nominatim_url = 'https://nominatim.op...g/reverse'; $error = array(); if ($_SERVER['REMOTE_ADDR'] !== $_SERVER['SERVER_ADDR']) { $error[] = 'only local query allowed'; } if (!isset($_GET) || empty($_GET)) { $error[] = 'no parameters'; } elseif (!isset($_GET['format']) || !isset($_GET['lat']) || !isset($_GET['lon']) || !isset($_GET['zoom']) || !isset($_GET['addressdetails'])) { $error[] = 'not complete parameters'; } elseif ($_GET['format'] !== 'json' || !is_numeric($_GET['lat']) || !is_numeric($_GET['lon']) || !is_numeric($_GET['zoom']) || !is_numeric($_GET['addressdetails'])) { $error[] = 'invalid parameters'; } else { header('Content-Type: application/json; charset=utf-8'); $query_data = array( 'format' => $_GET['format'], 'lat' => $_GET['lat'], 'lon' => $_GET['lon'], 'zoom' => $_GET['zoom'], 'addressdetails' => $_GET['addressdetails'] ); $query = http_build_query($query_data); $ch = curl_init(); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $nominatim_url.'?'.$query); $response = curl_exec($ch); $status_code = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($status_code !== 200) { $error[] = 'no valid response from nominatim'; } } if ($error) { header('Content-Type: text/html; charset=utf-8'); echo implode(' ', $error); } else { header('Content-Type: application/json; charset=utf-8'); echo $response; } ?> |
#4
Posted 10 December 2019 - 13:52
Alta varianta ar fi sa folosesc HAProxy cu scripturi diferite la continut insa cu acelasi nume in foldere diferite pe acelasi server.
Mai "sap" inclusiv pe aceasta parte... |
#5
Posted 11 December 2019 - 09:30
Pana la urma am modificat singur script-ul si in combinatie cu HAProxy am reusit sa obtin rutarile disponibile in HAProxy (ex. round robin) precum si redundanta... cazul in care un reverse geocoding server (nu doar serverul pe care se afla scriptul PHP) nu mai returneaza raspunsuri valide sau timeout este marcat dead si nu se mai trimit cereri catre el.
In continuare ar fi nevoie de logare in SQL pentru statistici, mecanism de verificare care sa schimbe automat statusul din DEAD -> LIVE cand revine un server, limitare numar interogari per unitati de timp (asta s-ar putea sa se poata din HAProxy) e.t.c. Oricum din ce observ nu exista interes din partea utilizatorilor de aici asa ca se poate inchide topicul. |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users