WHELP! geeft advies over ontwerp, bouw en zoekmachine optimalisatie van je website. Ben je hier voor de eerste keer? Start dan bij het 4-stappenplan voor een eigen website.

Google Maps – verschillende iconen voor markers (17)

Een aantal van jullie heeft me gevraagd of het mogelijk is om verschillende iconen te gebruiken voor je markers. Dit kan! In deze tutorial leg ik je uit hoe je dit kan meegeven in je xml bestand.

Voorkennis
Ik ga ervan uit dat je op de hoogte bent van voorgaande tutorials over Google Maps.

Hoe gaan we verschillende iconen op de kaart zetten?
Wat we doen is dat we het aanmaken van een icoon gaan onderbrengen in een nieuwe functie: getIcon(). Deze functie gaan we voorzien van de afbeelding die we willen gebruiken. De naam van de afbeelding gaan we opnemen in het xml bestand dat de data bevat van een marker.
Het eindresultaat zal er zo uit gaan zien:

1) Iconen aanmaken
Eerst maken we twee nieuwe iconen aan. Ik heb er een van Anne Frank en een van Berlage gemaakt. Ik zorg ervoor dat ze allebei even groot zijn: 23 x 24 pixels. Je kunt voor een groter formaat kiezen, maar let er dan wel op dat je de juiste maten opneemt in je script.

2) Data.xml aanpassen
Het data.xml bestand passen we hierna zo aan dat elke marker een extra gegeven meekrijgt over de afbeelding die we willen gebruiken, het attribuut 'iconimg'. De naam voor dit attribuut kan je overigens helemaal zelf bedenken.

<?xml version="1.0" encoding="utf-8"?>
<markers>
    <marker address="Prinsengracht 267, Amsterdam" label="Anne Frank Huis" iconimg="annefrank.png">
        <infowindow><![CDATA[<b>Anne Frank Huis</b><br/>Lees meer over <a href="http://www.annefrankhuis.nl" target="new">Anne Frank</a>]]></infowindow>
    </marker>
    <marker address="Damrak 277, Amsterdam" label="Beurs van Berlage" img="berlage.png">
        <infowindow><![CDATA[<b>Beurs van Berlage</b><br/>De Beurs van Berlage is vernoemd naar de architect Berlage.]]></infowindow>
    </marker>
</markers>

3) Een nieuwe functie maken om een icon te maken
In het vorige maps.js bestand hadden we een paar regels waarin het icoon werd geregeld:

// create marker icon
var icon = new GIcon();
icon.image = "http://www.whelp.nl/googlemaps/images/whelp_small.png";
icon.iconSize = new GSize(24, 23);
icon.iconAnchor = new GPoint(0, 20);
icon.infoWindowAnchor = new GPoint(5, 1);

Deze regels halen we weg. In plaats daarvan zet ik onderaan het bestand een nieuwe functie:

// create marker icon
function getIcon(iconimg){
        icon = new GIcon();
        icon.image = "http://www.whelp.nl/googlemaps/images/"+iconimg;
        icon.iconSize = new GSize(24, 23);
        icon.iconAnchor = new GPoint(0, 20);
        icon.infoWindowAnchor = new GPoint(5, 1);
        return icon;
}

Zoals je kunt zien lijkt dit erg op elkaar, met maar twee verschillen: a) we geven via een variabele door wat het plaatje wordt (iconimg) en b) we sluiten af met 'return icon'. Hiermee geef je dat wat je hebt opgebouwd terug aan de plek waar je de functie aanroept.

4) De functie getIcon() aanroepen
In de loop over de markers vervangen we het volgende:

//loop over the markers array
for (var i = 0; i < markers.length; i++) {
        var address = markers[i].getAttribute("address");
        var html = GXml.value(markers[i].getElementsByTagName("infowindow")[0]);
        var label = markers[i].getAttribute("label");
        showAddress(map,geocoder,address,html,label,icon);
} //close for loop

door

//loop over the markers array
for (var i = 0; i < markers.length; i++) {
        var address = markers[i].getAttribute("address");
        var html = GXml.value(markers[i].getElementsByTagName("infowindow")[0]);
        var label = markers[i].getAttribute("label");
        icon = getIcon(markers[i].getAttribute("iconimg"));
        showAddress(map,geocoder,address,html,label,icon);
} //close for loop

We voegen dus een regel toe waarin de functie getIcon() wordt aangeroepen en de waarde die in het attribuut iconimg staat wordt doorgegeven. Dat is alles.

Het eindresultaat
Zie de Google Map met verschillende iconen.

Tip
Werk je met verschillende categorieën? Overweeg dan gebruik te maken van een switch op de categorie. Stel je wilt op basis van het aantal sterren van een hotel verschillende iconen laten zien, dan kan het volgende doen:

// create marker icon
function getIcon(sterren){
        icon = new GIcon();
        switch (sterren) {
                case "1":
                        iconimg = "icon_01";
                        break;
                case "2":
                        iconimg = "icon_02";
                        break;
                case "3":
                        iconimg = "icon_03";
                        break;
                case "4":
                        iconimg = "icon_04";
                        break;
                case "5":
                        iconimg = "icon_04";
                        break;
                default:
                        iconimg = "icon_03";
                        break;
        }
        icon.image = "http://www.test.nl/images/ster_"+iconimg+".png"
        icon.iconSize = new GSize(35, 35);
        icon.iconAnchor = new GPoint(0, 20);
        icon.infoWindowAnchor = new GPoint(5, 1);
        return icon;
}

Met dank aan
Nourdeen Wildeman, die als eerste deze vraag stelde. Zie voor het resultaat http://www.moskeewijzer.nl.

Stem / Bookmark [?]Plaatsen/stemmen op NUjijPlaatsen/stemmen op eKudosPlaatsen/stemmen op MSN ReporterPlaatsen/stemmen op DiggVoeg dit artikel toe aan Del.icio.usVoeg toe aan je favorieten op TechnoratiVoeg toe aan je Google bladwijzers

  1. Arjan
    18.12.08 - 13:05
    1

    De interface van Google Maps is veranderd, zie de kaart op maps.google.com. Kunnen we die nieuwe interface ook combineren met jouw code, bijv. door het versienummer van de api aan te passen? Of zijn er ingewikkeldere wijzigingen nodig?

    Arjan


  2. Theo Bakker
    21.12.08 - 15:18
    2

    Dag Arjan,

    dank voor je tip. Het is allemaal erg in beweging. Ik ben daarom begonnen met een nieuwe serie. Daarin zal ik tezijnertijd op je vraag terugkomen (het is nl wat complexer dan het op het eerste oog lijkt).

    Groet, Theo


  3. Arie
    26.11.09 - 14:59
    3

    Hallo Theo, Bedankt voor deze extra pagina.
    Heb volgens mij alles goed verwerkt, maar op mijn map komen toch gewoon de rode markers.

    Enig idee wat ik fout doe?
    (jammer dat ik mijn maps.js niet kan meesturen)

    Groet,
    Arie


  4. Arie
    06.12.09 - 15:14
    4

    Hallo Theo,

    Het is me gelukt hoor verschillende markers!
    Waar ik nu tegen aan loop is dat als mijn lijst in data.xml langer is dan 10 adressen hij errors geeft dat hij het adres niet kan vinden. Enig idee hoe ik dit kan oplossen?

    Groeten,
    Arie

Jouw reactie

Spelregels voor commentaar

XHTML: Je kunt de volgende HTML code gebruiken: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Domeinnaam vrij?

  • Test via Byte op .nl, .eu, .be, .com, .net, .org, .biz, .info, .de, .co.uk, .tv, .nu, .cn en .name