Hemelsbreed 4 coords..
Yooo Mensen,
K had ff een vraagje voor jullie ;-)
Ik heb een dorp met een x en y coordinaat(waar hij ligt)
Dan wil ik voor marktplaats berekenen welk dorp met aanbod het dicht bij jou ligt en zo een lijst maken, dat dorp dan uiteraard ook een x en y coordinaat. Dus wil ik tussen die plek een hemelsbrede berekening maken. Ik heb alleen geen idee hoe je dat doet, ik heb van alles geprobeerd maar kom er maar niet uit.
Zouden jullie mij klein stukje kunnen helpen met beetje uitleg ofzo, ik vraag niet om heel script maar gewoon uitleg :-D script is ook goed ;-) maar ik weet dat het geen voorkauwhulp.nl is :P
Groeten, Vincent ;-)
Bvd
K had ff een vraagje voor jullie ;-)
Ik heb een dorp met een x en y coordinaat(waar hij ligt)
Dan wil ik voor marktplaats berekenen welk dorp met aanbod het dicht bij jou ligt en zo een lijst maken, dat dorp dan uiteraard ook een x en y coordinaat. Dus wil ik tussen die plek een hemelsbrede berekening maken. Ik heb alleen geen idee hoe je dat doet, ik heb van alles geprobeerd maar kom er maar niet uit.
Zouden jullie mij klein stukje kunnen helpen met beetje uitleg ofzo, ik vraag niet om heel script maar gewoon uitleg :-D script is ook goed ;-) maar ik weet dat het geen voorkauwhulp.nl is :P
Groeten, Vincent ;-)
Bvd
Gewijzigd op 01/01/1970 01:00:00 door Vincent
ik denk dat je je moet verdiepen in de stelling van pietjesgras (AB2 = BC2 + AC2) (2 is kwadraat)
edit: Pythagoras heette die gast
edit: Pythagoras heette die gast
Gewijzigd op 01/01/1970 01:00:00 door Terence Hersbach
a = x - afstandhemelsbreed
b = x + afstandhemelsbreed
c = y - afstandhemelsbreed
d = y + afstandshemelsbreed
SELECT * FROM tabel WHERE
x = between a and b
and
y = between c and d
(dat is overigens vierkant, maar wel de eenvoudigste oplossing)
b = x + afstandhemelsbreed
c = y - afstandhemelsbreed
d = y + afstandshemelsbreed
SELECT * FROM tabel WHERE
x = between a and b
and
y = between c and d
(dat is overigens vierkant, maar wel de eenvoudigste oplossing)
Gewijzigd op 01/01/1970 01:00:00 door Arjan Kapteijn
Terence heb ik op school gehad, ik zal er wel naar kijken :)
Arjan a = x - afstandhemelsbreed. Die afstand wou ik net berekenen :P
Arjan a = x - afstandhemelsbreed. Die afstand wou ik net berekenen :P
wat nou als je eens berekend hoeveel x er verschil is en hoeveel y, dan deze bij mekaar opteld en dan kun je toch op een lijstje komen met welke het dichtst bij zit?
Hier hoort tekeningetje bij :) 
dorp1 = Â (hoek A)-> bovenste hoek x1 ; y1
dorp2 = hoek B -> links onder = x2 ; y2
|ac|(vanboven naar onder) = b = y1 - y2
|bc|(links naar rechts) = a = x1 - x2
c = vierkantswortel(|bc|² + |ac|²)
c = vierkantswortel( (x1 - x2)² + (y1 - y2)²)
(c = afstand tussen de 2 dorpen)

dorp1 = Â (hoek A)-> bovenste hoek x1 ; y1
dorp2 = hoek B -> links onder = x2 ; y2
|ac|(vanboven naar onder) = b = y1 - y2
|bc|(links naar rechts) = a = x1 - x2
c = vierkantswortel(|bc|² + |ac|²)
c = vierkantswortel( (x1 - x2)² + (y1 - y2)²)
(c = afstand tussen de 2 dorpen)
Gewijzigd op 01/01/1970 01:00:00 door Dizzy
'Dizzy:
Hier hoort tekeningetje bij :) 
dorp1 = Â (hoek A)-> bovenste hoek x1 ; y1
dorp2 = hoek B -> links onder = x2 ; y2
|ac|(vanboven naar onder) = b = y1 - y2
|bc|(links naar rechts) = a = x1 - x2
c = vierkantswortel(|bc|² + |ac|²)
c = vierkantswortel( (x1 - x2)² + (y1 - y2)²)
(c = afstand tussen de 2 dorpen)

dorp1 = Â (hoek A)-> bovenste hoek x1 ; y1
dorp2 = hoek B -> links onder = x2 ; y2
|ac|(vanboven naar onder) = b = y1 - y2
|bc|(links naar rechts) = a = x1 - x2
c = vierkantswortel(|bc|² + |ac|²)
c = vierkantswortel( (x1 - x2)² + (y1 - y2)²)
(c = afstand tussen de 2 dorpen)
Als ik eerlijk mag zijn begrijp ik er
Zou je dit tot een php script kunnen omzetten? Dan ga ik allemaal dingen mee proberen en misschien dat ik het dan begrijp?
Beetje rare vraag misschien.. maarja...
Vincent, ik heb al een idee,
Ik werk even wat uit voor je. als je even op IRC kanaal komt dan kan je meehelpen ;-)
Ik werk even wat uit voor je. als je even op IRC kanaal komt dan kan je meehelpen ;-)
Ok tnx! ik kom op chat tnx :)
offtopic:
heeft phphulp een irc kanaal dan?:P
heeft phphulp een irc kanaal dan?:P
Neej, je bent ook niet online ofzo.. xD
ja 2 min later gevonden, wat dacht je dan:P
Als je meerdere punten hebt en je wil weten welk het dichtsbij is, dan wil je dus afstand tussen deze twee punten weten. Dit is een lineaire lijn. Het is dus eigenlijk betrekkelijk simpel.
Je berekent het verschil tussen X1 en X2, en tussen Y1 en Y2, waarbij de coördinaten dus de syntax (X1, Y1) en (X2, Y2) hebben.
Als X2-X1 = 0, dan is het verschil gewoon Y2 - Y1 en hoef je geen pythagoras te gebruiken. Het is immers een rechte verticale lijn.
Als Y2-Y1 = 0, dan is het verschil gewoon X2 - X1 en hoef je ook geen pythagoras te gebruiken. Het is immers een rechte horizontale lijn.
Als beide verschillen wel groter of kleiner dan 0 zijn dan zou ik de verschillen allebei omvormen tot positieve getallen. Want negatieve getallen heb je niets aan; het verschil is even groot, of het ene nou links of rechts van het ander ligt.
A² + B² = C²
A = X2 - X1
B = Y2 - Y1
De rest is simpel.
Je berekent het verschil tussen X1 en X2, en tussen Y1 en Y2, waarbij de coördinaten dus de syntax (X1, Y1) en (X2, Y2) hebben.
Als X2-X1 = 0, dan is het verschil gewoon Y2 - Y1 en hoef je geen pythagoras te gebruiken. Het is immers een rechte verticale lijn.
Als Y2-Y1 = 0, dan is het verschil gewoon X2 - X1 en hoef je ook geen pythagoras te gebruiken. Het is immers een rechte horizontale lijn.
Als beide verschillen wel groter of kleiner dan 0 zijn dan zou ik de verschillen allebei omvormen tot positieve getallen. Want negatieve getallen heb je niets aan; het verschil is even groot, of het ene nou links of rechts van het ander ligt.
A² + B² = C²
A = X2 - X1
B = Y2 - Y1
De rest is simpel.
Of je gebruikt postgresql, die doet het voor je. (even voor de nit-pickerigheid, het gaat om 2 coordinaten. Een coordinaat bestaat uit een x en een y (eventueel ook een z en meer onderdelen wanneer je de 3 dimensies verlaat)).
1: maak een tabel met punten.
2: SELECT naam, (coordinates <-> point(400,100)) from punten;
1: maak een tabel met punten.
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
CREATE TABLE punten (
naam character varying,
coordinates point
);
COPY punten (naam, coordinates) FROM stdin;
Plaats A (0,1)
Plaats A (0,1)
Plaats B (500,400)
Plaats C (800,-900)
Plaats D (200,-700)
\.
naam character varying,
coordinates point
);
COPY punten (naam, coordinates) FROM stdin;
Plaats A (0,1)
Plaats A (0,1)
Plaats B (500,400)
Plaats C (800,-900)
Plaats D (200,-700)
\.
2: SELECT naam, (coordinates <-> point(400,100)) from punten;
Gewijzigd op 01/01/1970 01:00:00 door Arend a
Ziezo, klaar: (ik heb even PDO gebruikt om het wat simpel te houden)
Voorbeeld
@Smurf Minions: IRC Kanaal
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
// lengte tot gekozen dorp bepalen en sorteren welke het dichtst is
$dorpid = (int) $_GET['id'];
$dorp = $db->query('SELECT id,x,y FROM dorpen WHERE id = '.$dorpid,PDO::FETCH_ASSOC)->fetch();
$dorpen = $db->query('SELECT id,naam,SQRT( POW(('.$dorp['x'].'-x),2) + POW(('.$dorp['y'].'-y) ,2) ) as afstand FROM dorpen WHERE id <> '.$dorp['id'].' ORDER BY afstand',PDO::FETCH_ASSOC)->fetchAll();
print_r($dorpen);
?>
// lengte tot gekozen dorp bepalen en sorteren welke het dichtst is
$dorpid = (int) $_GET['id'];
$dorp = $db->query('SELECT id,x,y FROM dorpen WHERE id = '.$dorpid,PDO::FETCH_ASSOC)->fetch();
$dorpen = $db->query('SELECT id,naam,SQRT( POW(('.$dorp['x'].'-x),2) + POW(('.$dorp['y'].'-y) ,2) ) as afstand FROM dorpen WHERE id <> '.$dorp['id'].' ORDER BY afstand',PDO::FETCH_ASSOC)->fetchAll();
print_r($dorpen);
?>
Voorbeeld
@Smurf Minions: IRC Kanaal
Tnx allemaal :D
Ik heb achter de schermen super veel hulp gehad ;-)
Bedankt!
Ik heb achter de schermen super veel hulp gehad ;-)
Bedankt!
Overigens, gps coordinaten zijn niet in het platte vlak (mocht je gps coordinaten gebruiken).
Zie ook:
http://www.postcode.nl/index.php?PageID=151
Aangezien de aarde rond dien je deze me te rekenen.
Zie ook:
http://www.postcode.nl/index.php?PageID=151
Aangezien de aarde rond dien je deze me te rekenen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?
DEFINE (R, 6367000); // Radius of the Earth in meters
//example coordinate of neighborhood 2011 in the Netherlands (Haarlem centrum)
$lat1 = 52.3826;
$lon1 = 4.637;
//example coordinate of neighborhood 6199 in the Netherlands (Maastricht-Airport)
$lat2 = 50.9235;
$lon2 = 5.7812;
//convert degrees to radians
$lat1 = ($lat1 * pi() ) / 180;
$lon1 = ($lon1 * pi() ) / 180;
$lat2 = ($lat2 * pi() ) / 180;
$lon2 = ($lon2 * pi() ) / 180;
//Haversine Formula (see here )
$dlon = $lon2 - $lon1;
$dlat = $lat2 - $lat1;
$a = pow(sin($dlat/2), 2) + cos($lat1) * cos($lat2) * pow(sin($dlon/2), 2);
$intermediate_result = 2 * asin(min(1,sqrt($a)));
$distance = R * $intermediate_result;
echo $distance;
?>
DEFINE (R, 6367000); // Radius of the Earth in meters
//example coordinate of neighborhood 2011 in the Netherlands (Haarlem centrum)
$lat1 = 52.3826;
$lon1 = 4.637;
//example coordinate of neighborhood 6199 in the Netherlands (Maastricht-Airport)
$lat2 = 50.9235;
$lon2 = 5.7812;
//convert degrees to radians
$lat1 = ($lat1 * pi() ) / 180;
$lon1 = ($lon1 * pi() ) / 180;
$lat2 = ($lat2 * pi() ) / 180;
$lon2 = ($lon2 * pi() ) / 180;
//Haversine Formula (see here )
$dlon = $lon2 - $lon1;
$dlat = $lat2 - $lat1;
$a = pow(sin($dlat/2), 2) + cos($lat1) * cos($lat2) * pow(sin($dlon/2), 2);
$intermediate_result = 2 * asin(min(1,sqrt($a)));
$distance = R * $intermediate_result;
echo $distance;
?>
Gewijzigd op 01/01/1970 01:00:00 door Arend a




