Google maps
Ik ben nieuw op dit forum en volgens de regels moet ik me voorstellen. Ik ben bijna 60 jaar oud. Ik speel met computers vanaf het CPM tijdperk. De voorloper van MSdos. Ik heb nooit een computer opleiding gehad en alles wat ik weet is uit boeken en tegenwoordig van het internet.
Mijn dochter gaat in 2015, vanuit scouting naar de world Jambouree in Japan. Daar gaat ze veel foto's nemen met een camera die ook GPS heeft. Ik wil nu een site maken waar ze die foto's in kan uploaden. Die site moet dan uit de EXIF data van die foto o.a. de GPS data halen. De foto wordt getoond met daarnaast een kaartje van de omgeving met een marker op de GPS plaats.
Op dit moment heb ik een deel wat de foto ophaalt, verkleind, een nieuwe naam geeft en opslaat. De nieuwe naam komt in de database met o.a. de exif data die nodig is.
Nu heeft Google een developerspage waar het deel beschreven staat hoe je database data kan koppelen aan maps. Ik heb daaruit begrepen dat ik die database niet dynamisch op google maps kan plaatsen.
Nu kwam ik ook https://developers.google.com/maps/documentation/javascript/examples/marker-simple tegen en dat is eigenlijk wat ik kan gebruiken.
En mijn struikelpunt hier is dat het script tussen <head> en </head> staat en mijn data in <body></body> staat.
''
function addMarker(positionMarker,titleMarker)
{
var positionMarker = new google.maps.Latlng(52.28958,5.39524);
var marker = new google.mapsMarker(
{
position: positionMarker,
map: map,
title: titleMarker
});
}
''
Ik zoek dus de manier om de $GPSn en $GPSe uit het <body> deel te plaatsen bij Latlng(52. etc.
Wie kan me hiermee helpen?
Toevoeging op 27/02/2015 11:31:59:
Ik merk dat de tekst tussen </body> staat en '' niet geplaatst is. Daar vraag ik hoe ik de data die ik heb kan plaatsen in het deel in <head>. Simpelweg die
De PHP-script om de variabelen $GPSEn, $GPSe op te halen, die kan je prima voor je doctype plaatsen, als deze geen output geeft. Dan kan je in het script de variabelen gewoon echo'en.
Ten tweede: de eerste regel in je functie definieert een variabele positionMarker. Maar die geef je ook al door als parameter aan de functie. Het maakt dan niet meer uit wat je in je aanroep gebruikt, want dat wordt altijd onderdrukt door die harde definitie.
Om dit werkend te krijgen hoef je niet eens zo gek veel aan je code te veranderen. Je kan de functie gewoon in je <head> laten staan, maar dan zonder de definitie van positionMarker:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
function addMarker(positionMarker,titleMarker)
{
var marker = new google.mapsMarker(
{
position: positionMarker,
map: map,
title: titleMarker
});
}
{
var marker = new google.mapsMarker(
{
position: positionMarker,
map: map,
title: titleMarker
});
}
En vervolgens kun je dan in je body iets doen als:
Code (php)
Gewijzigd op 27/02/2015 12:52:32 door Willem vp
hartelijk dank voor je reactie. Zoals ik al schreef ben ik nog steeds veel aan het leren en lukt het me niet om jouw uitleg in mijn script, werkend te krijgen. Ik heb mijn script bijgesloten omdat dit wellicht wat makkelijker te bekijken is.
Hulp in Jip en Janneke taal helpt me zeker om de juiste weg te vinden.
<html>
<head>
<style>
html, body, #map-canvas {
height: 100%;
margin: 0px;
padding: 0px
}
</style>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>
<script>
function initialize()
{
var myLatlng = new google.maps.LatLng(52.524125,4.627794)
var mapOptions =
{
zoom: 16,
center: myLatlng
}
var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
/*
var marker = new google.maps.Marker(
{
position: myLatlng,
map: map,
title: 'Hello World!'
});
*/
}
// einde initialize
// markeer foto
function addMarker(positionMarker,titleMarker)
{
var marker = new google.mapsMarker(
{
position: positionMarker,
map: map,
title: titleMarker
});
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body bgcolor=#C0C0C0 >
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
echo "<h1>Gps exifdata</h1>";
echo "<FONT COLOR='#993300' SIZE='-2'>found on: http://curiositybeyondcontrol.blogspot.nl/2012/07/convert-latitude-and-longitude-from.html<br></FONT><br><br>";
echo "<IMG SRC='images/test2.JPG' WIDTH='600' ALIGN='left'>";
$image = "images/test2.JPG";
$exif = exif_read_data($image, 0, true);
//echo "Lees de GPS data van de foto.<br>";
foreach ($exif as $key => $section)
{
foreach ($section as $name => $val)
{
if($key == "GPS")
{
if($name=="GPSLatitudeRef")
{
$GPSn=$val;
}
if($name=="GPSLongitudeRef")
{
$GPSe=$val;
}
if($name =="GPSLatitude")
{
//echo "Gevonden graden=".$val[0]." minuten=".$val[1]." seconden=".$val[2]."<br>";
$deg=(substr($val[0], 0, -2));
$min=(substr($val[1], 0, -2));
$sec=(substr($val[2], 0, -4));
$sec=round(($sec/100),2);
//echo "We halen de breuken weg graden=".$deg." minuten=".$min." seconden=".$sec."<br>";
$min=$min*60;
//echo "Van de minuten maken we seconden =".$min."<br>";
$sec=$min+$sec;
//echo "totaal minuten + seconden=".$sec."<br>";
$sec=round(($sec/3600),6);
//echo "Dat delen door 3600 wordt afgerond =".$sec."<br>";
$deg=$deg+$sec;
$GPSn = $deg;
//echo "Optellen bij de graden maakt ".$GPSn."<br><br><br>";
}else{
if($name =="GPSLongitude")
{
//echo "Gevonden graden=".$val[0]." minuten=".$val[1]." seconden=".$val[2]."<br>";
$deg=(substr($val[0], 0, -2));
$min=(substr($val[1], 0, -2));
$sec=(substr($val[2], 0, -5));
$sec=round(($sec/1000),2);
//echo "We halen de breuken weg graden=".$deg." minuten=".$min." seconden=".$sec."<br>";
//echo "Zie je dat de seconden nu door 1000 gedeeld worden en bij latitude door 100?<br>";
$min=$min*60;
//echo "Van de minuten maken we seconden =".$min."<br>";
$sec=$min+$sec;
//echo "totaal minuten + seconden=".$sec."<br>";
$sec=round(($sec/3600),6);
//echo "Dat delen door 3600 wordt afgerond =".$sec."<br>";
$deg=$deg+$sec;
$GPSe = $deg;
//echo "Optellen bij de graden maakt ".$GPSe."<br><br><br>";
}
}
}
}
}
echo "<br>".$GPSn.",".$GPSe."<br>";
$title = $foto['title'];
echo "
positionMarker = new google.maps.Latlng($GPSn,$GPSe);
titleMarker = new google.maps.WatDanOok($title);
addMarker(positionMarker, titleMarker);
";
echo "<a href='http://www.gpscoordinaten.nl/bepaal-gps-coordinaten.php?latitude=$GPSn&longitude=$GPSe&zoom=15' target='new'>hier is het dus</a>";
//echo "<div id='map-canvas'></div>";
?>
echo "<h1>Gps exifdata</h1>";
echo "<FONT COLOR='#993300' SIZE='-2'>found on: http://curiositybeyondcontrol.blogspot.nl/2012/07/convert-latitude-and-longitude-from.html<br></FONT><br><br>";
echo "<IMG SRC='images/test2.JPG' WIDTH='600' ALIGN='left'>";
$image = "images/test2.JPG";
$exif = exif_read_data($image, 0, true);
//echo "Lees de GPS data van de foto.<br>";
foreach ($exif as $key => $section)
{
foreach ($section as $name => $val)
{
if($key == "GPS")
{
if($name=="GPSLatitudeRef")
{
$GPSn=$val;
}
if($name=="GPSLongitudeRef")
{
$GPSe=$val;
}
if($name =="GPSLatitude")
{
//echo "Gevonden graden=".$val[0]." minuten=".$val[1]." seconden=".$val[2]."<br>";
$deg=(substr($val[0], 0, -2));
$min=(substr($val[1], 0, -2));
$sec=(substr($val[2], 0, -4));
$sec=round(($sec/100),2);
//echo "We halen de breuken weg graden=".$deg." minuten=".$min." seconden=".$sec."<br>";
$min=$min*60;
//echo "Van de minuten maken we seconden =".$min."<br>";
$sec=$min+$sec;
//echo "totaal minuten + seconden=".$sec."<br>";
$sec=round(($sec/3600),6);
//echo "Dat delen door 3600 wordt afgerond =".$sec."<br>";
$deg=$deg+$sec;
$GPSn = $deg;
//echo "Optellen bij de graden maakt ".$GPSn."<br><br><br>";
}else{
if($name =="GPSLongitude")
{
//echo "Gevonden graden=".$val[0]." minuten=".$val[1]." seconden=".$val[2]."<br>";
$deg=(substr($val[0], 0, -2));
$min=(substr($val[1], 0, -2));
$sec=(substr($val[2], 0, -5));
$sec=round(($sec/1000),2);
//echo "We halen de breuken weg graden=".$deg." minuten=".$min." seconden=".$sec."<br>";
//echo "Zie je dat de seconden nu door 1000 gedeeld worden en bij latitude door 100?<br>";
$min=$min*60;
//echo "Van de minuten maken we seconden =".$min."<br>";
$sec=$min+$sec;
//echo "totaal minuten + seconden=".$sec."<br>";
$sec=round(($sec/3600),6);
//echo "Dat delen door 3600 wordt afgerond =".$sec."<br>";
$deg=$deg+$sec;
$GPSe = $deg;
//echo "Optellen bij de graden maakt ".$GPSe."<br><br><br>";
}
}
}
}
}
echo "<br>".$GPSn.",".$GPSe."<br>";
$title = $foto['title'];
echo "
positionMarker = new google.maps.Latlng($GPSn,$GPSe);
titleMarker = new google.maps.WatDanOok($title);
addMarker(positionMarker, titleMarker);
";
echo "<a href='http://www.gpscoordinaten.nl/bepaal-gps-coordinaten.php?latitude=$GPSn&longitude=$GPSe&zoom=15' target='new'>hier is het dus</a>";
//echo "<div id='map-canvas'></div>";
?>
</body>
</html>
1) De code op regel 68-70 is JavaScript-code en moet dus tussen <script>-tags staan. Merk op dat die in mijn eerste post buiten de foreach-loop stonden. Voorwaarde is dan wel dat de loop geen HTML-code genereert, dus regel 65 is dan uit den boze. Maar in dit geval wordt er uberhaupt maar 1 marker gegenereerd, dus kunnen de <script>-tags ook meteen om regel 68-70 komen te staan.
2) De "WatDanOok" in regel 69 moet uiteraard nog worden vervangen door de juiste API-functie. Omdat ik zelf meestal in OpenStreetMaps zit te prutsen en niet met Google Maps weet ik echter de juiste functienaam niet uit mijn hoofd. [even later] Het blijkt dat die parameter gewoon een string is. De hele regel kan er dus uit.
3) De belangrijkste regel van het programma staat in commentaar: regel 74. Zonder die div zal er geen kaart worden getoond.
4) Op regel 66 vraag je $foto['title'] op. Echter, nergens in je code wordt $foto geset. Het kan zijn dat je dat stuk niet hebt gepost, maar als dit de volledige code is, dan krijgt $title dus geen waarde.
En dan een dingetje wat eigenlijk niet fout is, maar in mijn ogen wat inefficiënt: de exif_read_data() geeft een array terug. Die loop je vervolgens in een geneste foreach-loop af. Wanneer je iets generieks met die array-elementen wilt doen is dat de beste manier, maar je zoekt in dit geval naar een paar specifieke elementen en negeert de rest. Ik zou zelf gewoon rechtstreeks de array-elementen opvragen.
Verder heb ik een probleem met regels 32 en 51. Daar reken je een minutenwaarde om naar seconden. Vervolgens hou je dus een variabele over waarvan de naam suggereert dat er minuten in staan, maar die eigenlijk seconden bevat. Ik zou dat heel erg willen afraden, want ooit schiet je daarmee jezelf in je voet. Hetzelfde doe je ook bij de graden in regels 38 en 57. En eigenlijk doe je het ook nog op regels 36 en 55, als je de seconden omrekent naar uren.
Je HTML-body zou er dan dus als volgt uit komen te zien. Voor het overzicht heb ik de echo-regels verwijderd.
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<body>
<?php
echo "<h1>Gps exifdata</h1>";
echo "<FONT COLOR='#993300' SIZE='-2'>found on: http://curiositybeyondcontrol.blogspot.nl/2012/07/convert-latitude-and-longitude-from.html<br></FONT><br><br>";
echo "<IMG SRC='images/test2.JPG' WIDTH='600' ALIGN='left'>";
$image = "images/test2.JPG";
$exif = exif_read_data($image, 0, true);
if (isset($exif['GPS']['GPSLatitudeRef']))
{
$GPSn = $exif['GPS']['GPSLatitudeRef'];
}
elseif (isset($exif['GPS']['GPSLatitude']))
{
$val = $exif['GPS']['GPSLatitude'];
$deg = substr($val[0], 0, -2);
$min = substr($val[1], 0, -2);
$sec = substr($val[2], 0, -4);
$sec = round(($sec/100),2);
$sec = (60 * $min) + $sec;
$GPSn = $deg + round(($sec/3600),6);
}
if (isset($exif['GPS']['GPSLongitudeRef']))
{
$GPSe = $exif['GPS']['GPSLongitudeRef'];
}
elseif (isset($exif['GPS']['GPSLongitude']))
{
$val = $exif['GPS']['GPSLongitude'];
$deg = substr($val[0], 0, -2);
$min = substr($val[1], 0, -2);
$sec = substr($val[2], 0, -5);
$sec = round(($sec/1000),2);
$sec = (60 * $min) + $sec;
$GPSe = $deg + round(($sec/3600),6);
}
if (!isset($GPSn) or !isset($GPSe))
{
echo "De foto bevat geen GPS-coördinaten";
}
echo "<br>".$GPSn.",".$GPSe."<br>";
$title = $foto['title'];
echo "
<script>
positionMarker = new google.maps.Latlng($GPSn,$GPSe);
addMarker(positionMarker, $title);
</script>
";
echo "<a href='http://www.gpscoordinaten.nl/bepaal-gps-coordinaten.php?latitude=$GPSn&longitude=$GPSe&zoom=15' target='new'>hier is het dus</a>";
echo "<div id='map-canvas'></div>";
?>
</body>
<?php
echo "<h1>Gps exifdata</h1>";
echo "<FONT COLOR='#993300' SIZE='-2'>found on: http://curiositybeyondcontrol.blogspot.nl/2012/07/convert-latitude-and-longitude-from.html<br></FONT><br><br>";
echo "<IMG SRC='images/test2.JPG' WIDTH='600' ALIGN='left'>";
$image = "images/test2.JPG";
$exif = exif_read_data($image, 0, true);
if (isset($exif['GPS']['GPSLatitudeRef']))
{
$GPSn = $exif['GPS']['GPSLatitudeRef'];
}
elseif (isset($exif['GPS']['GPSLatitude']))
{
$val = $exif['GPS']['GPSLatitude'];
$deg = substr($val[0], 0, -2);
$min = substr($val[1], 0, -2);
$sec = substr($val[2], 0, -4);
$sec = round(($sec/100),2);
$sec = (60 * $min) + $sec;
$GPSn = $deg + round(($sec/3600),6);
}
if (isset($exif['GPS']['GPSLongitudeRef']))
{
$GPSe = $exif['GPS']['GPSLongitudeRef'];
}
elseif (isset($exif['GPS']['GPSLongitude']))
{
$val = $exif['GPS']['GPSLongitude'];
$deg = substr($val[0], 0, -2);
$min = substr($val[1], 0, -2);
$sec = substr($val[2], 0, -5);
$sec = round(($sec/1000),2);
$sec = (60 * $min) + $sec;
$GPSe = $deg + round(($sec/3600),6);
}
if (!isset($GPSn) or !isset($GPSe))
{
echo "De foto bevat geen GPS-coördinaten";
}
echo "<br>".$GPSn.",".$GPSe."<br>";
$title = $foto['title'];
echo "
<script>
positionMarker = new google.maps.Latlng($GPSn,$GPSe);
addMarker(positionMarker, $title);
</script>
";
echo "<a href='http://www.gpscoordinaten.nl/bepaal-gps-coordinaten.php?latitude=$GPSn&longitude=$GPSe&zoom=15' target='new'>hier is het dus</a>";
echo "<div id='map-canvas'></div>";
?>
</body>
Bedankt dat je moeite wil doen om te reageren. Ik stel dat erg op prijs. Jou opmerkingen 1 en 2 wist ik niet en bedankt voor de opmerking. Je opmerking 3 wil ik koppelen aan het deel bij 4. Ik ben aan het spelen geweest met zowel die regel als met de initialize in het deel <head></head>. Als ik het <dif> deel weg haalde had ik een kaart en als ik de function initialize() weg haalde had ik geen map. Die function initialize() is dus blijkbaar belangrijk.
Ik ben van plan om meer van die exif data te gaan gebruiken, zoals de naam, de kompasstand, datum en tijd. Die ga ik aanvullen als ik eerst de locatie maar werkend krijg.
Dat van die seconden vond ik zelf ook niet mooi maar ik heb gekozen om de eerste data naam te houden. Graden minuten en seconden tot alles klaar was. Dat de minuten inmiddels seconden als waarde hebben is in mijn ogen, minder belangrijk dan de mogelijkheid te hebben verkeerde seconden op te tellen.
Als ik jouw voorbeeld pak, (ik dacht dat er het deel tussen <head> en </head> bij moest.) Dan krijg ik geen GPSn en GPSe. Alleen een N en E zonder de GPSLatitude data.
Mocht het je nog uit komen om eens te kijken wat er fout gaat, dan graag.
Ik dacht dat jou voorbeeld dan zo zou moeten werken:
<html>
<head>
<style>
html, body, #map-canvas {
height: 100%;
margin: 0px;
padding: 0px
}
</style>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>
<script>
function initialize()
{
var myLatlng = new google.maps.LatLng(52.524125,4.627794)
var mapOptions =
{
zoom: 16,
center: myLatlng
}
var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
/*
var marker = new google.maps.Marker(
{
position: myLatlng,
map: map,
title: 'Hello World!'
});
*/
}
// einde initialize
// markeer foto
function addMarker(positionMarker,titleMarker)
{
var marker = new google.mapsMarker(
{
position: positionMarker,
map: map,
title: titleMarker
});
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body bgcolor=#C0C0C0 >
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
echo "<h1>Gps exifdata</h1>";
echo "<FONT COLOR='#993300' SIZE='-2'>found on: http://curiositybeyondcontrol.blogspot.nl/2012/07/convert-latitude-and-longitude-from.html<br>";
echo "And a lot of hulp from http://www.phphulp.nl/php/forum/topic/google-maps/97335/ in the person Willemvp.</FONT><br><br>";
echo "<IMG SRC='images/test3.JPG' WIDTH='600' ALIGN='left'>";
$image = "images/test3.JPG";
$exif = exif_read_data($image, 0, true);
if (isset($exif['GPS']['GPSLatitudeRef']))
{
$GPSn = $exif['GPS']['GPSLatitudeRef'];
}
elseif (isset($exif['GPS']['GPSLatitude']))
{
$val = $exif['GPS']['GPSLatitude'];
$deg = substr($val[0], 0, -2);
$min = substr($val[1], 0, -2);
$sec = substr($val[2], 0, -4);
$sec = round(($sec/100),2);
$sec = (60 * $min) + $sec;
$GPSn = $deg + round(($sec/3600),6);
}
echo "1".$GPSn.$deg.$min.$sec."<br>";
if (isset($exif['GPS']['GPSLongitudeRef']))
{
$GPSe = $exif['GPS']['GPSLongitudeRef'];
}
elseif (isset($exif['GPS']['GPSLongitude']))
{
$val = $exif['GPS']['GPSLongitude'];
$deg = substr($val[0], 0, -2);
$min = substr($val[1], 0, -2);
$sec = substr($val[2], 0, -5);
$sec = round(($sec/1000),2);
$sec = (60 * $min) + $sec;
$GPSe = $deg + round(($sec/3600),6);
}
echo $GPSn.",".$GPSe."<br>";
if (!isset($GPSn) or !isset($GPSe))
{
echo "De foto bevat geen GPS-coördinaten";
}
echo "<br>".$GPSn.",".$GPSe."<br>";
$title = $foto['title'];
echo "
<script>
positionMarker = new google.maps.Latlng($GPSn,$GPSe);
addMarker(positionMarker, $title);
</script>
";
echo "<a href='http://www.gpscoordinaten.nl/bepaal-gps-coordinaten.php?latitude=$GPSn&longitude=$GPSe&zoom=15' target='new'>hier is het dus</a>";
echo "<div id='map-canvas'></div>";
?>
echo "<h1>Gps exifdata</h1>";
echo "<FONT COLOR='#993300' SIZE='-2'>found on: http://curiositybeyondcontrol.blogspot.nl/2012/07/convert-latitude-and-longitude-from.html<br>";
echo "And a lot of hulp from http://www.phphulp.nl/php/forum/topic/google-maps/97335/ in the person Willemvp.</FONT><br><br>";
echo "<IMG SRC='images/test3.JPG' WIDTH='600' ALIGN='left'>";
$image = "images/test3.JPG";
$exif = exif_read_data($image, 0, true);
if (isset($exif['GPS']['GPSLatitudeRef']))
{
$GPSn = $exif['GPS']['GPSLatitudeRef'];
}
elseif (isset($exif['GPS']['GPSLatitude']))
{
$val = $exif['GPS']['GPSLatitude'];
$deg = substr($val[0], 0, -2);
$min = substr($val[1], 0, -2);
$sec = substr($val[2], 0, -4);
$sec = round(($sec/100),2);
$sec = (60 * $min) + $sec;
$GPSn = $deg + round(($sec/3600),6);
}
echo "1".$GPSn.$deg.$min.$sec."<br>";
if (isset($exif['GPS']['GPSLongitudeRef']))
{
$GPSe = $exif['GPS']['GPSLongitudeRef'];
}
elseif (isset($exif['GPS']['GPSLongitude']))
{
$val = $exif['GPS']['GPSLongitude'];
$deg = substr($val[0], 0, -2);
$min = substr($val[1], 0, -2);
$sec = substr($val[2], 0, -5);
$sec = round(($sec/1000),2);
$sec = (60 * $min) + $sec;
$GPSe = $deg + round(($sec/3600),6);
}
echo $GPSn.",".$GPSe."<br>";
if (!isset($GPSn) or !isset($GPSe))
{
echo "De foto bevat geen GPS-coördinaten";
}
echo "<br>".$GPSn.",".$GPSe."<br>";
$title = $foto['title'];
echo "
<script>
positionMarker = new google.maps.Latlng($GPSn,$GPSe);
addMarker(positionMarker, $title);
</script>
";
echo "<a href='http://www.gpscoordinaten.nl/bepaal-gps-coordinaten.php?latitude=$GPSn&longitude=$GPSe&zoom=15' target='new'>hier is het dus</a>";
echo "<div id='map-canvas'></div>";
?>
</body>
</html>
Verder klopt het dat de code uit mijn vorige post niet werkt. Het had geholpen als ik eens zelf had gekeken wat er precies in die exif-informatie staat. ;-) Wanneer je die twee elseif-commando's die ik had toegevoegd verandert in een gewone if dan werkt het al een stuk beter.
Maar nu komen we bij de kern van het probleem. Ik dacht in eerste instantie dat de exif-informatie óf een GPSLatitudeRef óf een GPSLatitude bevat en dat die dan een coördinaat in een bepaald formaat bevatte, waarbij de Ref-variant wat extra nabewerking nodig had. Dat blijkt dus niet zo te zijn.
De GPSLatitude bevat alleen maar een indicatie voor het gebruikte halfrond: N of S. De GPSLatitudeRef bevat vervolgens de bijbehorende coördinaat. (Idem voor de Longitude.) Omdat je in beide gevallen de waarde toekent aan $GPSn wordt de informatie over het halfrond overschreven door de coördinaat. Als je dochter alleen maar naar Japan gaat, is er niets aan de hand, maar gaat ze een keer naar Australië of Amerika, dan zijn de gebakken peren aan het dansen. Of zoiets. ;-) Maar dat zet ik even aan de kant, want dat probleem is het eenvoudigst op te lossen.
Een groter probleem zit in de notatie van de coördinaten: dat is een ouderwetse breuk, met teller en noemer enzo. En dat kun je inderdaad niet zomaar aan PHP voeren. Nu snap ik ook die substr-commando's. Daarmee probeerde je de teller van de breuk te krijgen. Echter, de code doet een paar aannames die niet universeel zijn. De code voor GPSLongitude gaat bijvoorbeeld uit van een input in de trant van: 5/1 21/1 48960/1000. Echter, mijn nieuwe smartphone gebruikt 5/1 21/1 4896/100 en mijn oude smartphone (zelfde merk) maakt er iets van als 5/1 2258/100 0/1. Er moet dus iets universelers komen.
Ik heb voor de gelegenheid een functie breuk_naar_decimaal() gemaakt. Die heeft als input een string met het formaat "abc/def" (waarbij abc en def getallen zijn van 1 of meer cijfers). De functie splitst de string op de /, deelt vervolgens abc door def en geeft het resultaat terug. Om de code duidelijk te houden heb ik er vrijwel geen foutafhandeling in zitten; dat mag je zelf toevoegen. ;-) In alle regels waar substr() werd gebruikt, wordt nu breuk_naar_decimaal() aangeroepen.
Vervolgens moeten we de windrichtingen (NZ en EW) nog corrigeren. Omdat het niet gaat werken om die op te slaan in $GPSn en $GPSe heb ik daar $GPSnref en $GPSeref van gemaakt (analoog aan de EXIF-tag waaraan ze zijn ontleend). Met de waardes N, Z, E en W kunnen we niets; die moeten we numeriek maken. Nu is het zo dat coördinaten op het zuidelijk en westelijk halfrond negatief zijn, dus heb ik ervoor gekozen om de waardes N en E te vertalen naar 1 en Z en W naar -1. Zodra we de graden gaan berekenen, vermenigvuldigen we dan het eindresultaat met $GPSnref of $GPSeref en we zijn klaar.
Klaar? Nou, nog niet helemaal. Ik krijg nu een mooie kaart te zien, maar nog geen marker. En dat komt door wat ik al vreesde: de initialize() wordt pas aangeroepen als de hele pagina geladen is. Dat komt door de event handler die ergens in het <head>-script staat: "google.maps.event.addDomListener(window, 'load', initialize)". De javascriptcode die we genereren om de marker te maken wordt daardoor aangeroepen vóór de kaart is geïnitialiseerd. Dat heb ik verholpen door de event handler te verwijderen en initialize() zelf aan te roepen. Dat betekent ook dat de <div> waar de kaart in wordt getoond al moet bestaan voor initialize() wordt aangeroepen.
Het resultaat kun je zien op http://phphulp.willem.guru/exif.php en de code op http://phphulp.willem.guru/exif.phps. Omdat ik nog wat zit te spelen met de code zal ik hieronder een werkende snapshot zetten.
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<html>
<head>
<style>
html, body { height: 100%; margin: 0px; padding: 0px; }
#map-canvas { height: 400px; width: 600px; }
</style>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>
<script>
var map;
function initialize()
{
var myLatlng = new google.maps.LatLng(52.524125,4.627794);
var mapOptions =
{
zoom: 4,
center: myLatlng
}
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
}
// einde initialize
// markeer foto
function addMarker(positionMarker,titleMarker)
{
var marker = new google.maps.Marker(
{
position: positionMarker,
map: map,
title: titleMarker
});
}
</script>
</head>
<body bgcolor="#C0C0C0" >
<?php
echo "<h1>GPS exifdata</h1>";
echo "<font color='#993300' size='-2'>found on: http://curiositybeyondcontrol.blogspot.nl/2012/07/convert-latitude-and-longitude-from.html<br>";
echo "And a lot of hulp from http://www.phphulp.nl/php/forum/topic/google-maps/97335/ in the person Willemvp.</font><br><br>";
$image='exif.jpg';
echo "<img src='$image' width='600'>";
$exif = exif_read_data($image, 0, true);
if (isset($exif['GPS']['GPSLatitudeRef']))
{
$GPSnref = $exif['GPS']['GPSLatitudeRef'] == 'N' ? 1 : -1;
}
if (isset($exif['GPS']['GPSLatitude']))
{
$val = $exif['GPS']['GPSLatitude'];
$deg = breuk_naar_decimaal($val[0]);
$min = breuk_naar_decimaal($val[1]);
$sec = breuk_naar_decimaal($val[2]);
$sec = (60 * $min) + $sec;
$GPSn = $GPSnref * ($deg + round(($sec/3600),6));
}
if (isset($exif['GPS']['GPSLongitudeRef']))
{
$GPSeref = $exif['GPS']['GPSLongitudeRef'] == 'E' ? 1 : -1;
}
if (isset($exif['GPS']['GPSLongitude']))
{
$val = $exif['GPS']['GPSLongitude'];
$deg = breuk_naar_decimaal($val[0]);
$min = breuk_naar_decimaal($val[1]);
$sec = breuk_naar_decimaal($val[2]);
$sec = (60 * $min) + $sec;
$GPSe = $GPSeref * ($deg + round(($sec/3600),6));
}
if (!isset($GPSn) or !isset($GPSe))
{
echo "De foto bevat geen GPS-coördinaten";
}
echo "<br>".$GPSn.",".$GPSe."<br>";
$title = "Titel van de foto";
echo "<a href='http://www.gpscoordinaten.nl/bepaal-gps-coordinaten.php?latitude=$GPSn&longitude=$GPSe&zoom=15' target='new'>hier is het dus</a>";
echo "<div id='map-canvas'></div>";
echo "
<script>
initialize();
var positionMarker = new google.maps.LatLng($GPSn,$GPSe);
addMarker(positionMarker, '$title');
</script>
";
?>
</body>
</html>
<?php
function breuk_naar_decimaal ($str)
{
$breuk = explode('/', $str);
# $breuk[0] bevat nu de teller en $breuk[1] bevat de noemer.
if (!isset($breuk[1]) or $breuk[1] == 0) return $breuk[0];
return $breuk[0] / $breuk[1];
}
?>
<head>
<style>
html, body { height: 100%; margin: 0px; padding: 0px; }
#map-canvas { height: 400px; width: 600px; }
</style>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script>
<script>
var map;
function initialize()
{
var myLatlng = new google.maps.LatLng(52.524125,4.627794);
var mapOptions =
{
zoom: 4,
center: myLatlng
}
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
}
// einde initialize
// markeer foto
function addMarker(positionMarker,titleMarker)
{
var marker = new google.maps.Marker(
{
position: positionMarker,
map: map,
title: titleMarker
});
}
</script>
</head>
<body bgcolor="#C0C0C0" >
<?php
echo "<h1>GPS exifdata</h1>";
echo "<font color='#993300' size='-2'>found on: http://curiositybeyondcontrol.blogspot.nl/2012/07/convert-latitude-and-longitude-from.html<br>";
echo "And a lot of hulp from http://www.phphulp.nl/php/forum/topic/google-maps/97335/ in the person Willemvp.</font><br><br>";
$image='exif.jpg';
echo "<img src='$image' width='600'>";
$exif = exif_read_data($image, 0, true);
if (isset($exif['GPS']['GPSLatitudeRef']))
{
$GPSnref = $exif['GPS']['GPSLatitudeRef'] == 'N' ? 1 : -1;
}
if (isset($exif['GPS']['GPSLatitude']))
{
$val = $exif['GPS']['GPSLatitude'];
$deg = breuk_naar_decimaal($val[0]);
$min = breuk_naar_decimaal($val[1]);
$sec = breuk_naar_decimaal($val[2]);
$sec = (60 * $min) + $sec;
$GPSn = $GPSnref * ($deg + round(($sec/3600),6));
}
if (isset($exif['GPS']['GPSLongitudeRef']))
{
$GPSeref = $exif['GPS']['GPSLongitudeRef'] == 'E' ? 1 : -1;
}
if (isset($exif['GPS']['GPSLongitude']))
{
$val = $exif['GPS']['GPSLongitude'];
$deg = breuk_naar_decimaal($val[0]);
$min = breuk_naar_decimaal($val[1]);
$sec = breuk_naar_decimaal($val[2]);
$sec = (60 * $min) + $sec;
$GPSe = $GPSeref * ($deg + round(($sec/3600),6));
}
if (!isset($GPSn) or !isset($GPSe))
{
echo "De foto bevat geen GPS-coördinaten";
}
echo "<br>".$GPSn.",".$GPSe."<br>";
$title = "Titel van de foto";
echo "<a href='http://www.gpscoordinaten.nl/bepaal-gps-coordinaten.php?latitude=$GPSn&longitude=$GPSe&zoom=15' target='new'>hier is het dus</a>";
echo "<div id='map-canvas'></div>";
echo "
<script>
initialize();
var positionMarker = new google.maps.LatLng($GPSn,$GPSe);
addMarker(positionMarker, '$title');
</script>
";
?>
</body>
</html>
<?php
function breuk_naar_decimaal ($str)
{
$breuk = explode('/', $str);
# $breuk[0] bevat nu de teller en $breuk[1] bevat de noemer.
if (!isset($breuk[1]) or $breuk[1] == 0) return $breuk[0];
return $breuk[0] / $breuk[1];
}
?>
Gewijzigd op 02/03/2015 01:23:49 door Willem vp
Dat van die omrekening zat me ook als dwars. Mijn foto toestel met GPS geeft een breuk naar 1000 en mijn smartfone naar 100. Maar omdat mijn dochter het foto toestel meenam ging ik er vanuit dat ik dat met die berekening, later nog wel eens kon bekijken. Een telefoon heeft geen zin, verkeerde frequentie en andere netspanning.
Met visualbasic kon ik redelijk overweg en zocht ik aantal tekens in totaal, dan aantal tekens tot / dan kijken wat er overbleef. Dat moest ik voor PHP nog opzoeken. Jij heb me nu o.a. daarmee heel veel geholpen. Ik had inderdaad die explode voorbij zien komen maar het was me nog niet gelukt. Ik bleef een foutmelding krijgen. Ik werkte meteen met explode("/",val[0]) en dat ging dus niet. En dat deel erna was ik al helemaal niet op gekomen.
Jou opmerking dat het fout gaat als de foto's ergens anders genomen zijn, had ik ook al bedacht. Momenteel wordt dat dan try and error. De kaart laten centreren op de marker positie moet lukken lijkt me.
Verder bracht je me op een idee, waarom 1 marker waarom boven aan de pagina geen kaart van Japan met de route van de genomen foto's? Volgend project dan maar weer. ;-)
Ik heb het voorbeeld script meteen gedownload en op mijn home server werkt het schitterend.
Heel erg bedankt dat je een hoop tijd heb willen steken in mijn 'uitdaging' zoals dat heet.
Toevoeging op 02/03/2015 12:19:54:
Willem vp,
Inmiddels vraag ik me af of ik de data van de GPSLatitudeRef en de GPSLongitudeRef in de berekening nodig heb.
Voorheen had ik ook al eens gebruik gemaakt van een link naar een nieuwe pagina. Hierdoor wordt Googlemap locatie ook getoond. Dan is GPSn - gpsNB en GPSe - gpsOL. Nadeel hiervan was dat ik altijd op de link moest drukken om een nieuwe pagina te openen. Ook hier heb ik mee lopen spelen, probleem werd dat de foto data ingelezen werd, een pagina gemaakt en dan om het kaartje te zien weer een andere pagina geopend moest worden. Ik post de link hier, wellicht is er iemand die het kan gebruiken.
https://maps.google.nl/maps/ms?msid=210870742336751719012.0004b825476f7e2ea0aa9&msa=0&hl=nl¢er='.$gpsNB.','.$gpsOL.'&ie=UTF8&ll='.$gpsNB.','.$gpsOL.'&spn=0.005000,0.010006&t=h&output=embed"></iframe><br /><small><a href="https://maps.google.nl/maps/ms?msid=210870742336751719012.0004b825476f7e2ea0aa9&msa=0&hl=nl&ie=UTF8&ll=51.798226,4.660714&spn=1.161662,0.478892&t=h&source=embed" style="color:#0000FF;text-align:left">HSL_zuid_2</a> weergeven op een grotere kaart</small></td>'
> had ik ook al bedacht. Momenteel wordt dat dan try and error.
Nee hoor, want dat zit al in het script verwerkt. De vermenigvuldiging met $GPSnref of $GPSeref zorgt daarvoor.
> De kaart laten centreren op de marker positie moet lukken lijkt me.
Daar zijn twee manieren voor. Omdat initialize() nu expliciet wordt aangeroepen, zou je de positionMarker-variabele daaraan kunnen meegeven; die dient dan als vervanging voor de myLatLng die in de eerste regel van initialize() wordt gedefinieerd.
De tweede manier is om nadat de kaart is aangemaakt de kaart opnieuw te centreren. In OpenStreetMap is daar de call Map.setCenter() voor. De call voor Google Maps ken ik niet uit mijn hoofd, maar dat zal ook wel zoiets zijn.
> Verder bracht je me op een idee, waarom 1 marker waarom boven aan de pagina
> geen kaart van Japan met de route van de genomen foto's?
Nou, in mijn eerste reactie was ik er zelfs al een beetje vanuit gegaan dat dat de bedoeling was. ;-) Maar goed, je moet ergens beginnen natuurlijk. Om het voor de eerste foto werkend te krijgen is vaak het moeilijkst.
> Inmiddels vraag ik me af of ik de data van de GPSLatitudeRef en de
> GPSLongitudeRef in de berekening nodig heb.
Als je alleen op het Noordelijk en Oostelijk halfrond blijft heb je die niet nodig. Wil je dat het script ook blijft werken bij het Zuidelijk of Westelijk halfrond, dan heb je die informatie nodig, want de GPSLongitude en/of GPSLatitude moeten dan negatief worden. Als je een foto hebt gemaakt in Dublin, zou die zonder die Ref-velden gepind worden in Lauwersoog of Kollumerpomp of zo. Daar is het ook wel mooi, maar toch is het anders. ;-)