En effet, si l'on possède une référence dans la table "locations" (voir la base de données geocalise-ip) d'une ville, alors on a aussi ces coordonnées géographiques : latitude et longitude.

Donc en toute logique il nous suffit d'avoir une autre table avec les informations sur la ville et ses coordonnées géographiques bien évidement, ce qui nous permettra par exemple de faire une requête du style :

SELECT * FROM `villes` WHERE 
TRUNCATE(`latitude_ville`,3)='46.150' 
AND
TRUNCATE(`longitude_ville`,3)='4.916'

Alors quelques explications :
  • Un TRUNCATE parce que la longitude et la latitude que nous avons dans la table "locations" sont moins précises que notre table "villes"
  • Par contre il va falloir tester les valeurs proches parce que en base les float (7,4) (ce qui équivaut à 000.0000) ne sont pas stocker comme l'on pourrait le croire. 10.28 va être stocker en 10.2799 ... Et oui, c'est comme ça ! voir sur le site de MySQL (tout en bas). Ce qui nous donnera au final 3 requêtes supplémentaires :
    SELECT * FROM `villes` WHERE 
    TRUNCATE(`latitude_ville`,3)='46.149' 
    AND
    TRUNCATE(`longitude_ville`,3)='4.916'
    

    SELECT * FROM `villes` WHERE 
    TRUNCATE(`latitude_ville`,3)='46.150' 
    AND
    TRUNCATE(`longitude_ville`,3)='4.915'
    

    SELECT * FROM `villes` WHERE 
    TRUNCATE(`latitude_ville`,3)='46.149' 
    AND
    TRUNCATE(`longitude_ville`,3)='4.915'
    



Une fois la ville localiser en base, on peut y récupérer des informations tel que son code postal et/ou son code INSEE, une paire/clef qui normalement est unique (ce n'est pas tout à fait vrai avec les lieux-dits par exemple).

Si vous voulez ce genre des informations précises sur les villes de France nous nous sommes basés pour le moment sur celles de Jérôme GALICHON ici http://www.galichon.com/codesgeo/.
Mais une base de données plus récente et surtout concernant le monde existe chez geonames (attention les informations complètes font pas loin de 1Go).
Vous pouvez aussi nous contacter pour localisation ip professionnelle.