Geocode Reverse, czyli adres ze współrzędnych geograficznych Drukuj
Ocena użytkowników: / 0
SłabyŚwietny 
Wpisany przez Patryk yarpo Jar   
sobota, 23 października 2010 23:53

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

 

Wynikowy kod XML:

<geonames>
    <geoname>
        <toponymName>Jacochów</toponymName>
        <name>Jacochów</name>
        <lat>51.98333</lat>
        <lng>19.98333</lng>
        <geonameId>3097790</geonameId>
        <countryCode>PL</countryCode>
        <countryName>Poland</countryName>
        <fcl>P</fcl>
        <fcode>PPL</fcode>
        <distance>2.17633</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:

// class geocodeReverse
// autor Patryk yarpo Jar
// 
 Adres poczty elektronicznej jest chroniony przed robotami spamującymi. W przeglądarce musi być włączona obsługa JavaScript, żeby go zobaczyć.
 
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

	

 

Przykładowe zastosowanie

$geo = new geocodeRevers(52, 20, 1);
echo $geo->getCountryCode();