Článek ukazuje příklad kódu, který k adresám uloženým v databázi dohledá jejich GPS souřadnice. K tomuto účelu nám výborně poslouží Google Maps API a jeho Geocoding Service (Geocoding je proces převádění adres do zeměpisných souřadnic).
Upozorňuji, že využívat geocoding je povolené pouze v případě, že získané výsledky zobrazíte zpět na Google mapě.
Geocoding Service
Geocoding Service je služba, které pošleme HTTP požadavek a ona nám vrátí (ve zvoleném formátu) příslušná zeměpisná data. Požadavek se zasílá na adresu http://maps.google.com/maps/geo? s několika parametry. Nás zajímají pouze některé:
q
(povinný) – adresa, ke které chceme zjistit zeměpisné souřadnicekey
(povinný) – váš API klíč, který vygenerujete speciálně pro vaší doménu na stránkách Google Maps APIsensor
(povinný) – nastavujeme na hodnotutrue
nebofalse
podle toho, zda byl požadavek zaslán ze zařízení se senzorem polohyoutput
(povinný) – formát výstupních dat (na výběr jexml
,kml
,csv
nebojson
)oe
(nepovinný) – kodování výstupních dat (doporučuji nastavit nautf8
)- …a další
Vstupní data by měla být generována v utf-8
.
Formát výstupních dat v CSV
Výstupní data je možné si nechat zaslat v následujích formátech:
json
(defaultní)kml
xml
csv
– data jsou oddělená středníkem
Pro náš případ se ideálně hodí CSV, protože vrací pouze čtyří údaje (narozdíl od ostatních formátu) oddělená středníkem:
- HTTP stavový kód
200
– úspěšné500
– chyba serveru602
– neznámá adresa610
– špatný API klíč620
– příliš mnoho dotazů (>5000 na den nebo příliš mnoho v krátkém obobí za sebou)- a další…
- Přesnost zaměření
0
– neznámá1
– na úrovni státu- …
4
– na úrovni města (obce)5
– na úrovni PSČ6
– na úrovni ulice7
– na úrovni uzlu8
– na úrovni adresy9
– na úrovni konkrétní budovy
- Zeměpisná šířka (latitude)
- Zeměpísná délka (longitude)
Například:
PHP: příklad získávání GPS souřadnic z CSV souboru
Předpokládejme, že máme v databázi uloženy adresy, ke kterým chceme dohledat GPS souřadnice. Tabulka v databázi by mohla vypadat například takto:
`building_id` INT NOT NULL AUTO_INCREMENT ,
`building_street` VARCHAR(200) NULL ,
`building_street_nr` VARCHAR(20) NULL ,
`building_city` VARCHAR(200) NOT NULL ,
`building_latitude` VARCHAR(30) NULL ,
`building_longitude` VARCHAR(30) NULL ,
PRIMARY KEY (`building_id`) )
Pak by PHP skript na doplnění GPS souřadnic mohl vypadat takto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 <?php
$conn = mysql_connect("localhost", "user", "passwd");
if (!$conn) {
die("Could not connect: ". mysql_error());
}
if (!mysql_select_db("database", $conn)) {
die("Could select db: ". mysql_error());
}
// YOUR DOMAIN API KEY
$api_key = "ABCDEFGHIJK";
$query = "select * from buildings where building_latitude is null and building_longitude is null order by building_id";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) {
// SET ADDRESS
$address = urlencode($row["building_street"]." ".$row["building_street_nr"]." ".$row["building_city"]." Czech republic");
// URL TO HTTP REQUEST
$link = "http://maps.google.com/maps/geo?q=".$address."&key=".$api_key."&sensor=false&output=csv&oe=utf8";
// WE GET FILE CONTENT
$page = file_get_contents($link);
// WE OBTAIN DATA FROM GIVEN CSV
list($status, $accuracy, $latitude, $longitude) = explode(",", $page);
// IF EVERYTHING OK AND ACCURANCY GREATER THEN 3 WE SAVE COORDINATES
if (($status == 200) and ($accuracy>=4)) {
$query_edit = "update buildings set building_latitude = '".$latitude."',
building_longitude = '".$longitude."'
where building_id = '".$row["building_id"]."'";
$result_edit = mysql_query($query_edit);
echo $row["building_id"]." - OK<br />";
} else {
echo $row["building_id"]." - ERROR<br />";
}
// TIMER BECAUSE GOOGLE DOESN'T LIKE TO BE QUERIED IN SHORT TIME
sleep(3);
}
mysql_close($conn);
?>
V následujícím článku vám představím MySQL proceduru, která vrací seznam nejbližších budov v okolí vypočítaný na základě GPS souřadnic.