Wat er dan vervolgens moet gebeuren is iemand vult een postcode in dan zoekt het script in de database naar de postcode daarvan word de lat long gepakt en daarmee met een straal van 30 km worden alle postcodes gepakt
Als output moet ik dus van een postcode de straal daar om die postcode van 30 km alle postcodes pakken.
Dus dan heb ik een lijstje met postcodes in die buurt met een straal van 30 km
Ik hoop dat ik het goed heb kunnen uitleggen en dat iemand mij hiermee kan helpen.
wil je voor zeg postcode = "1234AB" als invoer,
als uitvoer verkrijgen alle duizenden postcodes als "1234AC" "1235XY" etc
die op minder dan 30km liggen?
Of alleen de cijfers?
Of alleen bedrijven in jouw database die op minder dan 30km van 1234AB liggen?
<?php
// maak uservars aan in SQL
$rVar = mysqli_query($link, "SELECT lng, lat INTO @orgLng, @orgLat FROM zipcodes WHERE zipcode = '1234 AB'");
//de query
$sql = "SELECT
b.bedrijfsnaam,
z.straatnaam,
z.zipcode,
GetDistance(@orgLat,@orgLng, z.lat, z.lng) AS distance
FROM
bedrijven b
JOIN
zipcodes z ON b.zipcode = z.zipcode
HAVING distance <= 30";
// en dan verder het normale rideltje
?>
Ivo Ik wil inderdaad alleen bedrijven in mijn database die op een straal van 30km van 1234Ab liggen
Dus iemand voert in 1234AB dan zal het script moeten controleren in de postcode table met lat long
met een straal van 30 km dan krijg je een lijst met postcodes dan moeten die postcodes worden vergelijkt met de bedrijven tabel of er bedrijven zijn en die moet ik er dan uithalen.
Het lijkt me dat het script van Ger dat handiger doet:
Bepaal de coordinatie van een positie (een postcode): dat is waar jij bent.
En selecteer dan alle bedrijven op basis van hun coordinaten die op minder dan 30 km zitten.
Dat vereist inderdaad dat je bij elk bedrijf ook de coordinaten opslaat.
Maar is efficienter dan eerst 50000 postcodes op te halen en daarna te kijken of er een bedrijf in die postcode zit
Zij het dat het stukje "google om coordinaten te bepalen" waarschijnlijk inmiddels achterhaald is. Maar die coordinaten kun je ook van postcodeapi.nu of api.postcode.nl halen.
Maar stel dat je straks heel veel locaties hebt, dan moet je een heleboel afstanden gaan berekenen:
Queries met complexe berekeningen kun je vele malen efficiënter maken door hier eenvoudige berekeningen aan vooraf te laten gaan die het zoekgebied kunnen inperken:
SELECT x,y,z
FROM whatever
WHERE <eenvoudige berekening>
AND <complexe berekening>
Hoe kun je dat principe hier inzetten? Zet er een eenvoudige rechthoekige bounding box omheen. Er valt redelijk wat code te vinden die afstanden om kan zetten naar lat/lon coordinaten gezien vanaf een bepaald punt. De linker bovenhoek van de bounding box is het middelpunt, met daarbij van de Y- als het X-coordinaat de straal afgetrokken. De rechter onderhoek is het middelpunt, en zowel bij de Y- als het X-coordinaat de straal bijgeteld. De eenvoudige berekening die je als eerste uitvoert zijn dus twee simpele BETWEENs van lat/lon paren.
Dus als volgt:
Vervolgens voer je de complexe berekening uit enkel op de coordinaten die binnen deze bounding box vallen, dus je werkt daarmee op een veel kleinere subset. Dit zijn dus vele malen minder complexe berekeningen en resulteert dus in aanzienlijk snellere queries.