PHP a Google Maps: Jak získat GPS souřadnice pro adresu

Č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řadnice
  • key (povinný) – váš API klíč, který vygenerujete speciálně pro vaší doménu na stránkách Google Maps API
  • sensor (povinný) – nastavujeme na hodnotu true nebo false podle toho, zda byl požadavek zaslán ze zařízení se senzorem polohy
  • output (povinný) – formát výstupních dat (na výběr je xml, kml, csv nebo json)
  • oe (nepovinný) – kodování výstupních dat (doporučuji nastavit na utf8)
  • …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:

  1. HTTP stavový kód
    • 200 - úspěšné
    • 500 – chyba serveru
    • 602 – neznámá adresa
    • 610 – špatný API klíč
    • 620 – příliš mnoho dotazů (>5000 na den nebo příliš mnoho v krátkém obobí za sebou)
    • a další…
  2. 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 ulice
    • 7 – na úrovni uzlu
    • 8 – na úrovni adresy
    • 9 – na úrovni konkrétní budovy
  3. Zeměpisná šířka (latitude)
  4. Zeměpísná délka (longitude)

Například:

200,6,42.730070,-73.90570

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:

CREATE  TABLE IF NOT EXISTS `buildings` (
`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.

Matouš Havlena (e-mail, web)

  • Print this article!
  • Turn this article into a PDF!
  • E-mail this story to a friend!
  • del.icio.us
  • Digg
  • Facebook
  • Google Bookmarks
  • Twitter
  • MySpace
  1. [...] v DB uložené objekty s GPS souřadnicemi (pokud ne, GPS souřadnice můžete získat jednoduše) a chcete mezi němi vyhledávat na základě vzájemných vzdáleností? Tak právě vám by se [...]

Vlož komentář