Hemelsbreed 4 coords..
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
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
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?
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 schreef op 09.08.2007 14:22:
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...
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 :)
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
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.
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
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
Ik heb achter de schermen super veel hulp gehad ;-)
Bedankt!
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