Na deel 1 en deel 2 gisteren, vandaag deel 3 van de serie “Kaarten en zo” waarin ik zal uitleggen hoe ik het kml-bestand (je hebt Google Earth nodig om het resultaat te zien) genereer dat dynamisch mijn Flickr-foto’s laat zien die zich binnen het gebied bevinden dat je in Google Earth in beeld brengt.
KML en KMZ
Voor het maken van een Google Map heb je ‘gewoon’ HTML en Javascript nodig. Google Earth gebruikt KML. Daarin beschijf je (bijvoorbeeld) lijnen en ook de markers die je ziet in Google Earth.
KMZ is eigenlijk gewoon een ZIP-bestand (je kunt het herbenoemen naar iets met .zip erachter en het zal gewoon openenen in Winzip en uitgepakt kunnen worden), het gebruik ervan is handig als je bijvoorbeeld plaatjes wilt meesturen om lokaal te cachen. In een KMZ kun je ze, gecomprimeerd meesturen.
Wat ik wilde was dat afhankelijk van de plek van de aardbol die je in beeld brengt, alleen die foto’s getoond worden die ‘in beeld’ zijn.
Ik gebruik daarvoor een PHP-script dat ik als een netwerklink aan Google Earth toevoeg. Dat toevoegen kun je automatisch, maar je kunt ook een KML-betand maken waarin je niet de statische informatie opneemt, maar de netwerklink. Dat ziet er dan zo uit in mijn geval:
<?xml version=”1.0″ encoding=”UTF-8″?>
<kml xmlns=”http://earth.google.com/kml/2.1″>
<NetworkLink>
<flyToView>1</flyToView>
<name>Flickr Foto’s</name>
<open>1</open>
<visibility>1</visibility>
<Url> <href>http://www.gorissen.info/Pierre/flickr/track_point.php <refreshInterval>600</refreshInterval>
<refreshMode>onInterval</refreshMode>
<viewRefreshMode>onStop</viewRefreshMode>
<viewRefreshTime>0</viewRefreshTime>
</Url>
</NetworkLink>
</kml>
Het script /Pierre/flickr/track_point.php is waar al het zware werk gebeurt, daar wordt de KML gemaakt die de foto’s laat zien die ‘in beeld zijn’.
Waar ben ik?
Hoe weet dat script nou welk deel van de aardbol in beeld is? Dat kan doordat Google Earth die informatie meestuurt bij het opvragen van die pagina. Daardoor ken ik (het script) de coördinaten van de linkeronderhoek en de rechtonderhoek en kan zo de foto’s selecteren die getoond moeten/mogen worden.
Zoeken op coördinaten in Flickr
Helaas kan ik in Flickr niet veel met die informatie. Ik kan geen zoekopdracht via de API sturen waarin ik zeg “geef me honderd foto’s van mijn account waarvan de latitude en longitude binnen dit bereik vallen”.
Dat komt omdat die informatie ‘verstopt’ zit in de tags en/of de EXIF-metadata van de foto’s.
Het enige wat je dan kunt doen is die informatie vooraf uit Flickr halen en daar een eigen tabel mee vullen en die tabel dan gebruiken om een zoekopdracht op basis van locatie uit te voeren.
De definitie van de (vast niet optimale) tabel die ik gebruik ziet er zo uit:
CREATE TABLE `flickr_pics` (
`id` varchar(150) NOT NULL default ,
`title` varchar(255) NOT NULL default ,
`description` text NOT NULL,
`nsid` varchar(255) NOT NULL default ,
`server` int(11) NOT NULL default ‘0’,
`secret` varchar(150) NOT NULL default ,
`photo_url` varchar(255) NOT NULL default ,
`time` datetime NOT NULL default ‘0000-00-00 00:00:00’,
`date_posted` varchar(255) NOT NULL default ,
`date_taken` datetime NOT NULL default ‘0000-00-00 00:00:00’,
`date_lastupdate` varchar(255) NOT NULL default ‘0000-00-00 00:00:00’,
`latitude` float default NULL,
`longitude` float default NULL,
`altitude` float NOT NULL default ‘0’,
PRIMARY KEY (`id`,`server`,`secret`)
) TYPE=MyISAM;
Om hem te vullen heb ik een PHP-script één-voor-één de in totaal ongeveer 1200 foto’s van mij die ik van coördinaten heb voorzien laten opvragen bij Flickr (ik kan wél filteren op de tag “geotagged” die al die foto’s hebben) en de informatie daarover in bovenstaande tabel opgeslagen.
Deze tabel heeft als voordeel dat ik wél kan zoeken op de coördinaten van het zichtbaar deel aarde: $query = ‘SELECT * from flickr_pics where (latitude > ‘.$bl_lat.’ AND ‘.’ latitude < '.$tr_lat.' AND longitude > ‘.$bl_lon.’ AND ‘.’ longitude < '.$tr_lon.') limit 100;';
En de foto’s van anderen?
Zoals ik al zei: de Flickr API is traag. En om de een of andere reden levert op dit moment het door ruim 250.000 foto’s met coördinaten bladeren nog wat problemen op. Het duurt heel lang (uren) en er komen veel dubbelingen in voor (foto’s die ik al verwerkt had), dus dat staat nog even op de TODO lijst. Er zijn immers anderen die dat ook doen.
TODO
De KML die Robogeo genereert laat een aantal aardige extra’s (mappen en info) zien die ik nog in mijn bestand wil verwerken.
Ook mooi zou zijn om de kleine afbeeldingen in een KMZ mee te sturen naar de client. Ik denk dat dat sneller gaat dan nu ze een voor een opgehaald worden (maar dat weet ik niet zeker).
En natuurlijk op de TODO-lijst: optimaliseren van het script zodat ik ook de foto’s van anderen kan ophalen en kan laten zien.
Ik heb het even uitgeprobeerd, maar ik krijg de indruk dat het scrollen in de kaart niet goed werkt omdat hij ook maar begint met scrollen hij meteen begint met het ophalen van foto’s in plaats van even te wachten totdat ik uitgescrolled ben. Ik krijg ook een paar keer een foutmelding dat het ophalen van iets van jouw site mislukt is.
Hoi Michel,
Kun je nog eens proberen en kijken of het nu beter werkt? (ik denk dat je eerste de oude KML-link even moet verwijderen en dan opnieuw de link hierboven moet ophalen om er voor te zorgen dat je de wijzigingen binnen krijgt).
Het scrollen gaat nu goed. Je merkt wel dat het even duurt voordat gegevens binnen zijn. Als je scrollt naar bijv. Ierland dan zie je in eerste instantie niets (dus scroll je weer verder ) maar als je ‘m een poosje laat staan op één positie dan beginnen de beelden binnen te komen. Als je dan klikt op een van de markers dan krijg je in eerste instantie een grijs vlakje wat na een seconde of 10 verandert in de bijbehorende foto. Als je een tijdje staat op een bepaalde plek dan is er kennelijk meer binnengehaald, want dan gaat het sneller.
De vertraging voordat het binnenhalen begint moet nu verholpen zijn, maar de traagheid van het binnenhalen van de foto’s voor de icoontjes en voor de popups ligt voor zover ik kan voorzien aan Flickr. Ik moet nog eens kijken hoe anderen dat doen. Een optie is om een KMZ te maken want dan kan ik de foto’s meesturen in de ZIP. Maar dat heeft meer dataverkeer (en meer caching op mijn server) tot gevolg. Nou zal dat voor een Google Earth-gebruiker niet écht een issue zijn want bij een dun lijntje werkt Google Earth sowieso niet goed.
Ter aanvulling op mijn vorige reactie: de metaltoad link omzeilt het eerste ‘laadprobleem’ (van de icoontjes) door geen foto’s te tonen maar een bolletje (= 1 keer laden voor alles). Maar zodra je op een bolletje klikt duurt het tonen van de Flickr-foto’s net zo lang als bij mij. De afbeelding met het metaltoad logo in dezelfde popup staat er wel meteen.