Postcode straal uitlezen
Ik hoop dat iemand mij kan helpen. ik ben bezig om een script te maken die op basis van een postcode
bedrijven in die regio pakt uit de database.
Ik heb een database met postcodes met lat long. ziet er uit als volgt uit
INSERT INTO `off_postcodes` (`provincie`, `plaats`, `postcode`, `straatnaam`, `laag`, `hoog`, `even_oneven`, `breedte`, `lengte`)
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.
Je zou ook naar de eerste cijfers van de postcode kunnen kijken. Dan heb je gebieden die beter geografische grenzen volgen.
Bedoel je misschien iets als marktplaats?
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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DELIMITER $$
CREATE FUNCTION GetDistance(orgLat DECIMAL(10,6),
orgLong DECIMAL(10,6),
destLat DECIMAL(10,6),
destLong DECIMAL(10,6))
RETURNS INT(5)
BEGIN
DECLARE dist INT(11);
SET dist := ROUND(6371 *
acos(cos(radians(orgLat) ) *
cos(radians(destLat)) *
cos(radians(destLong) - radians(orgLong)) + sin(radians(orgLat))
* sin(radians(destLat))));
RETURN dist;
END$$
DELIMIMTER ;
CREATE FUNCTION GetDistance(orgLat DECIMAL(10,6),
orgLong DECIMAL(10,6),
destLat DECIMAL(10,6),
destLong DECIMAL(10,6))
RETURNS INT(5)
BEGIN
DECLARE dist INT(11);
SET dist := ROUND(6371 *
acos(cos(radians(orgLat) ) *
cos(radians(destLat)) *
cos(radians(destLong) - radians(orgLong)) + sin(radians(orgLat))
* sin(radians(destLat))));
RETURN dist;
END$$
DELIMIMTER ;
Dan in het gebruik:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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
?>
// 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
Allemaal bedankt voor de hulp. ik ben weer een stukje wijzer.
op http://blog.peha-ict.nl/blog1.php/afstanden-bepalen-mbv-google-maps-1 staat een stuk wat daar op aansluit.
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.
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:
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.
Query een lijst met addressen aan de hand van een postcode
Deze zal ik maar even sluiten voordat er twee draadjes door elkaar zullen lopen ;-)