Geo-codes bepalen
Nu heb ik een vraagje. Is er iemand die mij kan uitleggen hoe ik een functie kan schrijven zodat als ik hengelo selecteer en een straal van 10 kilometer
Dat ik dan alle steden die binnen een straal van 10 kilometer liggen weergegeven worden??
Misschien dat iemand hier een voorbeeld bij kan geven. Het mag eventueel ook een vierkant zijn rond de stad. weet niet wat makkelijker is.
breedte graat van hengelo = 6.8
lengtegraad = 52,2667
voor de mensen die dat altijd al hebben willen weten ;)
groetjes Gijs
Gewijzigd op 29/10/2005 17:16:00 door Gijs
Maar anders gewoon met een for lus steeds 0.0001 eraf halen en in de database checken of er een stad is met die breedte/lengtegraad...
in ieder geval bedankt voor de snelle reactie
Dan wordt het zoiets:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?
$straal = $_POST['straal'];
// Breedtegraad instellen (uit db voor bepaalde stad, of met hand als het persee Hengeloo moet zijn)
$bg = .....;
// Lengtegraad instellen
$lg = ......;
$straal_graden = $straal * 0.01248458;
$sql = "SELECT * FROM steden WHERE $lg-$straal_graden < $lg < lg+$straal_graden";
?>
$straal = $_POST['straal'];
// Breedtegraad instellen (uit db voor bepaalde stad, of met hand als het persee Hengeloo moet zijn)
$bg = .....;
// Lengtegraad instellen
$lg = ......;
$straal_graden = $straal * 0.01248458;
$sql = "SELECT * FROM steden WHERE $lg-$straal_graden < $lg < lg+$straal_graden";
?>
Niet echt goed over nagedacht :$ Dus misschien kom je er wel helemaal niet zo... Maar probeer het eens...
$
Edit: Werkt denk ik niet...
Denk dat het toch met een while lus moet...
Edit2:
Misschien met deze verbetering wel.. Je moet nog wel het een en andere aanpassen...
Gewijzigd op 29/10/2005 18:11:00 door Willem Jan Z
Lengte- en breedtegraden zijn namelijk bolcoördinaten, dus ze zullen bij de polen dichter op elkaar liggen dan bij de evenaar. Nou zal dat voor Nederland niet veel verschillen, maar het is wat lastig (om nauwkeurig te) rekenen me dunkt.
ja klopt heb de afstand tussen amsterdam en hengelo genomen en dan via een 3 hoek uitgerekend hoeveel graden 1 km is. dit is niet perfect maar was ff snel om wat cijfers te kunnen geven...
1 graad is 60 mijl
1 graad op de evennaar is 200 % groter dan in Nederland
Eris:
Kasper daar vergis je aardig in
1 graad op de evennaar is 200 % groter dan in Nederland
1 graad op de evennaar is 200 % groter dan in Nederland
LOL, dan is Nederland een stuk kleiner dan ik dacht! Of die graden liggen verder uit elkaar dan ik dacht...maar hoe zit het dan met minuten en secondes, of heeft dat hier niks mee te maken?
Edit:
Dus Nederland is maar 30 mijl
Maar aan onderstaand plaatje te zien maakt het wel degelijk uit waar je je op het bolletje bevindt:
[limg]http://www.urania.be/sterrenkunde/images/coordinaten-aarde.png[/limg]
Gewijzigd op 29/10/2005 23:03:00 door Winston Smith
Je hebt een x- en een y-coordinaat voor bijvoorbeeld Hengelo en hetzelfde voor alle andere woonplaatsen in Nederland.
Het is alweer een tijdje geleden, maar volgens mij moet je dan de lengte van de hypothenusa weten. In gedachten teken je een rechthoekige driehoek waarbij de schuine zijde staat voor de afstand tussen de twee plaatsen.
Zie plaatje:
Gewijzigd op 29/10/2005 23:37:00 door Jan Koehoorn
neem de absolute waarde van x1 - x2
neem de absolute waarde van y1 - y2
tel de kwadraten bij elkaar op en neem daar de wortel van.
Dan heb je de afstand in graden. Die nog omrekenen naar kilometers en klaar ben je.
Ik weet niet of je hier genoeg aan hebt, dus ik ga nog even kijken voor een voorbeeld in PHP
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
[code]<?php
function afstand ($x1, $y1, $x2, $y2) {
$a = abs ($x1 - $x2);
$b = abs ($y1 - $y2);
$c = pow ($a, 2) + pow ($b, 2);
$c = number_format (sqrt ($c), 1);
return $c;
}
?>
Je loopt dan gewoon de hele array met plaatsnamen af en laat die functie er op los.
Om het proces te versnellen, zou je nog een extra check kunnen doen.
Stel dat abs ($x1 - $x2) of abs ($y1 - $y2) al groter is dan 10 km. Dan kun je meteen verder met de volgende in de lijst. Dat zou je dus in je code in kunnen bouwen.
[code]<?php
function afstand ($x1, $y1, $x2, $y2) {
$a = abs ($x1 - $x2);
$b = abs ($y1 - $y2);
$c = pow ($a, 2) + pow ($b, 2);
$c = number_format (sqrt ($c), 1);
return $c;
}
?>
Je loopt dan gewoon de hele array met plaatsnamen af en laat die functie er op los.
Om het proces te versnellen, zou je nog een extra check kunnen doen.
Stel dat abs ($x1 - $x2) of abs ($y1 - $y2) al groter is dan 10 km. Dan kun je meteen verder met de volgende in de lijst. Dat zou je dus in je code in kunnen bouwen.
Je hebt 2 verschillende soorten cirkels
1. Een groot cirkel. Een lijn die de aarde in 2 helften deelt
2. Een klein cirkel Die de aarde in 2 ongeleike delen deelt.
De definitie van een de mijl (Nautische mijlen) is 1 minuut op een groot cirkel
Dit geld eigelijk ook op de klein cirkel
Op de aarde komt 1 mijl gemiddeld over een met 1,852 km (Bij de polen veel kleiner bij de evennaar groter)
Ohja bolgenomica is leuk ;)
Kasper:
LOL, dan is Nederland een stuk kleiner dan ik dacht! Of die graden liggen verder uit elkaar dan ik dacht...maar hoe zit het dan met minuten en secondes, of heeft dat hier niks mee te maken?
Edit:
Dus Nederland is maar 30 mijlbreed lang (volgens het plaatje)?! Zijn dat zeemijlen of luchtmijlen of...??
Maar aan onderstaand plaatje te zien maakt het wel degelijk uit waar je je op het bolletje bevindt:
[limg]http://www.urania.be/sterrenkunde/images/coordinaten-aarde.png[/limg]
Eris:
Kasper daar vergis je aardig in
1 graad op de evennaar is 200 % groter dan in Nederland
1 graad op de evennaar is 200 % groter dan in Nederland
LOL, dan is Nederland een stuk kleiner dan ik dacht! Of die graden liggen verder uit elkaar dan ik dacht...maar hoe zit het dan met minuten en secondes, of heeft dat hier niks mee te maken?
Edit:
Dus Nederland is maar 30 mijl
Maar aan onderstaand plaatje te zien maakt het wel degelijk uit waar je je op het bolletje bevindt:
[limg]http://www.urania.be/sterrenkunde/images/coordinaten-aarde.png[/limg]
Hellaas gaat dat ook niet op ;)
stukje:
Op de aarde komt 1 mijl gemiddeld over een met 1,852 km (Bij de polen veel kleiner bij de evennaar groter)
Dus dan had ik tóch een béétje gelijk met die afwijking :) Overigens, waarom bestaan er verschillende mijlen? In Word gaf het conversieprogramma aan dat 1 mijl gelijk staat aan 1,61km, en de luchtmijl is - dacht ik - ongeveer 0,8 keer zo ver als de km. Dan heb je nog de gewone mijl, maar die zal gelijk zijn aan 1,852km :)
Zou de luchtmijl (niet) langer (moeten) zijn omdat de inhoud van de bol groter is, waardoor de lijnen verder uit elkaar gerekt worden bedenk ik me net? Of heeft dat er niks mee te maken?
nog:
Ohja bolgenomica is leuk ;)
/me gaat zich er wat in verdiepen. /me vindt dat wel interessant :)
laatste:
Hellaas gaat dat ook niet op ;)
Verklaart u nader!
Want 30 * 1,852 = 55,56 km lijkt me wat weinig voor de 'breedte' van Nederland? En op dat plaatje zie ik toch echt dat een graad daar korter moet zijn dan op de evenaar? Maar dan klopt:
Quote:
De definitie van een de mijl (Nautische mijlen) is 1 minuut op een groot cirkel
Dit geld eigelijk ook op de klein cirkel
Dit geld eigelijk ook op de klein cirkel
dat weer niet? Waarom (niet)? :S
Gewijzigd op 30/10/2005 01:40:00 door Winston Smith
Edit:
2 handige links
http://nl.wikipedia.org/wiki/Lengtegraad
http://nl.wikipedia.org/wiki/Breedtegraad
Gewijzigd op 30/10/2005 01:51:00 door Thijs X
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
<?
function afstand($breedte_graad1, $lengte_graad1, $breedte_graad2, $lengte_graad2)
{
$afstand_x = (cos(deg2rad($breedte_graad1)) * 40074) - (cos(deg2rad($breedte_graad2)) * 40074);
$afstand_x = abs($afstand_x) / 2;
$afstand_y = (($lengte_graad1 - $lengte_graad2) * (40074 / (360 * 60)) * 60);
$afstand_y = abs($afstand_y);
$afstand_totaal = pow($afstand_x, 2) + pow($afstand_y, 2);
$afstand_totaal = number_format(sqrt($afstand_totaal), 2, ',', '.');
return $afstand_totaal. " Km";
}
echo afstand("5", "54,276799", "7", "51,276799");
?>
function afstand($breedte_graad1, $lengte_graad1, $breedte_graad2, $lengte_graad2)
{
$afstand_x = (cos(deg2rad($breedte_graad1)) * 40074) - (cos(deg2rad($breedte_graad2)) * 40074);
$afstand_x = abs($afstand_x) / 2;
$afstand_y = (($lengte_graad1 - $lengte_graad2) * (40074 / (360 * 60)) * 60);
$afstand_y = abs($afstand_y);
$afstand_totaal = pow($afstand_x, 2) + pow($afstand_y, 2);
$afstand_totaal = number_format(sqrt($afstand_totaal), 2, ',', '.');
return $afstand_totaal. " Km";
}
echo afstand("5", "54,276799", "7", "51,276799");
?>
Edit:
Voorbeeld http://php.ferket.net/afstand.php
Volgens mij werkt die aardig goed :D
Gewijzigd op 30/10/2005 02:42:00 door Thijs X
Ja hij klopt! Als ik coordienaten van de noord en zuidpool opgeef kom ik op 20.037,00 Km wat de helft van de aarde is. Duz hij klopt :P
Thanks voor de hulp. ben blij dat sommige mensen het leuk vonden om naar dit probleem te kijken. ik ben goed geholpen. bedankt hier voor
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
function afstand($breedte_graad1, $lengte_graad1, $breedte_graad2, $lengte_graad2)
{
$afstand_x = (cos(deg2rad($breedte_graad1)) * 40074) - (cos(deg2rad($breedte_graad2)) * 40074);
$afstand_x = abs($afstand_x) / 2;
$afstand_y = (($lengte_graad1 - $lengte_graad2) * (40074 / (360 * 60)) * 60);
$afstand_y = abs($afstand_y);
$afstand_totaal = pow($afstand_x, 2) + pow($afstand_y, 2);
$afstand_totaal = number_format(sqrt($afstand_totaal), 2, ',', '.');
return $afstand_totaal. " Km";
}
echo afstand("5.85562", "50.88590", "5.83014", "50.86261");
echo afstand("5.85562", "50.88590", "5.68726", "50.84985");
?>
function afstand($breedte_graad1, $lengte_graad1, $breedte_graad2, $lengte_graad2)
{
$afstand_x = (cos(deg2rad($breedte_graad1)) * 40074) - (cos(deg2rad($breedte_graad2)) * 40074);
$afstand_x = abs($afstand_x) / 2;
$afstand_y = (($lengte_graad1 - $lengte_graad2) * (40074 / (360 * 60)) * 60);
$afstand_y = abs($afstand_y);
$afstand_totaal = pow($afstand_x, 2) + pow($afstand_y, 2);
$afstand_totaal = number_format(sqrt($afstand_totaal), 2, ',', '.');
return $afstand_totaal. " Km";
}
echo afstand("5.85562", "50.88590", "5.83014", "50.86261");
echo afstand("5.85562", "50.88590", "5.68726", "50.84985");
?>
Hoe kan ik deze dan sorteren op afstand, beginnen bij laag en dan oploppend, en dan bijvoorbeeld een limiet bij maximaal 10 weergaves.