Database van Nederlandse gemeenten per provincie

Op Wikipedia staat een Lijst van Nederlandse gemeenten per provincie.

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

  • 1. Inlezen van alle URL's;
  • 2. Selectie op index maken van de URL's (alleen de provincies en gemeenten);
  • 3. Import van gemeenten in de database;
  • 4. Overzicht ingelezen gemeenten (groen), geweigerde gemeenten (rood), provincies (zwart).

Inlezen van alle URL's

Het opvragen van de HTML pagina :

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://nl.wikipedia.org/wiki/Nederlandse_gemeenten_per_provincie");
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 provincies en gemeenten)

Leuk truukje met xpath :

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

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

for ( $i = 0; $i < $hrefs->length; $i++ )
{
    $href = $hrefs->item($i);
    if ( substr($href->getAttribute('href'), 0, 6) == "/wiki/" )
        $array_gemeenten[$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 provincies en gemeenten)


Import van gemeenten in de database

Het totaal aantal gemeenten van het artikel op Wikipedia is op dit moment 430.

Charter Encoding

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

mysql_query("SET NAMES 'utf8'");

Een provincie niet inlezen als gemeente

In de index selectie staan provincies (e.g. Drenthe, Flevoland, Friesland etc.) deze willen we niet inlezen :

if ( ! in_array($value, $array_provincies) ) {}

Een gemeente met een naam gelijk aan de provincie wel inlezen

Hebben we net gezegd dat we de provincie niet inlezen, zijn er gemeenten met een naam gelijk aan de provincie (e.g. Groningen, Utrecht) :

if ( $previous_provincie_id == $provincie_id ) {}

Inlezen van "dubbele" gemeenten

Er zijn gemeenten die meerdere keren voorkomen. (e.g. de gemeente Bergen in Limburg en Noord-Holland)

Door de combinatie van description en provincie_id in de gemeenten tabel wordt deze gemeente toch als uniek beschouwd.


Overzicht ingelezen gemeenten (groen), geweigerde gemeenten (rood), provincies (zwart)
Overzicht ingelezen gemeenten (groen), geweigerde gemeenten (rood), provincies (zwart)
MySQL database structuur
CREATE TABLE `gemeenten` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `provincie_id` int(11) NOT NULL,
  `description` varchar(255) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`),
  KEY `province_id` (`provincie_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE `provincies` (
  `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 ;

INSERT INTO `provincies` VALUES(1, 'Drenthe');
INSERT INTO `provincies` VALUES(2, 'Flevoland');
INSERT INTO `provincies` VALUES(3, 'Friesland');
INSERT INTO `provincies` VALUES(4, 'Gelderland');
INSERT INTO `provincies` VALUES(5, 'Groningen');
INSERT INTO `provincies` VALUES(6, 'Limburg');
INSERT INTO `provincies` VALUES(7, 'Noord-Brabant');
INSERT INTO `provincies` VALUES(8, 'Noord-Holland');
INSERT INTO `provincies` VALUES(9, 'Overijssel');
INSERT INTO `provincies` VALUES(10, 'Utrecht');
INSERT INTO `provincies` VALUES(11, 'Zeeland');
INSERT INTO `provincies` VALUES(12, 'Zuid-Holland');

Download : import_lijst_van_nederlandse_gemeenten_per_provincie.php

Meer informatie : Lijst van Nederlandse gemeenten - Wikipedia

Zie ook : Database van Nederlandse plaatsen