Clase para geolocalizar la IP en PHP + Google Maps API
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.
July 1st, 2008 at 17:46
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!
July 1st, 2008 at 21:24
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¡
July 1st, 2008 at 21:27
Omar tio, soy Ximo
En mi caso no me encontraba ni siquiera el país.
July 1st, 2008 at 21:35
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¡
July 1st, 2008 at 23:51
psé, digamos que me aburría un rato
Igualmente!
July 2nd, 2008 at 9:30
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…
July 2nd, 2008 at 20:37
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.
October 13th, 2008 at 11:28
[...] 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 [...]
March 16th, 2009 at 18:40
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!
April 2nd, 2009 at 19:19
No funciona el link del programa “Geolocate your IP” !!
puedes solucionarlo??
May 11th, 2009 at 10:49
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…
October 25th, 2009 at 15:51
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..