Afstand berekenen long en lat.
Ik heb een lijst met alle steden van nederland inclusief long en latitude. Nou haal ik de lng en lat op via GeoLocation en krijg dus een lng en lat. Hoe kan ik nou uitzoeken welke stad daarbij hoord?
Wat klopt er niet.... de titel (afstand berekenen) of de vraag (hoe een stad te vinden aan de hand van lng/lat)?
Dit script heb ik vorig jaar eens gebouwd voor een projectje en haal het land op.
Met even rondneuzen in de debug-array (&debug=1) kan je de plaatsnaam ook wel ophalen.
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
27
28
29
30
31
32
33
34
35
36
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
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test van coordinaat-metadata ophalen....</title>
</head>
<body>
<p>Hier kan je de landcode zien van een coordinaat:</p>
<?php
if(isset($_GET['coords'])) {
$url = "http://maps.googleapis.com/maps/api/geocode/xml?latlng=".$_GET['coords']."&sensor=true";
$xml = simplexml_load_file($url,NULL, LIBXML_NOCDATA);
if(isset($_GET['debug'])) {
echo "<pre>".print_r($xml,true)."</pre>";
}
if($xml->status == "ZERO_RESULTS") {
echo "Geen resultaten gevonden!";
} else {
echo "<ul>";
foreach ($xml->result->address_component as $item) {
$item = (array)$item;
if($item['type'][0] == "country") {
echo "<li>Landcode:".$item['long_name']."</li>";
echo "<li>Landcode:".$item['short_name']."</li>";
break;
}
}
echo "</ul>";
}
} else {
echo "Ik heb coordinaten nodig (zoals 51.8055,4.73534), anders sta ik uit mijn neus te eten.<br />Snap je het niet? Klik eens <a href='locationcheck.php?coords=51.8055,4.73534'>hier</a>.";
}
?>
</body>
</html>
<html>
<head>
<meta charset="utf-8">
<title>Test van coordinaat-metadata ophalen....</title>
</head>
<body>
<p>Hier kan je de landcode zien van een coordinaat:</p>
<?php
if(isset($_GET['coords'])) {
$url = "http://maps.googleapis.com/maps/api/geocode/xml?latlng=".$_GET['coords']."&sensor=true";
$xml = simplexml_load_file($url,NULL, LIBXML_NOCDATA);
if(isset($_GET['debug'])) {
echo "<pre>".print_r($xml,true)."</pre>";
}
if($xml->status == "ZERO_RESULTS") {
echo "Geen resultaten gevonden!";
} else {
echo "<ul>";
foreach ($xml->result->address_component as $item) {
$item = (array)$item;
if($item['type'][0] == "country") {
echo "<li>Landcode:".$item['long_name']."</li>";
echo "<li>Landcode:".$item['short_name']."</li>";
break;
}
}
echo "</ul>";
}
} else {
echo "Ik heb coordinaten nodig (zoals 51.8055,4.73534), anders sta ik uit mijn neus te eten.<br />Snap je het niet? Klik eens <a href='locationcheck.php?coords=51.8055,4.73534'>hier</a>.";
}
?>
</body>
</html>
Gewijzigd op 28/08/2013 00:20:14 door - Ariën -
Stad = Amsterdam -> lng = 5.5698 -> lat = 3.4745
Stad = Rotterdam -> lng = 3.4785 -> lat = 1.4754
Nu krijg ik via de GLocation de volgende waarde binnen:
lng: 5.4987
lat: 5.6984
Nou moet dus de stad die het meest in de buurt komt getoond worden
Quote:
Met even rondneuzen in de debug-array (&debug=1) kan je de plaatsnaam ook wel ophalen.
Gewijzigd op 28/08/2013 00:20:27 door - Ariën -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DELIMITER $$
CREATE FUNCTION GetDistance (orgLat float, orgLong float, destLat float, destLong float) RETURNS float(10,2)
BEGIN
DECLARE dist float;
SET dist := ROUND(6371 *
acos(cos(radians(orgLat) ) *
cos(radians(destLat)) *
cos(radians(destLong) - radians(orgLong)) + sin(radians(orgLat))
* sin(radians(destLat))), 2);
RETURN dist;
END;
$$
DELIMITER ;
CREATE FUNCTION GetDistance (orgLat float, orgLong float, destLat float, destLong float) RETURNS float(10,2)
BEGIN
DECLARE dist float;
SET dist := ROUND(6371 *
acos(cos(radians(orgLat) ) *
cos(radians(destLat)) *
cos(radians(destLong) - radians(orgLong)) + sin(radians(orgLat))
* sin(radians(destLat))), 2);
RETURN dist;
END;
$$
DELIMITER ;
Dit voer je eenmalig uit en daarna kan je hem in query aanroepen, bv:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
city_name,
GetDistance(51.8055,4.73534,lat,lng) distance
FROM
cities
ORDER BY distance
LIMIT 1
city_name,
GetDistance(51.8055,4.73534,lat,lng) distance
FROM
cities
ORDER BY distance
LIMIT 1
Gewijzigd op 28/08/2013 11:23:50 door Ger van Steenderen
@get: het gaat niet om afstand, het gaat om weten welke stad iemand is met lng en lat. Deze functie geeft je de afstand in meters/kilometers aan volgens mij?
je kan dan als ik het goed heb zoeken (lijn 22) op de type 'locality'. Dan moet je Dordrecht te zien krijgen.
Gewijzigd op 28/08/2013 13:21:55 door - Ariën -
@aar: fantastisch! Ik had lijn 22 naar city veranderd. En de item array veranderd naar $item['city'] maar het werkte niet. Top!
Hoe kan ik zien wat er wel voor komt in die array dan?
Ik geef toe, er zit een vreemde logica in, maar dat heeft Google gewoon bedacht.
Gewijzigd op 28/08/2013 16:59:26 door - Ariën -
Donny Wie weet op 27/08/2013 23:40:42:
Sorry, bedoeling is echt alleen de stad ophalen. Ik heb een database die er zo uit ziet:
Stad = Amsterdam -> lng = 5.5698 -> lat = 3.4745
Stad = Rotterdam -> lng = 3.4785 -> lat = 1.4754
Nu krijg ik via de GLocation de volgende waarde binnen:
lng: 5.4987
lat: 5.6984
Nou moet dus de stad die het meest in de buurt komt getoond worden
Stad = Amsterdam -> lng = 5.5698 -> lat = 3.4745
Stad = Rotterdam -> lng = 3.4785 -> lat = 1.4754
Nu krijg ik via de GLocation de volgende waarde binnen:
lng: 5.4987
lat: 5.6984
Nou moet dus de stad die het meest in de buurt komt getoond worden
Donny Wie weet op 28/08/2013 13:06:08:
@get: het gaat niet om afstand, het gaat om weten welke stad iemand is met lng en lat. Deze functie geeft je de afstand in meters/kilometers aan volgens mij?
Inderdaad, de functie geeft de afstand tussen twee coördinaten.
Maar de query haalt de dichtstbijzijnde stad op.