15
jul

Yahoo weerkaart

Weerkaartjes op uw website

Om een weerkaartje te tonen op een website, zijn er diverse scripts op het Internet beschikbaar, al dan niet tegen betaling.

Yahoo Weather maakt gebruik van de data van Weather.com en bouwt op basis daarvan RSS feeds voor verschillende steden ter wereld. Deze RSS feeds worden gratis ter beschikking gesteld.

Op deze manier kunt u voor 1, maar ook voor meerdere steden ter wereld (b.v. voor een website over vakantiehuizen) het weer tonen. Vereiste is wel dat uw webserver PHP5 en SimpleXML ondersteunt.

Op basis van een PHP class, die ik tegenkwam op het Internet (originele code), heb ik eenvoudig script gemaakt, dat het weer in Nederlandse bewoordingen toont. Yahoo Weather is namelijk Engelstalig.

Download het benodigde zip-bestand hier. Pak het uit en upload het naar uw webserver.

Yahoo Weather werkt met locatiecodes. Ga naar http://weather.yahoo.com/. Kies een werelddeel, vervolgens een land en vervolgens een stad.
U ziet nu bovenin de addressbar van uw browser staan: http://weather.yahoo.com/stad-land/XXX/forecast.html. Op de plaats van de XXX staat de benodigde locatiecode.

Roep nu het zojuist geuploade bestand _show.yweather.php in uw browser aan, op de volgende manier:

www.uw_webserver.nl/_show.yweather.php?destination=<de juiste locatiecode>

Om het script simpel te houden, wordt het aangeroepen met een enkele locatiecode in de querystring ($_GET["destination"]). Uiteraard kunnen de locatiecodes ook uit een database gehaald worden.

Demo

Klik hier voor een demo met als locatie Amsterdam.

24
jul

Zit Yahoo Maps fout?

Omdat Google Maps hier en daar nog weleens een time-out geeft (G_GEO_SERVER_ERROR), besloot ik een afstandsberekening via Yahoo Maps te proberen.

1. API sleutel

Allereerst een API sleutel aangevraagd via https://developer.yahoo.com/wsregapp/. Dit kan alleen als je al een Yahoo account hebt, dus die moet je eventueel OOK aanvragen.

YGeopoints

Yahoo biedt 2 API’s aan: een Ajax API en een Flash AS3 API. Zie http://developer.yahoo.com/maps/. Omdat ik geen kaartje wilde tonen en zo weinig mogelijk code wil gebruiken, heb ik gekozen voor de Ajax API.

Na lang speuren en doorlezen van de Reference Manual, kwam ik erachter dat ik 2 YGeoPoints met elkaar moest vergelijken. YGeoPoints worden gedefineerd door lengte- en breedtegraden. Helaas biedt Yahoo Maps geen mogelijkheid om tekstuele strings (b.v. “Zuiddijk 415, Zaandam”) om te zetten in graden. Ik heb derhalve de juiste graden via http://developer.yahoo.com/maps/rest/V1/geocode.html

(Aangezien je met deze GeoCoding API XML terugkrijgt, is het vrij eenvoudig om via b.v. PHP en Ajax de juiste graden te achterhalen, maar dat terzijde….)

Javascript functies

Vervolgens roep je de juiste Javascript functies aan:

in de <HEAD>:

<script type=”text/javascript” src=”http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=JOUW EIGEN API SLEUTEL”></script> in de <HEAD>-tag

in de <BODY>:

<script type=”text/javascript”>
// eerste adres = Zuiddijk 415, Zaandam
// tweede adres = Dam 1, Amsterdam
// lengte- en breedtegraden opgehaald via http://developer.yahoo.com/maps/rest/V1/geocode.html
var g1 = new YGeoPoint(52.426520,4.839082);
var g2 = new YGeoPoint(52.373277,4.893598);
var d = g1.distance(g2);
alert(d.kilometers);
</script>

Resultaat

Bovenstaande berekening geeft 6,98 kilometer terug, terwijl de werkelijke afstand ongeveer 15,5 kilometer is. Gebruikt Yahoo Maps de Haversine formula, die eigenlijk niet zo geschikt is voor “echte, over-de-weg kilometerberekening” of doe ik gewoon iets fout? Opmerkingen zijn welkom, ik heb de vraag al in het Ajax API forum geplaatst, maar dat forum is helaas niet zo levendig als het lijkt….

24
jul

Google Maps plugin tinyMce

A customer of mine requested a custom Google Maps plugin for his richtext editor. Since I could not find one for the TinyMce editor he was using, I decided to create my own. To get this plugin working, you need the three things:

1. API key

To get Google Maps appearing on your webpage, you need your very own API key from Google. You can obtain one here: http://code.google.com/apis/maps/signup.html

2. Coordinates

You can query the coordinates of the place you want to show by using the form below. Just enter your location as a comma or space seperated string and press “Go!”.

You will find your coordinates between parentheses just above the form.

Why not use the locationstring as a variable in a TinyMce dialog box, you say? The main reason is that once you have inserted the Google Map into your TinyMce textarea, it does not appear when in wysisyg-mode. You first need to save (or publish) the page in order for the map to appear.

The form above saves you the time of republishing over and over again, just to get your location right.

3. Download

You can download the plugin here.

Remember: it’s a very crude first version with much room for improvement. It comes with a readme.txt, in which I have tried to explain the steps I have taken.

Originally a Google Map needs a “onLoad” function in your body-tag. Since TinyMce is mainly used in content management systems, a user cannot access the body-tag. I added some extra Javascript that avoids the body-tag from being used (not my own, I found the code somewhere on the Internet).

SourceForge

Jeroen van der Stijl has picked up this project and created a SourceForge depository. Since my code was very crude, any improvements are more than welcome. Check out https://sourceforge.net/projects/mcegooglemap/

23
jul

afstandberekening met Google Maps



Afstandsberekening wordt van oudsher gedaan met een postcode tabel. Echter, de prijzen voor een postcode tabel beginnen vanaf zo’n € 600,=. Misschien niet zo interessant voor een hobby-matige website of een klein koeriersbedrijf.

Met Google Maps kun je ook leuke dingen doen, mits er een “wegennet” beschikbaar is voor jouw omgeving. In onderstaand voorbeeld is die omgeving Nederland en Google Maps is goed voorzien wat betreft Nederlandse geodata.

1. API sleutel

Allereerst moet je een API sleutel hebben voor jouw domein. Deze kun je hier aanvragen: http://code.google.com/apis/maps/signup.html.

Vervolgens roep je in <HEAD>-tag de volgende code aan:

<script src=”http://maps.google.nl/maps?file=api&v=2&key=JOUW EIGEN API SLEUTEL” type=”text/javascript”></script> om je browser te vertellen dat we met Google Maps gaan werken.

Open daarna een nieuwe <script type=”text/javascript”>-tag om de daadwerkelijke code te schrijven.

2. Javascript functies

In de nieuwe SCRIPT-tag gaan we het GDirections-object initialiseren:

function initialize()
{
if (GBrowserIsCompatible())
{
gdir = new GDirections();
GEvent.addListener(gdir,"load", set_distance);
}
}

Omdat we GEEN routebeschrijving willen en GEEN kaartje willen tonen, roepen we GDirections aan zonder de (twee) gebruikelijke parameters.

Vervolgens voegen we een addListener-functie toe. Deze functie roept de functie set_distance aan, die straks de daadwerkelijke afstand in een DIV gaat stoppen. Omdat GDirections asynchronous werkt, moeten we dat hier al doen. Diegenen die reeds met Ajax hebben gewerkt, weten wat asynchronous requests zijn, voor meer info: http://econym.org.uk/gmap/async.htm.

Vervolgens roepen we de load-method van het aangemaakt GDirections-object aan. Deze load-methode kan voorzien worden van diverse parameters, om o.a. aan te geven of de afstand berekend moet worden voor de auto of voor de wandelaar en of de snelwegen vermeden moeten worden. Deze parameters zijn de zgn. GDirectionsOptions.

De load-methode wordt aangeroepen in een functie setDirections, die als input 3 parameters vereist: het vertrekadres, het bestemmingsadres en de lokale settings. De lokale setting is in ons geval altijd “nl”, maar voor de volledigheid heb ik deze variabele erin gelaten.

function setDirections(fromAddress, toAddress, locale)
{
gdir.load("from: " + fromAddress + " to: " + toAddress, {locale: locale, travelMode:G_TRAVEL_MODE_DRIVING,avoidHighways: false} );
}

Als laatste functie maken we de set_distance-functie, die tijdens de initialisatie van het object via de addListener wordt aangeroepen:

function set_distance()
{
document.getElementById("afstand").innerHTML = gdir.getDistance().html;
}

Sluit vervolgens de SCRIPT-tag af (</script>), we zijn klaar met de Javascript. We gaan nu de FORM maken.

3. Formulier

Roep de GDirection initialize-functie aan in de <BODY>-tag:

<body onload="initialize()" onunload="GUnload()">

Voeg daarna het onderstaande formulier toe:

<form action="#" onsubmit="setDirections(this.from.value, this.to.value, 'nl'); return false">
<table border="0">
<tbody>
<tr>
<td>van: </td>
<td><input id="fromAddress" name="from" size="40" type="text" value="zuiddijk 415, zaandam" /></td>
<td>naar: </td>
<td><input id="toAddress" name="to" size="40" type="text" value="dam 1, amsterdam" /></td>
<td><input name="submit" type="submit" value="Bereken afstand!" tabindex="1" /></td>
</tr>
</tbody></table>
</form>

Ik heb in het voorbeeld standaard waardes ingevuld voor het vertrek- en het bestemmingsadres. Dat is natuurlijk niet verplicht.

Wel raad ik aan om via Javascript te controleren of de gebruiker echt iets (zinnigs!) invult in deze twee velden. De GDirections-functie van Google Maps accepteert strings, d.w.z. alleen de postcode invullen werkt, maar ook de combinatie adres, postcode, plaatsnaam.

Als de adres-velden zijn ingevuld, stuurt de submit-button deze twee waardes naar de setDirections-functie, die vervolgens een request naar de Google servers doet en output terugstuurt. Uit deze output, kun je via de getDistance-methode de daadwerkelijke afstand filteren.

Deze afstand wordt via de set_distance-functie onderaan het formulier geplaatst in de DIV met het id “afstand”.

Let op: de afstand die wordt teruggegeven is een string. Behalve het kilometer-aantal staat er ook een spatie en het woordje “km” in. Als je deze afstand wilt gebruiken om transportkosten te berekenen, kun je misschien beter gdir.getDistance().meters in plaats van gdir.getDistance().html gebruiken.

Google neemt geen verantwoordelijkheid voor de nauwkeurigheid van de route. Ik heb resultaten vergeleken met andere online routeplanners zoals b.v. routenet.nl.

Hieruit blijkt dat Google Maps standaard de SNELSTE route neemt, dus niet altijd de KORTSTE, met andere woorden: er wordt zo snel mogelijk een snelweg gezocht.

Je kunt goochelen met de avoidHighways-parameter, maar dat levert ook niet altijd de gewenste resultaten op…

4. Voorbeeld

van: 
naar: 

5. Download

Bovenstaande voorbeeld is heel basic. Je moet er zelf toevoegingen aan doen, om het passend te krijgen voor jouw kilometerstand-, vervoersbedrijf- of wandelroute-applicatie. Je kunt hier een HTML bestand downloaden, waarin het voorbeeld is toegepast.