Beste allemaal,
momenteel ben ik bezig met een applicatie waarbij men items in een database kan toevoegen met de velden:
Adres (Straat + Huisnummer)
Postcode + Woonplaats
Provincie
Land
Hiermee heb ik nu een klein bestand opgebouwd met enkele items erin. De opbouw van Land -> Provincie -> Plaats is momenteel:
tblland:
id | landnaam
tblprovincie:
id | provincienaam | landid
tblwoonplaats:
id | woonplaatsnaam | provincieid
De postcode wordt door de user straks zelf ingevoerd.
Wat moet er gebeuren?
Ik heb al een manier gevonden om via de Coördinaten de afstand te berekenen tussen 2 plaatsen (hemelsbreed), en om eerlijk te zijn geef ik ook de voorkeur aan coördinaten omdat het systeem straks ook buiten Nederland werkbaar moet blijven (afstand tussen postcodes is dus eigenlijk out of the picture).
Het probleem wat ik echter heb is, dat ik geen manier heb kunnen vinden via mijn vriend google om via de invoer van een adres (woonplaats zou in feite al genoeg zijn -> woonplaats,provincie,land) de coördinaten terug geeft (Noorder Breedte en Ooster Lengte).
Nu wilde ik dus vragen, weet iemand van jullie hoe ik deze coördinaten kan verkrijgen? Is er misschien een mogelijkheid voor via de Google Maps API? (een xml response of iets dergelijks?)
Alvast bedankt voor de hulp!
- [PHP/SQL] Adressendatabase (afstandsberekening)
-
09-10-2007, 15:25 #1
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
[PHP/SQL] Adressendatabase (afstandsberekening)
-
-
09-10-2007, 16:08 #2
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
De google API is misschien bruikbaar, zoals ik las op hun website.
Als ik de API een adres laat zoeken na een invoer kan ik vervolgens het center (geocodes) verkrijgen via een functie als ik het goed zag.
Overigens zag ik ook map24.com dat die een XML/SOAP API hadden om geocodes te kunnen verkrijgen adhv adressen (ook van incomplete/foutgespelde adressen). Iemand ervaring met map24? want de werking hiervan heb ik nog niet geheel door.
-
09-10-2007, 16:11 #3
- Berichten
- 44
- Lid sinds
- 18 Jaar
via de api van google maps kan je geo coordinaten opvragen. zal even voor je zoeken...
http://www.google.com/apis/maps/docu...ClientGeocoder
hier moet je volgens mij wel wat mee kunnen succesLaatst aangepast door Rik Busschers : 09-10-2007 om 16:20
-
09-10-2007, 19:37 #4
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
Jep, aan die methode zat ik inderdaad te denken. 24Maps.com ziet er om eerlijk te zijn iets ingewikkelder uit :)
-
09-10-2007, 19:50 #5
- Berichten
- 26
- Lid sinds
- 17 Jaar
Omdat het vandaag dinsdag is...
even zelf een google key aanvragen!
PHP Code:
function distance($lat1, $lon1, $lat2 = null, $lon2 = null, $unit = 'K') {
$m = 69.09 * rad2deg(acos(sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon1 - $lon2))));
return $m*1.609344;
}
$geo = file_get_contents('http://maps.google.com/maps/geo?q=amsterdam,The%20Netherlands&output=csv&key=ffeigenkeyplaatsen');
$geo1 = split(',',$geo);
$geo = file_get_contents('http://maps.google.com/maps/geo?q=utrecht,The%20Netherlands&output=csv&key=ffeigenkeyplaatsen');
$geo2 = split(',',$geo);
$dis = distance($geo1[2],$geo1[3],$gmap2[2],$gmap2[3]);
-
09-10-2007, 19:52 #6
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
Ah kijk aan, super! :)
Hartelijk dank, ga het morgen direct uitproberen!
-
12-10-2007, 13:26 #7
- Berichten
- 26
- Lid sinds
- 17 Jaar
en werkt dit ook goed voor het buiteland?
-
15-10-2007, 17:20 #8
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
Heb er nog niet naar gekeken. Heb nog wat andere projecten die mijn aandacht vragen ;) Ik denk eigenlijk nu op voorhand dat het wel werkt.
Het enige wat je nodig hebt is de lengte en breedte graden van een bepaald adres. Het is enkel belangrijk dat je de juiste input van je gebruikers kunt controleren alvorens je script strand (ajax functionaliteit of iets dergelijks zonder je page te herladen).
Voor zover ik weet handeld google de foute invoeren al goed af en geeft hij de juiste plaats aan (in googlemaps tenminste) in plaats van een error.. Zodra ik wat meer weet laat ik wel wat weten.. het is voor mijn project ook eigenlijk alleen maar voor Ned/Be bedoelt en later pas aanpassingen naar meer Europese landen, maar ik ben een voorstander ervan om alles vooraf al goed te doen (talen/landen in de db / content support voor meedere talen / applicaties die voor een ruimer gebied werken zoals deze) in plaats van naderhand de hele source om te gaan gooien :) Je kunt het beter in één keer goed doen dan wanneer je er meer en meer tijd in gaat steken bij het upgraden.
-
29-10-2007, 11:37 #9
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
Ik ben er nu dus mee bezig, en klopt het dat bij de functie distance() onderaan, $gmap2 naar $geo2 veranderd moet worden?
En dat ik per adres de geografische punten apart kan krijgen alsvolgt:
Plaats A = sin(deg2rad($lat1)) & cos(deg2rad($lat1))
Plaats B = sin(deg2rad($lat2)) & cos(deg2rad($lat2))
Verder weet ik niet wat de waardes van $1on1 en $1on2 zijn en wat deze precies doen? Anders is het wellicht wat lastiger om hier een zoekfunctie op te baseren.
-
29-10-2007, 11:57 #10
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
Ga het al anders oplossen, bij een zoekquery worden eerst de betreffende resultaten opgehaald en daarna nog eens per resultaat bekeken wat de afstand is en als deze voldoet aan de eisen (<25 / <50 etc) wordt ie weergegeven.
Iets grotere pageload, maar dat zal echt maar een paar milliseconden zijn.
-
29-10-2007, 12:25 #11
- Berichten
- 606
- Lid sinds
- 18 Jaar
Ben ook met zoiets bezig, maar hoe bereken jij dan de afstand tussen de coordinaten? Of is dat het geheim van de smit.
-
29-10-2007, 12:30 #12
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
Heb het werkend, en kan zeggen voor de geinteresseerde:
Dit stukje code werkt ook met steden over de grenzen (zoals ik al verwachtte). Ideaal dus voor afstandsberekeningen in zoekfuncties.
Momenteel ziet mijn zoekfunctie er als volgt uit:
[Als je op submit hebt gedrukt]:
1) Alle huizen selecteren die aan de eisen voldoen
Binnen de WHILE loop die de resultaten uit de DB haalt:
2) Plaats/Land van gebruiker en huis gebruiken wat er is ingevuld om afstand te berekenen
3) Afstand gelijkstellen aan die wat opgegeven is
4) Klopt de afstand? variable $go = 1 anders $go = 0; (en als je er 'geenkeuze is ingevuld bij de afstand $go default op 1 zetten)
5) Als $go gelijk is aan 1 dan de whileloop afmaken door de huizen te echoën op je pagina.
Simpel, effectief en goed systeem!
-
29-10-2007, 12:31 #13
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
@Dirk:
Het scriptje wat hierboven is geplaatst door Sander Timmer (nogmaals bedankt!) is alles wat je nodig hebt. Hierboven heb ik zojuist uitgelegd hoe je een zoekfunctie op basis van dit scriptje zou kunnen maken.
Succes!
-
31-10-2007, 11:50 #14
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
Er blijkt dus toch iets fout te gaan waarbij wellicht iemand me kan helpen:
Afgelopen maandag leek alles te werken maar momenteel weet het script zich soms geen raad meer. in 8/10 gevallen geeft het script gewoon de juiste afstand aan, maar in andere gevallen geeft het script de waarde '0' terug.
Zo is de afstand tussen Maastrich en Arnhem bijvoorbeeld 0 km. Ik heb het script nagekeken via de google api en dit zijn de waardes wat ik terug krijg:
Maastricht: 200,4,50.849847,5.687259
Arnhem: 200,4,51.979730,5.912403
Deze waardes worden middels split() uit elkaar gehaald zoals je in het script ziet, en op basis daarvan wordt een berekening uitgevoerd die je ook hierboven kunt vinden.
Het vreemde is dus dat hij hierop 0 returned. In sommige gevallen laat hij wel de correcte afstand tussen arnhem en maastricht zien. Hoe zou dit kunnen komen en hoe valt dit op te lossen?
Ik dacht in eerste instantie dat de response van de google website te langzaam was en er daarom Lengte en Breedtegraden niet verkregen werden, maar dat lijkt me vrijwel onmogelijk gezien ik dan ofwel een timeout error zou krijgen ofwel een fout bij het lezen van de file.
-
31-10-2007, 12:29 #15
- Berichten
- 1.899
- Lid sinds
- 18 Jaar
Tevens wilt het script hier en daar nog wel eens een veel te grote afstand weergeven.. dit terwijl de output wel zou moeten kloppen. (Hij klopt sowieso als ik hem manueel invoer).
Ik kreeg zojuist de error:
execution time exceeded, waardoor ik dus toch denk dat het openenen en verkrijgen van de waardes niet snel genoeg gebeurd. Ik heb nu aan het einde van mijn whileloop een sleep() van 1 seconde gezet en dit lost het probleem wel op. Probleem is natuurlijk dat het laden van de pagina nu 1 seconden per gevonden record duurt.
Tip:
Dit script support ook postcodes! Sommige (in Nederland en Spanje wat ik getest heb) is de postcode + land genoeg (bijv. 6219, the Netherlands) in andere gevalllen (belgie bijvoorbeeld) moet je ook de plaats erbij vermelden: 3624, Rekem, Belgium. Zeker een leuk script om mee te spelen als je afstandsberekeningen wilt doen in bijv je marktplaats script ;-)Laatst aangepast door Joshua de Gier : 31-10-2007 om 13:05
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic