Database van Nederlandse plaatsen

Op Wikipedia staat een Lijst van Nederlandse plaatsen.

Nu kan je eenmalig een hoop tijd besteden al deze plaatsen te copy-pasten en op een of andere manier te importeren in een database.

Een voordeel, de plaatsen zijn '-' seperated waardoor je deze makkelijk kan uitsplitsen in losse array items :

$plaatsen .= "Aadorp - Aagtdorp - Aagtekerke - Aalbeek - Aalburg - Aalden - Aalsmeer - Aalsmeerderbrug - Aalst (Gelderland) - Aalst (Noord-Brabant) - Aalsum (Friesland) - Aalsum (Groningen) - Aalten - Aan de Rijksweg - Aardenburg - Aarlanderveen - Aarle-Rixtel - Aartswoud - Aasterberg";

$array_plaatsen = explode(" - ", $woonplaats);

Maar wat als er een nieuwe plaatst bijkomt ?

Ik wil de database up-to-date kunnen houden zonder al te veel moeite.

Het artikel van Wikipedia willen we kunnen uitlezen, en alle plaatsen en of nieuwe plaatsen kunnen inlezen in de database :

  • 1. Inlezen van alle URL's;
  • 2. Selectie op index maken van de URL's (alleen de plaatsen);
  • 3. Import van plaatsnamen in de database;
  • 4. Weigeren van "dubbele" plaatsnamen;
  • 5. Overzicht ingelezen plaatsnamen (groen), geweigerde plaatnamen (rood).

Inlezen van alle URL's

Het opvragen van de HTML pagina :

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://nl.wikipedia.org/wiki/Lijst_van_Nederlandse_plaatsen");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$html = curl_exec($ch);
curl_close($ch);

De HTML content parsen naar een DOMDocument (Document Object Model) :

$dom = new DOMDocument();
@$dom->loadHTML($html);

Selectie op index maken van de URL's (alleen de plaatsen)

Leuk truukje met xpath :

$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

Het href attribuut van de plaatsnamen hebben allemaal de prefix "/wiki/" :

for ( $i = 0; $i < $hrefs->length; $i++ )
{
    $href = $hrefs->item($i);
    if ( substr($href->getAttribute('href'), 0, 6) == "/wiki/" )
        $plaatsen[$i] = $href->nodeValue;
}

Helaas zijn er nog er nog een paar url's maar die kunnen we handmatig via de index selectie uitsluiten :

Selectie op index maken van de URL's (alleen de plaatsen)


Import van plaatsnamen in de database

Charter Encoding

Sommige plaatsnamen hebben speciale tekens, we willen de plaatsnaam opslaan met een UTF-8 Charter Encoding :

mysql_query("SET NAMES 'utf8'");

Weigeren van "dubbele" plaatsnamen

Als voorbeeld de plaatsnaam "Zevenhuizen" :

Weigeren van dubbele plaatsnamen

Het totaal aantal plaatsnamen van het artikel op Wikipedia is op dit moment 3127.

Laten we alle "dubbele" eruit, dan houden we er 2951 over.

preg_replace('/\(.*\)/', '', $value);

MySQL database structuur
CREATE TABLE `cities` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(255) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Download : import_lijst_van_nederlandse_plaatsen.php

Meer informatie : Lijst van Nederlandse plaatsen - Wikipedia

Zie ook : AutoAanvullen van Nederlandse plaatsen

Zie ook : Database van Nederlandse gemeenten per provincie