webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> porady >> php + mysql

Geocode reverse, czyli odczytywanie adresu ze współrzędnych

autor: Patryk 'yarpo' Jar, ostatnia modyfikacja: 2007-11-15

szukaj: geocode reverse geocode reverse mapy Google mapy Google google maps google maps PHP PHP

Mapy google są coraz popularniejsze w internecie. Ich dokumentacje można znaleźć pod adresem: http://www.google.com/apis/maps/documentation/

Niestety w dokumentacji tej brakuje bardzo przydatnej funkcji – otrzymywania nazwy miejscowości, gdy znane są współrzędne geograficzne. Na szczęście są możliwości rozwiązania tego problemu.

Opcja ta nazywa się geocode reverse i jest udostępniana przez różne firmy np. http://ws.geonames.org/findNearbyPlaceName?lat=52&lng=20&maxRows=1

W wyniku otrzymujesz kod XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<geonames>
	<geoname>
		<name>Polesie</name>
		<lat>52.0166667</lat>
		<lng>20.0166667</lng>
		<geonameId>761624</geonameId>
		<countryCode>PL</countryCode>
		<countryName>Poland</countryName>
		<fcl>P</fcl>
		<fcode>PPL</fcode>
		<distance>2.176104532865842</distance>
	</geoname>
</geonames>

Zamiast kodu XML można uzyskać kod JSON - http://ws.geonames.org/findNearbyPlaceNameJSON?lat=52&lng=20. [patrz klasa ObjTree]

Oczywiście parametry lat oraz lng a także wartość maxRows można zmieniać wg potrzeb. Najczęściej kiedy chcesz odczytać lokalizację wielu miejscowości po kolei. Warto wtedy trochę zautomatyzować działanie.

Ostatnio miałem przyjemność :P popracować z mapami google i stworzyłem taką o to klasę, pomagającą odczytać dane z serwera. Po odczytaniu przechowuje ona wartości pobrane z serwera w swoich właściwościach:

<?PHP
// class geocodeReverse
// autor Patryk yarpo Jar
// yarpo@poczta.onet.pl
class geocodeReverse {
	private $x;
	private $y;
	private $countryCode;
	private $contryName;
	private $city;
	private $distance;
	private $maxRows;
	private $fileSize;
	private $xmlCode;

// x - float, 
// y &#8211; float,
// $rows - unsigned int, max numbers of cities nearby this location
function __construct($x, $y, $rows) {
	$this->x = $x;
	$this->y = $y;
	$this->maxRows = $rows;
	$this->fileSize = 1024;
	$this->changeLocation($x, $y);
}
public function getCity() {
	return $this->city;
}
public function getXpos() {
	return $this->x;
}
public function getYpos() {
	return $this->y;
}
public function getLng() {
	return $this->x;
}
public function getLat() {
	return $this->y;
}
public function getCountryCode() {
	return $this->countryCode;
}
public function getCountryName() {
	return $this->countryName;
}
public function getDistance() {
	return $this->distance;
}
public function getMaxRows() {
	return $this->maxRows;
}
public function getFileSize() {
	return $this->fileSize;
}
public function setMaxRows($newValue) {
	$this->maxRows = $newValue;
}
public function setFileSize($newValue) {
	$this->fileSize = $newValue;
}
public function changeLocation($x, $y) {
	$this->x = $x;
	$this->y = $y;
	$url = 'http://ws.geonames.org/findNearbyPlaceName?lat='.$y.'&lng='.$x.'&maxRows='.$this->maxRows;
	$file = fopen($url, 'r');
	$this->xmlCode = fread($file, $this->fileSize);
	fclose($file);

	// create an object from XML file (string)
	$xml = new SimpleXMLElement($this->xmlCode);

	$this->city = $xml->geoname->name;
	$this->x = $xml->geoname->lng;
	$this->y = $xml->geoname->lat;
	$this->countryCode = $xml->geoname->countryCode;
	$this->countryName = $xml->geoname->countryName;
	$this->distance = $xml->geoname->distance;	
}
public function getXMLCode() {
	return $this->xmlCode;
}
}; // end of class

Z ciekawszych rzeczy, to wykorzystałem tu klasę PHP SimpleXMLElement, dzięki której przekształciłem kod XML w obiekt PHP [działanie podobne do wspomnianej wyżej ObjTree, tylko, że po stronie serwera].

Aby móc korzystać z tej klasy, należy stworzyć obiekt. Tworzy się go w ten sposób:

<?PHP
include '/ble/blu/bla/geocodeReverse.php';

	// $x = długość geograficzna
	// $y = szerokość geograficzna
	// $rows = max liczba wierszy wyświetlonych 

	$geo = new geocodeReverse($x, $y, $rows); 

	// przyklad zastosowania:
	echo 'Miejscowosc nazywa się '. $geo->getCity();
?>

Jak widać kod jest dosyć prosty [aby nie powiedzieć prostacki. Zauważ, że nie sprawdza, czy nie pojawiają się jakieś błędy... Ale niech to już będzie zabawa dla ciebie – np. Sprawdzenie czy w ogóle coś zwrócił serwer oraz czy był to poprawny kod XML]. A w wyniku dostaje się prosty interfejs.

Patryk 'yarpo' Jar

Osoby czytające tę publikację przeglądały również:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org