Postcode naar adres in php

Status
Niet open voor verdere reacties.

bron

Moderator
Forumleiding
Moderator
Lid geworden
13 aug 2013
Berichten
5.374
Voor een "postcode naar adres controle" heb ik een scriptje gemaakt. Hiervoor heb ik deze API (info) gebruikt. Voor iedereen die hier iets aan heeft ;)
PHP:
function postcode2adres ($postc='', $huisnr='', $toevoeg='', $limit=25) {
    $_DEFAULT_LIMIT = 25;
    $_QUERY = 'straatnaam,huisnummer,huisletter,postcode,wijknaam,woonplaatsnaam,provincieafkorting';
    // cleanup
    $postc   = strtoupper(str_replace(' ', '', $postc));
    $huisnr  = strtoupper(str_replace(' ', '', $huisnr));
    $toevoeg = strtoupper(str_replace(' ', '', $toevoeg));
    // validatie
    if (preg_match('/^[1-9][0-9]{3}[A-Z]{2}$/', $postc) === false) return false;
    if (!is_int($limit)) $limit = $_DEFAULT_LIMIT;
    // query url
    $api = 'https://geodata.nationaalgeoregister.nl/locatieserver/v3/free';
    $api .= '?fq=type:adres&fq=postcode:' . $postc;
    if ($huisnr != '') {
        $api .= '&fq=huis_nlt:' . $huisnr;
        if ($toevoeg == '*') $api .= '*';
        elseif ($toevoeg != '') $api .= $toevoeg;
    }
    $api .= '&fl=' . $_QUERY . '&rows=' . (string) $limit;
    // null bij een error (api of json)
    try {
        $data = file_get_contents($api);
        $obj  = json_decode($data);
    } catch (Exception $e) {
        return null;
    }
    // false als response onjuist is
    try {
        $numFound  = $obj->response->numFound;
        $arrOutput = $obj->response->docs;
    } catch (Exception $e) {
        return false;
    }
    if ($numFound == 0) return false;
    return $arrOutput;
}

Een voorbeeld hoe je de functie gebruikt.
PHP:
$result = postcode2adres ('2712 AL', '36', '*', 25);
if (is_null($result)) {
    echo "Gegevens opvragen niet gelukt.";
} elseif (empty($result)) {
    echo "Postcode en/of huisnummer(s) niet gevonden.";
} else {
    echo '<code><pre>';
    print_r($result);
    echo '</pre></code>';
}

Nog een paar voorbeelden.
PHP:
// alle huisnummers (standaard max. 25 huisnummers)
$result = postcode2adres ('2712 AL')

// hetzelfde maar dan ander max. aantal huisnummers (hier max. 75)
$result = postcode2adres ('2712 AL', '', '', 75)

// alleen huisnummer 36
$result = postcode2adres ('2712 AL', '36')

// alleen huisnummer 36-C
$result = postcode2adres ('2712 AL', '36', 'C')

// alle huisnummers die bij huisnummer 36 horen
$result = postcode2adres ('2712 AL', '36', '*')
 
Hoe zie je het visueel voor je dan? Op die site (jouw site?) gaat het om een adres die moet invoeren.
 
Laatst bewerkt door een moderator:
Dat script van Bron, die bedoel ik, hoe integreer je die.
Ik bied een dienst aan, maar vanwege de verhuizing kan ik niet iedereen in heel Nederland meer helpen aangezien het dan wel heel erg ver gaat worden.
Voorheen woonde ik midden Nederland, nu in het noorden Friesland. Dus wil ik dat mensen kunnen kijken of ik ze die dienst kan aanbieden vanwege de afstand.
 
Dan moet je toch even reageren op mijn vraag.

Maar in korte lijnen, je kan gewoon een $_POST['postcode'] en $_POST['huisnummer'] in de functie toevoegen, en de array van $result bekijken (puur voor ontwikkeling), en kijken wat je wilt tonen.
Zie het tweede code-blok, die er erg helder in is.

Ik zeg altijd maar: Wie niet probeert, ervaart niks.
Dus: Probeer het eens, en je ziet vanzelf wel hoever je komt.
 
Laatst bewerkt:
Hoe zie je het visueel voor je dan?
Ik zie het zo voor mij:
iemand heeft interesse in de dienst. Die vult dan eerst zijn postcode of woonplaats in en er wordt dan automatisch aangegeven hoever het is vanaf mijn woonplaats.
Is het te ver, gaat het over. Is het binnen de gestelde minuten rijden (of aantal km) kan de dienst doorgaan.

Ik ben ooit op zoek gegaan naar websites die dat hadden, maar tot op heden kon ik die niet vinden.
Wel dus de afstanden website van de ANWB en die ik nu op de website heb staan, maar dus niet dat het op de website zelf ge-integreert.
 
Ik zou zeggen: Probeer eens wat, en laat je bevindingen weten.
 
Ik heb nu de Afstand berekenen http://afstand-berekenen.com/ op mijn website staan. Hoe zou ik dit kunnen integreren?
In mijn code vraag ik alleen het adres op maar de API geeft ook een latitude/longitude die gebruikt kan worden om een afstand te berekenen tussen lat/long van eigen adres en lat/long van een ander adres.

Verander regel 3 in de functie van #1
PHP:
$_QUERY = 'straatnaam,huisnummer,huisletter,postcode,wijknaam,woonplaatsnaam,provincieafkorting,centroide_ll';

Voeg deze functie toe (code snippet van movable-type.co.uk)
PHP:
function geoAfstand($lat1=0, $long1=0, $lat2=0, $long2=0) {
    $phi1 = $lat1 * pi() / 180;
    $phi2 = $lat2 * pi() / 180;
    $dlt  = ($long2 - $long1) * pi() / 180;
    $mtr  = 6371e3;
    $distance = acos( sin($phi1) * sin($phi2) + cos($phi1) * cos($phi2) * cos($dlt) ) * $mtr;
    return round($distance / 1000);
}

Zo bereken je de afstand
PHP:
// zelf invullen: lat/long van eigen adres
// bijv. Stationsstraat 1, Utrecht, NL
$lat1  = 52.091810;
$long1 = 5.110940;

// via functie postcode2adres() de lat/long van postcode
$adres  = postcode2adres ('2712 AL', '36', 'A');
if (empty($adres)) {
    echo 'Adres bij postcode niet gevonden.';
} else {
    $coord  = preg_replace('/[^\d\s\.]/', '', $adres[0]->centroide_ll);
    $latlon = explode(' ', $coord);
    $lat2   = $latlon[1];
    $long2  = $latlon[0];
    // afstand berekenen met functie geoAfstand()
    $afstand = geoAfstand($lat1, $long1, $lat2, $long2);
    echo 'Eigen adres: ' . $lat1 . ', ' . $long1;
    echo '<br>';
    echo 'Coord postcode: ' . $lat2 . ', ' . $long2;
    echo '<br>';
    echo 'Afstand is ' . $afstand . ' km (rechte lijn)';
}
 
Dat is dan wel de afstand hemelsbreed. Dit lijkt mij niet wenselijk als er een rivier tussen beide locaties zit, waar je
vaak een stukje extra kilometers voor maakt.

De website afstand-berekenen.com zal vermoedelijk de betaalde Google Maps API gebruiken voor de snelste route.
 
Laatst bewerkt:
Dat is dan wel de afstand hemelsbreed.
Klopt, het is hemelsbreed. Met een bakfiets maakt het idd uit of je 2 km (rechtstreeks) of 10 km (stukkie om) moet rijden :d Afhankelijk van de toepassing, de aangeboden dienst en het vervoersmiddel werkt een indicatie van de afstand ook goed.

In mijn toepassing gaat het om het adres, niet om de afstand.
De afstand is wel een leuke aanvulling hierop.
 
Hoi Femke,

Het linkje wat je geeft kan zowel de afstand in een rechte lijn als de afstand over de weg berekenen. Nadeel van die website is dat je alleen een stad/dorp kan opgeven, geen postcode of straat.

In de bijlage een formulier die de afstand tussen een postcode/huisnummer en een ander van tevoren opgegeven adres (geo locatie) berekent. Getoonde resultaat is de afstand in een rechte lijn, niet over de weg.
 

Bijlagen

  • postc-naar-afstand.zip
    2,8 KB · Weergaven: 24
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan