Ga naar inhoud
  • 0

Postcodes binnen een straal van ...


McGuffin

Vraag

Uit en lijst van ± 5000 adressen wil ik de postcodes binnen een straal van, zeg als vb, 10 km.

Daar is al eea over geschreven en heb die puzzel opgelost met behulp van onder andere :

viewtopic.php?f=23&t=5891#p36756

Dat werkt perfect. Dank voor het beschikbaar stellen van die info!

 

Maar nu:

- de lokatie van de gebruiker staat in 2 globals. (lat_g en lon_g)

- deze worden dus niet geïndexeerd.

- de uitkomst van de functie/formule is de afstand in km en wordt eerst voor elk record, bij elke zoek actie op een bep. straal opnieuw berekend volgens mij.

- op een 'normale' compu gaat dat nog acceptabel snel, maar op m'n bejaarde iPad 2, niet. Dan duurt het ± 30 sec.. :(

 

Heeft iemand toch tips om dat zoeken en sorteren op een gegeven straal te versnellen?

 

dank

m

Link naar reactie

6 antwoorden op deze vraag

Aanbevolen berichten

  • 0

je hebt blijkbaar al gevonden hoe je de afstand moet berekenen tot een bepaald punt, en zoals je zelf zei is dat nogal traag op de hele recordset. De truc die ik toepas is om eerst de punten te gaan zoeken die binnen het vierkant vallen die de circel omsluit, omdat je hier wel een geindexeerde zoekopdracht op de coordinaten kan doen (de x coordinaat moet namelijk in de range vallen van je x ondergrens van je vierkant en de x bovengrens van je vierkant, en zo ook voor je y coordinaat).

 

Daarna kan je dan op die foundset de afstandszoekopdracht uitvoeren die je al hebt. Die gaat nog altijd een niet-geindexeerde zoekopdracht zijn, maar al op een gereduceerde foundset.

Link naar reactie
  • 0

Dank voor deze tips!

Dante's tabel is heel grondig volgens mij; staat een schat aan info in.

Ik was met onderstaande formule begonnen. Dit is volgens mij de meest nauwkeurige, maar ook meest bewerkelijke.

Let ( [
lat1 = lat_g * (Pi / 180) ; 
lon1 = lon_g * (Pi / 180) ;
lat2 = lat * (Pi / 180) ;
lon2 = lon * (Pi / 180) ;
R = 6371 ;
lat = lat2 - lat1 ; 
lon = lon2 - lon1 ; 

d = Acos ( (Sin (lat1) * Sin (lat2)) + (Cos(lat1) * Cos ( lat2) * Cos(lon))) * R
] ; 
d
)

 

daarnaast, ter vergelijk, heb ik in een calc veld deze gezet

Round ( 
6378137 // equatorial radius of Earth in meters according to WGS 84
* Acos (
   Cos ( Radians ( _lat2 - lat_g ) )
   - Cos ( Radians ( lat_g ) )
   * Cos ( Radians ( _lon2 ) )
   * ( 1 - Cos ( Radians ( _lon2 - lon_g ) ) )
)/1000; 1 )

 

dat gaat al sneller.

Ik ga nu andries tip gebruiken, om de set te verkleinen.

dank!

Link naar reactie
  • 0

Beste Allen,

Ik bouw voor een vriendin een webshop met Woocommerce. Ik heb twee lijsten met postcodes nodig vanaf haar postcode (2282) binnen 5 km en binnen 10 km, ik heb alleen de 4 getallen van de postcodes nodig. Als iemand de oplossing zoals hier beschreven werkend heeft, kan hij mij deze lijsten dan bezorgen?

Met vriendelijke groet,

Roel

Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...