2012

Jun

10

Av

Varje plats i världen har en koordinat som anges med longitud och latitud. Du kan läsa mer om koordinatsystemet t.ex. på Wikipedia. Det går att omvandla en adress till en koordinat med t.ex. Google, använder du FileMaker finns det en färdig byggsten som hjälper dig med konverteringen. 

Du kan också hämta koordinater från flera sammanställningar på internet, t.ex. över sevärdheter, fartkameror eller bensinstationer, och importera i din FileMaker-databas.

Med FileMaker Go 12 finns möjligheten att hämta koordinaterna från den plats du befinner dig på. Det finns en ny funktion som heter Location som returnerar longitud och latitud med hjälp av GPS-en i din iPhone/iPad. (Du kan inte använda funktionen i FileMaker Pro.)

Du kan t.ex. göra en knapp som hämtar longitud och latitud till två globala fält (gLongitude respektive gLatitude), manuset kan se ut så här:

Ange variabel [$plats; Substitute(Location ( 0;10);[",";"¶"];[".";","])
Tilldela fält [gLongitude; GetValue($plats;1)] 
Tilldela fält [gLatitude; GetValue($plats;2)] 
Verkställ post []

Det första manussteget hämtar platsen med funktionen Location, byter decimalpunkt till komma samt ser till att värdena hamnar på två rader för att enklare kunna hämta dem i nästa steg med funktionen GetValue.

Hur långt är det då till närmaste bensinstation från den plats du befinner dig på? Eller till närmaste sevärdhet? Det beror förstås på vilken väg du tar och det finns säkert någon beräkning från Google Maps (kanske återkommer till det) men det går att räkna avståndet fågelvägen med en enkel(?) formel som kallas Haversins formel.

Antag att du har platser med geografiska koordinater i en tabell, en post per koordinat, med platsens koordinater i fältenLongitude och Latitude.

Omvandlat till FileMaker-formel blir avståndsberäkningen med Haversins formel så här:

6371 * // jordens medelradie i km (omvandlar resultatet till km)
Let([
  longitude0 = gLongitud;
  latitude0 = gLatitud;
  longitude1 = Substitute(Longitude;".";",");
  latitude1 = Substitute(Latitude;".";",")
];
Acos( 
      Cos(Radians( latitude0 ))
    * Cos(Radians( latitude1 ))
    * Cos(Radians( longitude0 ) - Radians( longitude1 ))
    + Sin(Radians( latitude0 )) 
    * Sin(Radians( latitude1 ))
  )
)

Du kan sedan söka efter de som är närmast, t.ex. avstånd <50 km och sortera dem i avståndsordning. Det går också att visa dem alla samtidigt på en karta med t.ex. Google Maps. Tänk på att det blir en icke-indexerad sökning varför du inte kan ha obegränsat med poster.

Exempel

Du kan använda funktionen för att hitta platser när dig. Jag har gjort en liten databas med camping- och badplatser runt om i Sverige, vilket passar bra nu på sommaren. Till varje camping- eller badplats finns koordinater (longitud och latitud).

När jag klickar på knappen Visa i appen söker FileMaker fram de närmaste campingplatserna och badplatserna inom en radie av 50 km och visar dem i en lista (bilden till vänster). Avståndet från den plats jag befinner mig på (just nu på Mallverkstans kontor) är angivet i km. Bilden till höger visar camping- och badplatserna på en karta, gröna markörer är campingplatser, blå badplatser och den röda markören anger var jag är.

 

SommarSverige_dubbel

10 kommentarer till ”Beräkna avstånd”

  1. Tobias

    Hej, Jag har 1 tabell som heter platser, den har 2 fält.. LONG och LAT

    Jag har lyckats göra så att jag kan klicka på en knapp så får jag min nuvarande position i FM GO, men om jag vill kunna se platser nära mig, låt oss säga inom 100m, hur går man då tillväga? Förstod inte alls haversins formel.

    Vill alltså få in platser inom 100 m i en rull lista.

    Reply
  2. Rolf

    Beräkningsfunktionen beräknar avståndet mellan 2 platser. Lägg in beräkningsfunktionen i din tabell med platser och byt i formeln ut det fält jag kallar för “Longitude” till ditt fält “LONG” samt “Latitude” till ditt fält “LAT”.

    Avståndet beräknas från samma plats för samtliga poster, jag har valt att lägga koordinaterna för aktuell plats i de globala fälten “gLongitude” och “gLatitude”, dessa båda används också i formeln.

    I varje post har du nu avståndet till aktuell plats i enheten km. Sortera posterna i stigande ordning efter beräkningsfältet så får du den närmaste platsen först (se bild på mitt exempel med bad- och campingplatser).

    Reply
  3. Tobias

    Varför har du skrivit latitude på vissa och latitude1 på vissa? samma på longitud. Ska jag lägga till en 1.a efter på dem som har en etta efter?

    Reply
  4. Rolf

    Formeln beräknar avstånd mellan två punkter, punkterna benämns i formeln latitude0, longitude0 respektive latitude1, longitude1.

    Reply
  5. Tobias

    OkSmile hur har du gjort för att visa alla poster på en karta? är det någon programmering utanför filemaker?

    Reply
  6. Tobias

    Jag har också en fundering, jag har fått haversins formel att funka, men när jag mäter i google maps mellan 2 platser stämmer de inte överens, men när jag skriver in kordinaterna på http://rl.se/avstand så stämmer det exakt. något mysko där?

    Reply
  7. Rolf

    hur har du gjort för att visa alla poster på en karta?

    Du kan t.ex. använda Googles kartor:

    developers.google.com/…/

    Reply
  8. Rolf

    jag har fått haversins formel att funka, men när jag mäter i google maps mellan 2 platser stämmer de inte överens

    Du menar att resultatet från Haversins formel inte stämmer med Googles? Så kan det ju vara, Haversins formel beräknar fågelvägen (och inte helt exakt).

    Reply
  9. Tobias

    Okej, ska läsa på om visa alla på en karta.
    Men det jag menade är att en del missstämmer med haversins formel, ett objekt som är närmare än ett annat objekt fågelvägen visar ändå dubbel så långt. kanske är någon bugg?
    Mycket tacksam för svaren.

    Reply
  10. Rolf

    Inte omöjligt att det är något räknefel, men de punkter jag provat med har fått “rätt” resultat. Det som kan skilja mellan olika varianter av formeln är konstanten för jordens radie, den är ju olika beroende på var man befinner sig. Det ska dock inte påverka att en punkt som ligger längre bort får kortare avstånd i formeln.

    Du får gärna skicka exempel till mig med mail så ska jag undersöka vad det kan vara.

    Reply

Skriv en kommentar

  • (will not be published)
  • 8 − = seven

Läs också: