HTML5 geolocation demo

HTML5 Geolocation demo

Resultatet av lek med Geolocation ble en sak som finner nærmeste norske flyplasser, og TAF (Terminal aerodrome forecast) for disse, utfra hvor brukeren befinner seg. Flyplasser som det ikke utgis TAF for er ikke tatt med. Selve utregninga av avstanden mellom punktene er gjort med "Haversine formula" i XSLT.

Geolocation støttes av Firefox 3.5 og nyere, og iPhone, men om nettleseren din ikke støtter det blir Oslo valgt som "default" posisjon.

Gå til Geolocation demo'en og finn nærmeste flyplasser med værtjeneste. Dette bør være snadder for andre flynerder :)

Hvordan regner en ut distansene i XSLT?

På ca samme måte som i javascript om en gjør beregninga selv. Brukerens posisjon hentes vha geolocation hvorpå lengde- og breddegrad hektes på som querystring-parametre inn til en side som genereres av en XSLT template og deretter puttes inn i DOM'en. Denne malen kverner også igjennom et par XML'er med flyplassdata hvor en blant annet finner lengde- og breddegrad for hver flyplass. XML'ene hentes fra ADDS.

Det en har til nå er en haug av lengde/breddegrader, samt brukerens posisjon. En kan velge å plukke de flyplassene som finnes innenfor en gitt radius (brukerens posisjon pluss/minus slingringsmonn på X antall grader), eller prøve å regne ut avstanden til hver av flyplassene for så å hente ut de som er nærmest. Det er ikke helt enkelt, men heldigvis finnes det formler for slikt!

  1. Inkluder xmlns:math="http://exslt.org/math" i toppen av malen.
  2. Bygg et XML-fragment i en variabel hvor distansen til alle posisjonene (flyplassene) regnes ut.
  3. Kjør en apply-templates, eller for-each på dette XML-fragmentet hvor det sorteres på avstand

Mitt XML-fragment bygges av for-each på hver posisjon med utregning av distanse vha Haversine Formula på denne måten:

            <xsl:variable name="haversine">
          <root xmlns="">
            <xsl:for-each select="stations/response/data/Station[site_type/TAF]">
          <xsl:variable name="lat2" as="xs:double" select="latitude"/> 
          <xsl:variable name="lon2" as="xs:double" select="longitude"/> 
          <xsl:variable name="pi" as="xs:double" select="3.14159265358979323846"/>
          <xsl:variable name="dLat" as="xs:double" select="($lat2 - $lat) * ($pi div 180)"/>
          <xsl:variable name="dLon" as="xs:double" select="($lon2 - $lon) * ($pi div 180)"/>
          <xsl:variable name="a" as="xs:double" select="math:sin($dLat div 2) * math:sin($dLat div 2) + 
            math:cos($lat * $pi div 180) * math:cos($lat2 * $pi div 180) * math:sin($dLon div 2) * math:sin($dLon div 2)"/>
          <xsl:variable name="c" as="xs:double" select="2 * math:atan2(math:sqrt($a), math:sqrt(1 - $a))"/> 
          <xsl:variable name="d" as="xs:double" select="6371 * $c"/>
          <station distance="{$d}" lat="{latitude}" lon="{longitude}" id="{station_id}" taf="{/taf/response/data/TAF[station_id = current()/station_id][1]/raw_text}">
          <xsl:value-of select="site"/>
        </station>
        </xsl:for-each>
            </root>
        </xsl:variable>

        

$lat og $lon er brukerens posisjon, mens $lat2 og $lon2 er lengde- og breddegrad per flyplass (station-noden). 

Deretter sorteres flyplassene på avstand (minst til størst) slik:

            <xsl:for-each select="$haversine/root/station">
          <xsl:sort select="xs:double(@distance)" order="ascending"/>
...
</xsl:for-each>

        

Voila - nå vet en alle avstandene. Så vidt jeg vet kan en bruke Google Maps til å kalkulere avstander, og det er kanskje i mange tilfeller det enkleste. Men siden jeg først fiksa dette her i XSLT tenkte derfor at det like godt kunne deles. Og uavhengig av språk, så er ovennenevnte formel et godt tips! Tilsvarende formel for å regne ut avstander mellom forskjellige lengde- og breddegrader i Javascript finnes på snipplr.com.

Det finnes 0 kommentarer

Dette skjemaet krever at Javascript er påslått

Skriv en kommentar