Browse > Home / APIs, PHP, Programación, Scripts / Clase para geolocalizar la IP en PHP + Google Maps API

| Subcribe via RSS

Clase para geolocalizar la IP en PHP + Google Maps API

July 1st, 2008 Posted in APIs, PHP, Programación, Scripts

En el proyecto pidecita.com del iWeekend de Valencia se hacía uso de Google Maps para localizar las peluquerías, y se pensó en recomendar varias al usuario en base a su ubicación. Para ello implementé una clase muy básica en PHP para geolocalizar la IP del usuario consumiendo la API de hostip.

Existen muchos servicios que ofrecen información sobre el país en el que te encuentras, pero lo que nosotros queríamos era localizar por ciudad. Este tipo de servicios suele acertar el país en un 95% de los casos, pero la provincia o ciudad no suele ser la correcta sino la del proxy de tu proveedor. Se basa en rangos de IP específicamente asignados a cada país, por lo que su fiabilidad en este sentido es media/baja. Mi IP estática que me brinda Telefónica me localiza mi provincia perfectamente, además de sus coordenadas.

Con la API REST de Hostip pódeis hacer las siguientes consultas:

http://api.hostip.info/country.php
  US

http://api.hostip.info/get_html.php?ip=12.215.42.19
  Country: UNITED STATES (US)
  City: Sugar Grove, IL

http://api.hostip.info/get_html.php?ip=12.215.42.19&position=true
  Country: UNITED STATES (US)
  City: Sugar Grove, IL
  Latitude: 41.7696
  Longitude: -88.4588

http://api.hostip.info/?ip=12.215.42.19
  [Archivo XML]

En un principio en el iWeekend parseaba el html devuelto de la 2º opción, pero ya de paso para probar la facilidad que te brinda PHP 5 para leer XML con Simple XML he utilizado la 4º opción. La clase es muy fácil de usar sólo tenéis que incluirla y llamar al método getLocationFromIp():

include('./classes/geoLocateIp.class.php');
 
$geo = new geoLocateIp();
$location = $geo -> getLocationFromIp();

La variable $location es un array asociativo con los siguientes campos: CountryName, CountryCode, City, Longitude y Latitude.

Os dejo el código fuente de la clase:

class geoLocateIp
{
	private $serviceLocateURL = 'http://api.hostip.info/?ip=';
 
	public function getLocationFromIp()
	{
		$ip = $this->getIpAdress();
 
		if (empty($ip))
			throw new Exception('Error retrieving IP address');
 
		// Use the method your server supports ( most of them only support curl )
		$xmlData = geoLocateIp::file_get_contents_curl($this->serviceLocateURL.$ip);
		//$xmlData = file_get_contents($this->serviceLocateURL.$ip);
 
		if (empty($xmlData))
			throw new Exception('Error retrieving xml');
 
		$locationInfo = $this->parseLocationData($xmlData);
 
		return $locationInfo;
	}
 
	private function getIpAdress()
        {
		if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
			   $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
		}
		elseif (isset($_SERVER['HTTP_VIA'])) {
		   $ip = $_SERVER['HTTP_VIA'];
		}
		elseif (isset($_SERVER['REMOTE_ADDR'])) {
		   $ip = $_SERVER['REMOTE_ADDR'];
		}
		else {
		   $ip = NULL;
		}
		return $ip;
          }
 
	private function parseLocationData($xmlData)
	{
		// Use of Simple XML extension of PHP 5
		$xml = simplexml_load_string($xmlData);
 
		if (!is_object($xml))
		    throw new Exception('Error reading XML');
 
		$infoHost = $xml->xpath('//gml:featureMember');
		$city = $xml->xpath('//gml:featureMember//gml:name');
 
		$coordinates = $infoHost[0]->xpath('//gml:coordinates');
		$coordinates = split(',', (string) $coordinates[0]);				
 
		$info = array (
			"City"		=> (string) $city[0],
			"CountryName"	=> (string) $infoHost[0]->Hostip->countryName,
			"CountryCode"	=> (string) $infoHost[0]->Hostip->countryAbbrev,
			"Longitude"	=> $coordinates[0],
			"Latitude"	=> $coordinates[1]
		);
 
		return $info;
	}
 
	public static function file_get_contents_curl($url)
	{
		$ch = curl_init();
 
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_URL, $url);
 
		$data = curl_exec($ch);
		curl_close($ch);
 
		return $data;
	}
}

Y a continuación, he preparado un mashup muy básico con dicha clase y la API de Google Maps en el que geolocaliza en el mapa tu situación. Lo he llamado Geolocate your IP, original verdad? : ) Estoy abierto a críticas del código, bugs, chapuzas… Y si queréis el código fuente sólo tenéis que decírmelo.

Update: Por una petición masiva de Darocz dejo el código fuente del mini-mashup y el de la clase geoLocateIp.

12 Responses to “Clase para geolocalizar la IP en PHP + Google Maps API”

  1. quim Says:

    No está mal, aunque tendrías que prever el caso en el que HostIP es incapaz de determinar la posición, como es el caso que me está pasando ahora mismo con la ip que tengo, y eso que mi isp es Telefónica (ip dinámica).

    ¡Un saludo y que pases un buen verano en Cambridge!


  2. campbell Says:

    Hola quim, había previsto sólo el caso en el que no encontrara la ciudad pero sí el país. Un comentario siempre es bien recibido :) Aunque sinceramente no se quien eres¡

    Saludos¡


  3. quim Says:

    Omar tio, soy Ximo :-P En mi caso no me encontraba ni siquiera el país.


  4. campbell Says:

    Y ese nick? Tú siempre has sido darster o ximobs, el quim ese es nuevo…

    Por cierto el sábado ya te vas, que vaya todo muy bien por Dublin¡


  5. quim Says:

    psé, digamos que me aburría un rato ;-)

    Igualmente!


  6. www.webeame.net Says:

    Clase para geolocalizar la IP en PHP + Google Maps…

    Clase implementada en PHP que consume hostip API para geolocalizar una dirección IP por país, ciudad y coordenadas. Además de un ejemplo de uso con Google Maps…


  7. Darocz Says:

    Hola , Que tal !!! , Esa localizacion no es acaso Puerto
    Madero en Buenos Aires , por cierto muy instructiva la
    clase , me interesaria ver el fuente, o si me lo puedes
    enviar por mail.


  8. Entre bytes » Archivo » How-to: Localizar IP físicamente Says:

    [...] son solo unos pocos servicios de todos los que existen en Internet (por haber, hay hasta tutoriales para crear una web de este tipo en PHP), pero esta selección me parecieron los mejores que se podían encontrar. Espero que os sirvan de [...]


  9. Nando Says:

    Hola!! Tengo un problema con éste código, que por lo que veo es el mismo que el que tu tienes en el servidor, mi jefe me está metiendo caña con este asunto, y no se como arregarlo, has estado mirando alguna forma posible de que vuelva a funcionar esto?

    Mil Gracias!


  10. d3link Says:

    No funciona el link del programa “Geolocate your IP” !!
    puedes solucionarlo??


  11. localhost Says:

    Clase para geolocalizar la IP en PHP + Google Maps API…

    Existen muchos servicios que ofrecen información sobre el país en el que te encuentras, pero lo que nosotros queríamos era localizar por ciudad. Este tipo de servicios suele acertar el país en un 95% de los casos, pero la provincia o ciudad no suel…


  12. Salomon Says:

    Hola amigo.. ando dando vueltas tras esto, y probando el link http://api.hostip.info/get_html.php?ip=190.229.91.64 no me anda, debería dar con el proxy que uso para navegar…

    Todavia no probe el codigo PHP, pero quisiera saber por que no anda… bueno te agradezco y sobre todo gracias por tu aporte en la web..


Leave a Reply