Category Archives: Nerdeprat

Vidreutvikling av Kartverket-GPX-kartklienten (nå med bilder)

I rekken av vidreutviklinger og jobbing med Kartverkets bakgrunnskart (WMS) og OpenLayers biblioteket kommer nå neste episode. Denne gangen med støtte for geotaggede bilder.

Biblioteket som slippes i dag er såklart også lisensiert under en MIT-lisens, og gjør omtrent følgende:

Basert på en katalog med geotaggede bilder på webserveren plasserer den thumbnails av disse på kartet, og åpner en større versjon av dette bildet (via lightbox-aktig funksjonalitet). Dette kan såklart kombineres med GPX-funkjsonaliteten jeg tidligere har vist.

Dermed: en demo på funksjonaliteten finnes på http://kart.atlefren.net/sk_map/ (takk til Magnus Stoveland for bildene her, regner med at det er greit at jeg bruker dem?;)).

Så litt om funksjonaliteten: For å håndtere geotaggede bilder har jeg måttet ta i bruk litt PHP. Kort fortalt er dette en liten modifikasjon på koden fra masteroppgaven min, PHP-scriptet leser ut GPS-informasjon fra bilders EXIF-informasjon og bygger en GeoJSON-streng som så requestes fra OpenLayers scriptet ImageLoader.js. ImageLoader.js tar seg av å transformere koordinatene i GeoJSON stringen til UTM 33N, slik at de kan vises på kartet. I tillegg har jeg implementert LightLightbox.js, en enkel versjon av Lightbox-funksjonaliteten.

For å vise thumbnails av bildene (og store, men ikke fullsize bilder) brukes funksjonaliteten i PHP-klassen Resize_Image, hentet fra http://www.bitrepository.com/resize-an-image-keeping-its-aspect-ratio-using-php-and-gd.html.

Og, kildekoden finner du som en zip-fil på code.atlefren.net/source/sk_map.zip, den skal være å bare pakke ut på egen webserver og ta i bruk. Det eneste kravet er at du har noen GPX filer og/eller geotaggede bilder. Har du GPX-filer, men ikke geotaggede bilder kan du teste f.eks Prune, som jeg ble positivt overrasket over (kjører på alle platformer).

Husk bare et par ting: siden både GPX-filer og bildene er vektorer i kartet kan det bli vel mye for en stakkars JavaScript motor om du kjører på med for mange bilder og/eller GPX-filer (les mer i OpenLayers sin FAQ).

I tillegg er det et par kjente bugs/shortcomings her:

  • Når bildelaget er aktivt kan du ikke klikke på GPX-filene for å få en popup
  • PHP-classen for å håndtere bilderesizing gjør alt on-the-fly, dette kan føre til ytelsesproblemer ved mye bruk
  • LightLightbox.js-koden er, for å si det mildt, elendig utseendemessig.
  • Det finnes ingen load-indikatorer på bilder etc

Dog, all den tid jeg har frigjort koden er det bare å ta tak i dette, jeg er ikke noen ekspert på hverken PHP eller CSS, men det burde være greit å endre på slikt. Ellers skal koden være “greit nok” dokumentert, finner du at den ikke er det så si fra!

Og, jeg tar gjerne imot innspill til forbedringer!

GPX med Kartverkets bakgrunnskart, del 2

Jeg skrev for en stund siden litt om hvordan man kan kombinere GPX-filer med de åpne WMS-servicene til kartverket. Igrunn bare en enkel proof-of-concept, men det virker som folk fant det nyttig.

Dermed har jeg rydda litt i koden, lagt til muligheten for fargekoding, “klikk-for-info” og lengdeberegning. Jeg har også flyttet all koden ut i en separat JS-klasse, og satt en åpen lisens på denne (MIT for den som lurer).

Du finner et eksempel på http://kart.atlefren.net/gpx2/, som forøvrig viser en fin tur i Sylane, anbefales!

Trykk “view source” for å få med deg oppsettet. Det viktigste er dog å huske å inkludere GpxReader.js. OBS: jeg setter pris på om du IKKE hotlinker til denne, men laster ned og legger på egen server.

Ellers er “magien” for å legge til GPX-filer enkel: et array [] med et objekt {} pr GPX-fil, som inneholder følgende:

  • file: filsti til GPX-fil (husk Same origin policy)
  • color: hex-representasjon for farge
  • width: tykkelse på linje i pixler
  • title: Tittel på track, dukker opp i popup
  • desc: beskrivelse av track, dukker opp i popup

Se ellers hvordan jeg har satt opp ting i eksempelet. Og, spør gjerne om det er noe, og vis meg gjerne hva du bruker koden til, også om du endrer den!

Javascript, GIS, testing, Maven, AJAX og andre småtricks

Jeg jobber, som kjent, endel med kartapplikasjoner på nett. I denne situasjonen har du et par valg. Google Maps APIet eller OpenLayers. Vil du ha full kontroll velger du OpenLayers. Kort og godt.

Dog, uansett om du havner på Google Maps eller OpenLayers (ja, det finnes vel også noe fra ESRI) for å lage kartapplikasjoner som skal kjøre i nettleseren trenger du å forholde deg til Javascript. Mye kan sies om Javascript, og mye av det er feil. Likevel: det er et språk som er misbrukt mer enn PHP. Derfor: skal du gjøre noe fornuftig med Javascript anbefaler jeg deg å se Douglas Crockfords videoforelesning “programming in javascript“. Og også eventuelt lese boka hans “JavaScript: the good parts“. Og kanskje også Stoyan Stefanovs bok: “Object-Oriented JavaScript“.

Dog, det var ikke det denne posten skulle handle om. Jeg tenkte å være enda litt mer spesifikk. Jeg tenkte å skrive litt om hvordan Javascript-utvikling kan integreres i utviklingen av en Java webapp.

Det er mange steder og angripe problemet fra, men vi kan starte med Maven, som jeg er fristet til å si at er et must for javautvikling. Det finnes flere plugins for å håndtere Javascript i Maven. Jeg liker godt maven-javascript-plugin. Jeg tror ikke den vedlikeholdes så godt, men det som finnes fungerer og fyller følgende oppgaver:

  • Pakke javascript-biblioteker som “dependencies”
  • Komprimering og konkatinering av javascript-filer

I tillegg kan det kjøre tester, men der foretrekker jeg et annet bibliotek: nemlig Jasmine. Jasmine er et rammeverk for drive skrive Behaviour Driven Development av Javascript, i teorien betyr det at du kan skrive unit-tester for javascript. Legg til jasmine-maven-plugin og du får støtte for å kjøre testene via Maven. Javascript kan dermed testes like lett som Java-kode.

Når det gjelder AJAX (eller AJAJ som jeg liker å kalle det), synes jeg DWR (Direct Web Remoting) er brilliant. Lag en Java-klasse, eksponer metoder og kall dem direkte fra Javascriptet ditt. Enklere blir det ikke, dropp å tenke på XMLHttpRequest-oppsett og ståk. Når vi først snakker om å gjøre ting på server-siden må jo også GeoTools nevnes. GeoTools er rammeverket GeoServer baserer seg på, og er kort og godt et GIS-rammeverk for Java. Lese shapefiler, koble seg til romlige databaser som PostGIS og Oracle Spatial, gjør GIS-operasjoner som bufferanalyser og transformer koordinater. Litt dårlig dokumentert, men klarer det meste.

Hva så med Javascript-rammeverk? Det finnes jo flust av dem. Prototype, jQuery, ext, etc etc. Vel, så langt har jeg funnet ut at OpenLayers gir meg støtte for mye av det jeg trenger, og har dermed ikke begynnt å se så mye på Javascript-rammeverk enda. Jeg vet det sikkert finnes endel smarte rammeverk som kan gjøre ting enklere her også.

Til slutt tenkte jeg å nevne log4javascript, som virker som et meget ålreit loggeverktøy for javascript, det mest spennende er kanskje å sende logg til serversiden via AJAX. Hvis du ikke trenger dette vil jeg påstå at Firebug gjør jobben den også. Kombinert med “web developer plugin” gjør den FireFox til den eneste fornuftige browseren å utvikle javascript i (så er det en annen sak at det skal fungere i andre nettlesere også).

Håper denne listen med ressurser kan være til hjelp for noen. Ikke nøl med å kommentere om du ønsker utdyping på noen områder, har spørsmål eller kommentarer. Og, har du flere ressurser å dele så tar jeg gjerne imot dem med takk. Jeg har på ingen måte fasiten, så jeg håper at jeg med denne posten når ut til noen som driver med noe av det samme som meg. Jeg tror ikke vi er så veldig mange?

Twitter-funksjonalitet jeg savner

Ja, jeg veit det er litt sært å rante om sosiale medier på bloggen min den ene dagen, for så to dager etter bruke nettopp bloggen og twitter til å få hjelp med et spørsmål som omhandler nettopp twitter. Dog, jeg er ikke konsistent av meg, og jeg undrer altså på om noe slikt som dette finnes.

Dette er delvis et spørsmål, delvis et rop om hjelp, og delvis bare en ide. Svar på den måten du finner formålstjenelig, det beste hadde jo vært om noen hadde en løsning til meg, eller om noen etter å ha lest dette lager en løsning for meg. Hvis ikke du kan noen av delene kan det jo være du kjenner noen som kan kjenne til problemstillingen eller sitter inne med kompetanse og ressursser til å realisere den? Jeg har nemlig ganske stor tro på dette. Så, nok om det, til saken.

Jeg begynner etterhvert å følge ganske mange på Twitter (jeg synes ihvertfall det er en del). Mange av de jeg følger er som meg, de klarer ikke å holde seg til et tema (som jo er en god ting, men det et annet innlegg). I tillegg bruker jeg både Seesmic på telefonen og DestroyTwitter på pcen for å følge med. Dette har fått meg til å innse en mangel med Twitter (eller i det minste de klientene jeg bruker): nemlig mangelen på muligheten til å gruppere tweets.

La meg illustrere: jeg følger, naturlig nok, mange gis/geomatikk-mennesker. Disse kommer med mange intressante inspill og linker som jeg kunne tenkt meg å ta vare på, og eventuelt bruke som grunnlag for å publisere en slags “gis-høydepunkter for siste måned”-post på Terra Incognita. Jeg følger også mange bloggere, som linker til mange interessante bloggposter jeg skulle ha lest (men ikke nå..). Eller, jeg ser en tweet her og der som kan komme godt med i arbeidssituasjonen en gang. Og mange av de intressante tweetene (har vi et norsk ord for dette?) er retweets.

Mangelen er altså en måte å tagge eller gruppere tweets på. Du vil nå kanskje si at dette har vi jo hashtagger til. Eller lister. Men: nei. Ikke alle gis/geomatikk-tweets er tagget med #geomatikk (og jeg orker ikke retweete alle med #geomatikk-taggen). De færreste tweetene har hashtaggen #dennekanatlefåbrukforijobbsammenheng. Derfor er ikke hashtagger løsningen.

Hva så med lister? Der kommer det jeg tidligere nevnte med at folk twitrer om så mye forskjellig. Jeg twitrer for eksempel innimellom noe geomatikk-relatert, men legger du meg inn i en geomatikk-liste får du alle rantene mine om dumme politikere og kulda i Trondheim i tillegg. Det kan jo være du finner spennende (jeg liker ihvertfall slik “uventet” info også), men når du leter etter geomatikk-stoff i twitter-feeden din er dette støy.

Men, kan jeg ikke bare bookmarke de tweetene jeg finner interessante? Nei, jeg bruker jo nesten ikke web-interfacet til Twitter. Dessuten må jeg da bruke nettlererens bokmerkesystem for å lage orden. Det er også en dårlig løsning.

Det jeg ønsker meg er noe slikt som dette: Når jeg i f.eks DestroyTwitter ser en tweet jeg tenker at “denne kan være grei å huske på” kan jeg høyreklikke på den og velge “group as” eller “save to category” eller noe slikt smart. Da sendes denne tweeten til en separat timeline hos meg, som kan hete f.eks “tingatlesyneserverdtåsepåijobbsammenheng”, eller “geomatikkrelatert” eller “intressantebloggposter”. Henger du med? Når jeg så senere vil finne ting i en gitt kategori kan jeg browse denne timelinen, og slippe unna alt som i den sammenhengen er støy.

Do I make myself clear? Hvis ikke, skrik ut, så utdyper jeg gjerne!

Men, jeg kan egentlig ikke forstå at jeg skal være den første som kommer på dette (det er jo så smart at noen andre må ha tenkt på det). Så derfor håper og tror jeg at det finnes en twitter-klient der ute som lar meg gjøre dette? Og som i tillegg kjører på Linux (Adobe Air f.ex?). Noen som kjenner til noe slikt? Eller noen som lager eller kjenner noen som lager twitter-klienter? Tips i vei!

Og til slutt: er det bare jeg som savner noe slikt som dette, eller er det flere? Eller kan jeg løse “problemet” mitt på andre måter? Isåfall setter jeg stor pris på om du forteller meg hvordan du håndterer denne problemstillingen!

På forhånd takk!

Amplicate: Den kollektive intelligensen?

Helt tilfeldig snubla jeg over nettsiden amplicate.com her om dagen.

Siden sier om seg selv:

Making Your Opinion Count
Amplicate collects similar opinions in one place; making them more likely to be found by people and companies.

Poenget er altså å samle folks meninger om “ting” på ett sted. Hvis du elsker eller hater noe kan du fortelle verden det her. Så beregnes det en Love/Hate score. En slags HotOrNot for nær sagt alle ting altså.

Men, dette er jo ikke så artig. Det som er artig er at siden bruker to store kilder til den kollektive intelligensen: Twitter og Facebook. Ikke vet jeg hvordan de gjør det, men hvis du søker på emner som Flexus, NTNU, Norge eller Linux (et tilfeldig utvalg) så ser du at den plukker opp meldinger fra disse tjenestene.

Dog: den er ikke kjempesmart, ser vi på det ene “Love”-innslaget på Flexus vil vel de fleste tenke: “IRONI” her?

Men, kult konsept. Spørsmålet er jo hvordan dette kunne blitt forbedret, om det har noen faktiske bruksområder, eller om noe du er opptatt av (positivt eller negativt) mangler her?