Dynamisk gmap

Events happening in the community are now at Drupal community events on www.drupal.org.
Pantze's picture

Gmap
Hej!
Jag håller på att snickra på en tjänst som baserar sig på gmap. Jag vill möjliggöra interaktion med användaren utöver det som gmap i sig tillhandahåller. Detta har jag gjort för att testa min funktionalitet:

Kodat i body-fältet med .php-filter:
Först skapar jag en lämplig map array ($map_array) och skriver ut kartan:

print theme('gmap', array('#settings' => $map_array));

Sedan skriver jag ut (mha php) javascript som skapar nya kml-overlays till min karta.
<script type="text/javascript">var overlay1 = new GGeoXml("<url to my kml>/mykml.kml");</script>

Samt checkboxar för att slå av/på overlays

<input type='checkbox' id='overlay1' value='overlay1' onClick='toggle(overlay1)'>Toggle overlay 1

Funktionen toggle tar bort/lägger till givet overlay.
Detta fungerar fint.

Nu till min fråga:
Jag vill göra en modul som står för denna funktionalitet, men har inte riktitgt bestämt hur det BÖR göras. Min nuvarande tanke är att låta modulen skapa en ny kontent-type med denna kod förinsatt i body-fältet och icke ändringsbar. Kan man göra det? Eller tänker jag fel någonstans? Bör man göra en egen template-fil för denna content-typ som följer med modulen? I så fall, var ska man lägga den för att Drupal skall använda den alltid för given content-typ? Jag vill ju att den skall ligga i modulen och inte i nåt tema.

Tacksam för svar, åsikter, tankar!

Mvh Anton

Comments

Innan du börjar gräva

dixon_'s picture

Innan du börjar gräva djupare i ämnet tycker jag att du ska titta närmare på de Google Maps lösningar som finns färdiga idag. Och se om de kan passa dina behov.

Det första alternativet är modulen Gmap som kräver Location. Denna kombination ger din bra möjligheter att ange koordinater på de nodtyper du väljer att ange som "lokaliseringsbara". Hur du kan visa kartorna kan däremot (i vissa fall) vara lite begränsat.

En annan lösning som du också kan titta på är en modul som jag precis blivit co-maintainer av. Modulen heter Mapstraction. Det är en modul som låter dig definiera egna CCK-fält för både longitud och latitud. Du kan dessutom definera flervalsfält för en egen ikon (något som är lite svårare med Gmap-modulen). Men det fina med Mapstraction är att den integrerar riktigt bra med Views. Vad det betyder är att varje karta är en egen vy av noder (markers på kartan) vilket ger dig väldigt stora friheter i hur du kan presentera allt (som noder, block eller whatever). Du kan till och med ange exakt vilka fält som ska synas (och hur de ska synas) i själva infobubblan. Som grädde på moset så kan du dessutom byta till vilken kart-leverantör du vill eftersom Mapstraction-modulen bygger på javascript-klassen med samma namn -- Mapstraction. Du kan alltså välja mellan Google Maps, Yahoo Maps eller varför inte i form av en jordglob (http://globe.poly9.com/)?

Kort sammanfattning: Kolla färdiga lösningar först och se om dom passar. Passar dom inte, se om du kan ändra dina krav efter någon av modulerna.

--

It's all about simplicity - Senzilla

Även gmap har stöd för

zoo33's picture

Även gmap har stöd för att visa views som kartor, men det låter ju som att mapstraction-modulen tar det ett par steg längre. Coolt!

Med Mitt Mått blev vi tvugna att göra en egen lösning eftersom vi behövde större möjligheter att styra hur kartan och prickarna laddas och presenteras. (Inte minst blir det för tungt att ladda alla prickars nodinnehåll på en gång när det rör sig om många prickar/noder.) Vi använder Gmap-modulen, men i slutändan blev det bara för saker som att ställa in API-nyckeln.

För att gå tillbaka till Antons fråga så är jag tveksam till om kartan verkligen behöver vara en nod, om det inte är så att du vill kunna lägga till ett godtyckligt antal kartor som på något sätt skiljer sig åt. (Och istället för ett låst bodyfält kan man låta modulen lägga in en karta varje gång en nod av en viss typ visas.) Men berätta gärna mer om hur du tänkt.

/ Hannes Lilljequist – SthlmConnection

Angående "låst" bodyfält

Pantze's picture

För att lösa att kartan laddas varje gång man visar en given nod-typ hade jag en ide:

Vid skapande av noden av denna nodtyp sätts body-fältet till [gmap] per default, samt slår på gmap-macron för detta fält (eventuellt bör man göra nån automagisk inställning av kart-id också)

På så sätt visas alltid default-kartan från gmap-inställningen, men skaparen av kartan har fullständig möjlighet att ändra detta efter behov. Alternativet kan ju vara cck-fält för att skapa förinställningen av varje nod innehållande kartan, men det vore smutt att slippa det.

Tack för svaren! Men...

Pantze's picture

Tack för svaren!

Jag har kollat in de lösningar som finns och de fungerar fint. Både Gmap + location och Mapstraction.

Problemet är att de inte (vad jag fattar) ger så mycket dynamik när det kommer till att användaren skall kunna slå av/på vilka typer av noder man vill ska visas på sin karta. Dessutom behöver jag kunna visa många olika fält dynamiskt på min karta. I dagsläget (i min lösning) finns dessa representerade som kml-filer skapade av användarna i ett externt verktyg de är vana att använda.

Dessa kml-filer laddas upp av användarna och skall bli på/avslagbara när man tittar på kartan. Där har jag inte kunnat hitta möjligheter att göra detta utan att slänga på egna javascript som sköter detta.

Har fått till en modul som lägger till detta till kartan när den visas, det gör jobbet men det känns so so ändå.

Jag kämpar vidare, men tar fortfarande gladerligen emot tips och råd

mvh Anton

Spontant tycker jag det

zoo33's picture

Spontant tycker jag det låter som att man skulle kunna skapa en innehållstyp med ett filefield där användarna laddar upp KML-filerna, och sen skapa en modul som inkluderar kartan och din JS-kod varje gång en sån nod visas (se också min kommentar ovan).

/ Hannes Lilljequist – SthlmConnection

Jo

Pantze's picture

Det är så jag löst det. Kanske inte är så dumt ändå.

Som zoo3 säger

dixon_'s picture

Som zoo3 säger så är det en möjlig lösning.

Men som jag också sa, så har Mapstraction full Views-integration. Och all på/av-slagning kan ske med exponerade Views-filter, precis som i vilken annan vy! Du väljer själv vilken lösning som passar bäst. Men se till att prova dom befintliga lösningarna ordentligt innan du börjar med egen kod.

--

It's all about simplicity - Senzilla

Hmm

Pantze's picture

Jo, det låter lovande. Undrar dock hur det är med shapes. Polygoner osv. Kan man visa dessa och köra på/avslagning med exponerade filter med Mapstraction och Views?

Som zoo3 säger så har ju även gmap integration mot views. Skiljer det något mellan dessa integrationer egentligen? Något jag upptäckt med gmap är att views inte vill visa någon karta om ingen nod passerar filtret, vilket ställer till problem när jag vill visa mina .kml - fält i min vy.

/A

Och....

Pantze's picture

...jag testade mapstraction först....gillar SKARPT att man så enkelt kan byta kartleverantör. Dock så använder vår lösning fler delar av google-maps api, vilket gör att vi kört fast lite i gmap.

/A

Min lösning så långt - med problem

Pantze's picture

Hej igen!

Tack för alla tips och åsikter! Så här ser lösningen ut så långt:

  • Jag använder gmap / views för att skapa kartor. Detta ger mig den funktionalitet som redan existerar i gmap
  • Min modul lägger till denna gmap - view vid visandet av en speciell nodtyp
  • Min modul lägger dessutom till mina javascript för att sköta laddning av kml-filer till denna Nod-typ. Dessa kmler är laddade som cck-fält i en annan kontent-typ

Problemet:
För att kunna använda filtren i min vy använder när den inkluderas i en annan nod använder jag AJAX i vyn. Detta ger mig mina filter som jag behöver. Dock laddas inte kartan om vid uppdatering ("Javascript is required to view this map."). De javascript som gmap behöver för att visas laddas alltså inte om. Någon som har en lösning?

Har mapstraction löst detta med filter och AJAX i sin Vy-integration, _dixon?
Någon som löst detta problem och använt gmap?

mvh Anton

Sweden

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week