Beste Mensen,

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 uitleg is duidelijk, maar wat is je vraag?

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?
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?
Dit doe je eenmalig:

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 ;

Dan in het gebruik:

<?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
?>
@Johan nee niet zoals marktplaats

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.

dat lijkt met niet zo'n handige volgorde.

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
Oke dan ga ik even kijken of het werkt wat ger voorsteld.

Allemaal bedankt voor de hulp. ik ben weer een stukje wijzer.
ik heb in het verleden eens een poging tot een blog bijhouden gedaan.
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.
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.

Reageren