Créer une page de géolocalisation (GIS) d’une adresse IP – Partie 2 – Pratique et Code source

Suite à la première partie de ce petit projet, nous allons continuer par la partie plus pratique.

Comment récupérer son adresse IP

L’API que nous allons utiliser est simple, tout d’abord il faut pour le test récupérer votre adresse ip.

L’adresse IP comme nous l’avons vu dans le premier billet est votre identifiant unique sur le réseau internet, je ne parle pas de votre adresse que vous obtenez en testant les paramètres de votre carte réseau ou en tapant la commande « ipconfig » dans une fenêtre MS DOS. cela ne donnera que votre adresse non routable.

Des sites comme adresseip.com ou mon-ip.com peuvent vous renseigner et vous donner l’adresse externe que vous fournira votre routeur suite à une translation d’adresse ou de port.

Vous pouvez pour vos tests prendre les adresses ip de sites web tel que google, facebook, yahoo ou autres en tapant dans votre interpréteur de commandes MSDOS « ping [adresse url du site] ».

Test de l’API ou récupération des coordonnées

Une fois que vous avez une adresse IP pour tester l’API rendez vous sur l’adresse http://api.hostip.info/ et rajoutons à la suite un passage de valeur à la variable ip en mettant une adresse ip routable de votre choix comme suit: http://api.hostip.info/?ip=69.171.21.1 (adresse ip prise au hasard)

Vous remarquerez que dans le resultat au format gml (trés proche de l’XML) on retrouve des informations intéréssantes comme le pays, la ville ou encore l’adresse ip (logique c’est moi qui l’ai donné!) en bleu ainsi que les coordonnées géographique (longitude et latitude) en bleu et vert.

Et c’est la que rentre PHP, quelques explications

PHP va récupérer ces valeurs gml/xmlvia la commande file_get_contents

$content = @file_get_contents(‘http://api.hostip.info/?ip=’.$ip);

l' »@ » avant la fonction permet de ne pas prendre en compte les éventuels erreurs.

puis nous allons récupérer chaque informations comme suit:

$xml = new SimpleXmlElement($content);

SimpleXmlElement est un constructeur (POO) qui crée un nouvel objet SimpleXMLElement et via lequel nous allons pouvoir charger les balises XML et les récupérer comme suit:

Soit le resultat gml/xml (celui que nous avons recu via l’URL http://api.hostip.info/?ip=69.171.21.1ue nous avons mis dans $content puis chargé dans l’objet $xml)

<HostipLookupResultSet version= »1.0.1″ xsi:noNamespaceSchemaLocation= »http://www.hostip.info/api/hostip-1.0.1.xsd »&gt;
<gml:description>This is the Hostip Lookup Service</gml:description>
<gml:name>hostip</gml:name>
<gml:boundedBy>
<gml:Null>inapplicable</gml:Null>
</gml:boundedBy>
<gml:featureMember>
<Hostip>
<ip>69.171.21.1</ip>
<gml:name>NORTH TONAWANDA, NY</gml:name>
<countryName>UNITED STATES</countryName>
<countryAbbrev>US</countryAbbrev>
…….

Tous les éléments sont hiérarchisé en nœud (une sorte d’arbre généalogique avec un grand père, un fils, des petits fils, des arrières petits fils etc..) , certains noeuds sont préfixés  comme par exemple <gml:featureMember>, d’autres ne le sont pas   (exemple <countryName>), pour avoir l’adresse ip on va parcourir cette hiérarchie ou pseudo tableu comme suit!

Dans gml qui est un espace de nom préfixé via featureMember ayant un fils non préfixé Hostip lui même ayant un fils ip non préfixé, on met le resultat de ce parcours dans une variable comme suit:

$hostip = $xml->children(‘gml’, TRUE)->featureMember->children( », TRUE)->Hostip->ip;

La seule variable qui devra être traité est celle des coordonnées qui sont sur le même noeud mais qui heureusement a un séparateur (la virgule) entre la longitude et la latitude, on va donc exploser cette variable via la commande explode qui va nous créer un tableu, ensuite on attribut le premier élément à la longitude et le second à la latitude.

Puis dans un iframe qui chargera la carte de google on mettra via php les coordonnés (en rouge) et  le niveau de zoom (en vert) qui peuvt être modifié à tout moment

src="http://maps.google.fr/maps?f=q&....t=h&amp;ll=33.0582,-97.5159&amp...;z=6"

  Avec un peu de css3 on  devrait avoir un code ci qui je le précise fait les tests de passage de variables, de récupération réussite de coordonnées, de zoom par défaut au cas ou aucun n’est spécifié.

Le code source

<!DOCTYPE html PUBLIC « -//W3C//DTD XHTML 1.1//EN » « http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd »&gt;
<html>
<head>
<title>Localisation d’une adresse IP via des coordonnées GIS sur une carte</title>
<meta http-equiv= »Content-Type » content= »txt/html; charset=utf-8″ />
</head>
<body style= »background:#151515 url(‘https://tutorielsinformatique.files.wordpress.com/2011/09/tiret-fond-noir.gif&rsquo;) top left repeat;color:#fff;padding:0;margin:0;font-family:verdana, tahoma, arial »>
<center><h2 style= »text-shadow: 2px 2px 8px black; »> Localisation d’une adresse IP via des coordonnées GIS sur une carte </h2></center>
<div id= »conteneur » style= »margin:auto;width:820px;border:1px solid #fff;border-radius:10px 10px 10px 10px;padding:8px;font-size:11px;background-color: rgba(21, 21, 21, 0.6);box-shadow: 2px 2px 24px black; »>

<?php
// ici nous allons utiliser l’API fourni par le site http://www.hostip.info/
/*
Exemple du résultat de la requête http://api.hostip.info/?ip=212.215.42.19
e
<HostipLookupResultSet version= »1.0.1″ xsi:noNamespaceSchemalocation= »http://www.hostip.info/api/hostip-1.0.1.xsd »&gt;
<gml:description>This is the Hostip Lookup Service</gml:description>
<gml:name>hostip</gml:name>
<gml:boundedBy>
<gml:Null>inapplicable</gml:Null>
</gml:boundedBy>
<gml:featureMember>
<Hostip>
<ip>12.215.42.19</ip>
<gml:name>Aurora, TX</gml:name>
<countryName>UNITED STATES</countryName>
<countryAbbrev>US</countryAbbrev><!– Co-ordinates are available as lng,lat –>
<iplocation>
<gml:pointProperty>
<gml:Point srsName= »http://www.opengis.net/gml/srs/epsg.xml#4326″&gt;
<gml:coordinates>-97.5159,33.0582</gml:coordinates>
</gml:Point>
</gml:pointProperty>
</iplocation>
</Hostip>
</gml:featureMember>
</HostipLookupResultSet>
*/
// Primo on recupere l’adresse passer en GET! s’il n’y en as pas on prend pour IP l’adresse de sa machine
// c’est vrai qu’avec l’ADSL un peut partout et les réseaux locaux à domicile vous allez vous retrouver avec une adresse IP
// non routable, donc une extension serait de test si dans l’adresse commence par exemple par 127.0.0 ou par 192.168.
if (isset($_GET[‘ip’]))
$ip=$_GET[‘ip’];
else
$ip= »12.215.42.19″;

// on récupère le fichier XML
$content = @file_get_contents(‘http://api.hostip.info/?ip=&rsquo;.$ip);

if ($content != FALSE) {
$xml = new SimpleXmlElement($content);
//SimpleXMLElement  simplexml_element->attributes ( string   data )
//simplexml_element->attributes fournit les attributs et les valeurs définies dans une balise XML.
$hostip = $xml->children(‘gml’, TRUE)->featureMember->children( », TRUE)->Hostip->ip;
$codepays = $xml->children(‘gml’, TRUE)->featureMember->children( », TRUE)->Hostip->countryAbbrev;
$coordinates = $xml->children(‘gml’, TRUE)->featureMember->children( », TRUE)->Hostip->ipLocation->children(‘gml’, TRUE)->pointProperty->Point->coordinates;
//SimpleXMLElement  simplexml_element->children ( string   nsprefix )
//Cette méthode trouve le fils de l’élément dont il est membre. Le résultat suit les règles normales d’itération.
$position = explode(‘,’, $coordinates);
$localisation[‘longitude’] = $position[0];
$localisation[‘latitude’] = $position[1];
$localisation[‘ville’] = $xml->children(‘gml’, TRUE)->featureMember->children( », TRUE)->Hostip->children(‘gml’, TRUE)->name;
$localisation[‘pays’] =  $xml->children(‘gml’, TRUE)->featureMember->children( », TRUE)->Hostip->countryName;
}
else {
$localisation[‘longitude’] = «  »;
$localisation[‘latitude’] = «  »;
}

echo ‘<form method= »GET »>Adresse IP: <input style= »background-color:transparent;border:none;color:#fff; » maxlength= »15″ type= »text » name= »ip » value= »‘.$ip.' »/><br />Pays:’.$localisation[‘pays’].'<br/><img height= »32px » src= »http://api.hostip.info/flag.php?ip=&rsquo;.$ip.' » alt= »‘.$localisation[‘pays’].' »><br />Ville:’. $localisation[‘ville’].'<br />Zoom: ‘;

// Affichage des niveaux de zoom
for ($i=0;$i<10;$i++)
{
$j=$i+1;

echo ‘<a style= »text-decoration:none;color:#fff; » href= »index.php?ip=’.$ip.’&zoom=’.$j.' »>’.
$i.'</a>’;
if ($i <> 9) echo ‘ | ‘;

}
if (isset($_GET[‘zoom’])) $zoom=2*$_GET[‘zoom’]; else $zoom=6;
echo ‘

<br />
<form method= »GET »>
<input type= »hidden » name= »zoom » value= »‘.$zoom.' »/>
</form>
<br />
<iframe width= »800″ height= »385″ frameborder= »0″ scrolling= »no » marginheight= »0″ marginwidth= »0″ src= »http://maps.google.fr/maps?f=q&amp;hl=fr&amp;ie=UTF8&amp;t=h&amp;ll=&rsquo;;

echo $localisation[‘latitude’].’,’.$localisation[‘longitude’];

echo ‘&amp;spn=7.438284,13.974609&amp;z=’;

echo $zoom;
echo ‘&amp;output=embed&amp;s=AARTsJpGbW0UQFZJ1Lmnrb9H7hGWjKHDhA »></iframe></center>
<a href= »https://tutorielsinformatique.wordpress.com/ &raquo; style= »color:#ddd;font:10px verdana,tahoma; »>https://tutorielsinformatique.wordpress.com/</a&gt;

‘;
?>
</div>
</body>
</html>

Tutorielsinformatique.wordpress.com  qui a pour seul but l’information, la sensibilisation et ne vous veut que du bien 🙂 est nullement responsable de quelque manière que ce soit lors de l’utilisation de ce code. Testez le à vos risques et périls, Tutorielsinformatique.wordpress.com ne sera aucunement responsable des dommages, pertes de données subis par votre ordinateur .

Publicités

4 commentaires

  1. I really like your blog however, I am dyslexic. Do you have videos on the subject? Your writing style reminds me of my teacher. You remind me of my best friend back in Colorado. You are my savior. Wow, that is a really magnificent way of thinking about it!

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s