Mapa del mundoUno de los problemas de un proyecto Web el cual necesita tener referencias de países, provincias y localidades con la mayor cantidad correcta de registros es, precisamente, encontrar una buena base de datos.

Después de buscar y buscar encontré una URL donde nos ofrecen una base de datos con países, provincias y localidades de todo el mundo (lo del todo no es una afirmación exacta, pero sí aproximada) en ocho idiomas diferentes (Ruso, Inglés, Alemán, Francés, Castellano, Italiano, Portugués y Chino).

A parte de los  más de  200 países, casi 2.000 provincias y sus casi 130.000 localidades, viene acompañado de su posición (latitud y longitud) de Google Maps (aunque no todas son exactas).

*Edito (28/11/2013): EL usuario guichogdl nos deja un enlace que parece ser válido base de datos de países, provincias y localidades de todo el mundo 2013

Os dejo el enlace con esta base de datos de países, provincias y localidades de todo el mundo.

No he podido dejar referencia del sitio donde la encontré porque la URL hacia el fichero era un servidor de Rapidshare y no mencionaba ninguna otra Web.

Espero que sea de utilidad este listado de países y sus provincias.

Edito: En el listado de países y sus provincias se ha detectado algunas duplicidades en la tabla de localidades (mismo país, misma región, mismo idioma y mismo nombre de localidad con diferente ID). Para solventar esto, he creado un pequeño script PHP:

$sql = "SELECT COUNT(id) AS total, localidades.* FROM `localidades` GROUP BY id_region, ".
"id_pais, id_idioma, nombre HAVING total > 1";
$contador = 0;
$res = $conexion->db_query($sql);

echo "Total seleccioandas: " . $conexion->db_num_rows($res);
echo "<br>";

while ($row = $conexion->db_fetch_array($res)){
    $sql = "DELETE FROM localidades WHERE id_region = '{$row['id_region']}' ".
" AND id_pais = '{$row['id_pais']}' AND nombre = \"{$row['nombre']}\" ".
" AND id_idioma = '{$row['id_idioma']}' AND id <> '{$row['id']}'";
    if (!$conexion->db_query($sql)){
        echo $sql."<br>".$conexion->db_error()."<br><br>";
        die;
    }
    else $contador++;
}
echo "Total: $contador";