2013-05-17 13 views
11

Mam pytanie dotyczące wyświetlania strzałki w wybranej lokalizacji. To jest to, co mam: enter image description hereNieprawidłowe wyniki strzałka (kąt) do geolokalizacji

Możesz zapisać swoją bieżącą lokalizację w localstorage. Chwilę później, gdy jesteś na przykład o 30 metrów dalej, możesz kliknąć drugi przycisk "Pokaż kierunek do poprzedniej lokalizacji!" aby uzyskać strzałkę do poprzedniej lokalizacji. To jest witryna mobilna, więc nie jest to aplikacja natywna.

Oto mój kod:

<!DOCTYPE html> 
<html> 
    <head> 
     <!-- JQUERY SCRIPT AND COMPASS SCRIPT AND MODERNIZR SCRIPT --> 
     <script src="http://code.jquery.com/jquery-1.8.3.js"></script>  
    </head> 
    <body> 
     <div class="container"> 
      <h1>Find your location</h1> 
      <div class="row"> 
       <div class="span12"> 
        <!-- Save your current location --> 
        <button class="grey" id="btnFindLocation">Save my current location!</button> <br> 
        <!-- Show direction to previous location --> 
        <button class="grey" id="btnShowDirection">Show direction to previous location!</button> <br><br> 

        <!-- Arrow in direction to location --> 
        <img id="myarrow" class="deviceorientation" src="http://nielsvroman.be/tapcrowd/arrow.png" /> 
      </div> 
     </div> 
     <script> 
     $(window).ready(function(){ 
      // orientation object to save heading of the device 
      var orientation = {}; 
      /* Find location button */ 
      $("#btnFindLocation").click(findLocation); 
      /* Show direction button */ 
      $("#btnShowDirection").click(showDirection); 

      // Device orientation 
      if (window.DeviceOrientationEvent) { 
       window.addEventListener("deviceorientation", handleOrientation, false); 
      } 
      else{ 
       alert("Device Orientation is not available"); 
      } 

      function handleOrientation(orientData) 
      { 
       var alpha = orientData.alpha; 

       // To get the compass heading, one would simply subtract alpha from 360 degrees. 
       var heading = 360 - alpha; 
       orientation.value = heading; 

      } 

      function findLocation(){ 
       // Check if geolocation is supported in browser 
       if (navigator.geolocation) 
       { 
        // Succes function: geoSucces  Error function: geoError 
        navigator.geolocation.getCurrentPosition(geoSucces,geoError); 
       } 
       else 
       { 
        alert("Geolocation is not supported!"); 
       } 
      } 

      function geoSucces(position) 
      { 
       // Check if localstorage is supported in browser 
       if (Modernizr.localstorage) 
       { 
        // Object declaration in localStorage 
        localStorage.setItem('position', '{}'); 
        // Save position object in localstorage 
        localStorage.setItem('position', JSON.stringify(position)); 
       } 
       else 
       { 
        alert("localStorage is not available!"); 
       } 
      } 

      var watchProcess = null; 
      function showDirection(){ 
       if (navigator.geolocation) 
       { 
        if (watchProcess == null) { 
         // Succes function: geoWatchSucces  Error function: geoError 
         navigator.geolocation.watchPosition(geoWatchSucces,geoError); 
        } 
       } 
       else 
       { 
        alert("Geolocation is not supported!"); 
       } 
      } 

      function geoWatchSucces(position) 
      { 
       // Check if localStorage is supported in browser 
       if (Modernizr.localstorage) 
       { 
        // Get previous location out of localstorage 
        var location = JSON.parse(localStorage.getItem('position')); 
       } 
       else 
       { 
        alert("localStorage is not available!"); 
       } 
       // lat/lon of location in localstorage and current location 
       var lat1 = location.coords.latitude; 
       var lon1 = location.coords.longitude; 
       var lat2 = position.coords.latitude; 
       var lon2 = position.coords.longitude; 

       // angle to location 
       var angle = Math.atan2(lon2 - lon1, lat2 - lat1); 

       // degrees device 
       var degrees = orientation.value; 

       // degrees of device - angle 
       var result = degrees - angle; 

       // Set arrow to direction location 
       setArrowRotation(result); 
      } 

      // Stop monitoring location 
      function stopShowDirection() { 
       if (navigator.geolocation) 
       { 
        if (watchProcess != null) 
        { 
         navigator.geolocation.clearWatch(watchProcess); 
         watchProcess = null; 
        } 
       } 
       else 
       { 
        alert("Geolocation is not supported!"); 
       } 
      } 


      // Error function geolocation 
      function geoError(error) 
      { 
       switch(error.code) 
       { 
        case error.PERMISSION_DENIED: alert("user did not share geolocation data"); 
        break; 
        case error.POSITION_UNAVAILABLE: alert("could not detect current position"); 
        break; 
        case error.TIMEOUT: alert("retrieving position timed out"); 
        break; 
        default: alert("unknown error"); 
        break; 
       } 
      } 

      // Functions to set direction arrow 
      function getsupportedprop(proparray){ 
       var root=document.documentElement; 
       for (var i=0; i<proparray.length; i++){ 
        if (proparray[i] in root.style){ 
         return proparray[i]; 
        } 
       } 
       return false; 
      } 

      var cssTransform; 
      function setArrowRotation(x){ 
       if(cssTransform===undefined){ 
        cssTransform=getsupportedprop(['transform','webkitTransform','MozTransform','OTransform','msTransform']); 
       } 
       if(cssTransform){ 
        document.getElementById('myarrow').style[cssTransform]='rotate('+x+'deg)'; 
       } 
      } 
     }); // END OF DOCUMENT READY 

     </script> 
    </body> 
</html> 

Co zrobić, aby ustawić strzałkę w kierunku poprzedniej lokalizacji jest: - Call watchprocess funkcja - Get lat/lon od poprzedniej lokalizacji + lat/lon bieżącej lokalizacji - Oblicz kąt do poprzedniej lokalizacji - Sprawdź stopnie urządzenia mobilnego - Robię to ze zdarzeniem orientacji urządzenia, czytam, że nagłówek urządzenia = 360 - alfa (źródło: http://dev.w3.org/geo/api/spec-source-orientation.html#introduction) - końcowy kąt to stopnie urządzenia mobilnego - poprzednia s obliczony kąt - ustaw strzałkę pod tym kątem

Ale zawsze dostaję dziwne wyniki ... Kiedy moja poprzednia lokalizacja jest 10 metrów dalej strzała nie jest poprawna przez większość czasu.

Czy ktoś wie, dlaczego otrzymałem ten wynik?

Oto jsfiddle: jsfiddle

Z góry dzięki! Niels

+0

możliwe duplikat [Pokaż strzałką (kąt) do lokalizacji rozważa nagłówek urządzenia] (http://stackoverflow.com/questions/16542774/show-arrow-angle-to-a-location- biorąc pod uwagę nagłówek urządzenia) –

Odpowiedz

2

Czy próbowałeś ustawić dokładność?

navigator.geolocation.getCurrentPosition(geoSucces,geoError, {enableHighAccuracy: true}); 
+0

Tak. Oto dokładność wyników: Po kliknięciu "Zapisz moją lokalizację" mam dokładność 43,612 ... Po kliknięciu "Pokaż kierunek do poprzedniej lokalizacji" mam dokładność 20 ... ten problem? – nielsv

1

Sprawdź, czy position.coords.accuracy jest wystarczająco niska na urządzeniu, na którym testujesz. Możesz po prostu napotkać bardzo niedokładne wyniki szerokości i długości geograficznej.

+0

Po kliknięciu "Zapisz moją lokalizację" mam dokładność 43,612 ... Po kliknięciu "Pokaż kierunek do poprzedniej lokalizacji" mam dokładność 20 .... Czy to jest problem? – nielsv

+0

Możesz to sprawdzić dość łatwo. Narysuj 2 punkty na mapie, a następnie narysuj okrąg z promieniem swojej dokładności. Twój obliczony kąt może być dowolny między dowolnymi dwoma punktami w twoich dwóch okręgach. – Tyron

Powiązane problemy