¿Cómo puedo determinar la dirección con las lecturas del GPS solamente y exhibir en 360 grados?

Estoy trabajando en una aplicación AS3 AIR para Android. "Mi problema es esto: dada una localización GPS, quiero recuperar la dirección del movimiento (Norte, NW, Oeste, SW, Sur, SE, Este, NE)"

Me gustaría que el código de cómo utilizar 2 lecturas de GPS diferentes para deducir la dirección del viaje. Entonces quisiera usar esos datos para 360 grados.

Creo que entiendo cómo puedo obtener dirección general como Norte, Sur, Este y Oeste. Me gustaría obtener 2 lecturas GPS por separado y comparar algo así …

Compruebe si X es mayor en la 1ª o 2ª lectura GPS. Vea si Y es mayor en la 1ª o 2ª lectura GPS. De esto yo debería ser capaz de ver la dirección general. Comparar las diferencias de X1 y X2 con la diferencia de Y1 e Y2. Entonces usted puede ver en qué dirección el usuario fue encabezado en la mayoría. A continuación, muestre la dirección.

Im no seguro en cómo tomar los datos y utilizarlo para una interpretación 360 como una brújula … puede cualquier persona ayudar?

CÓDIGO DE TRABAJO ———————————————— ——————————-

package { import flash.display.Sprite; // Geolocation sensor stuff import flash.sensors.Geolocation; import flash.events.GeolocationEvent; //Timer setup stuff for setting frequesncy of GPS Update import flash.utils.Timer; import flash.events.TimerEvent; // Sprite and Textfield display import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; public class FlashTest extends Sprite { //Variable to check if current or prior Geolocation Event fired private var gpsCheck:int = 1; public var dLon:Number //latitude and longitude in degrees (RAW info from Geolocation) public var gpsLat1:Number public var gpsLon1:Number private var gpsLat2:Number private var gpsLon2:Number public var bearing:Number // Latitude and longitude in radians converted from Degrees public var gpsLat1R:Number public var gpsLon1R:Number private var gpsLat2R:Number private var gpsLon2R:Number private var yy:Number private var xx:Number public function FlashTest() { // Text box for displaying results var my_txt:TextField = new TextField(); my_txt.wordWrap=true; my_txt.width = 300; my_txt.height = 300; addChild(my_txt); /* //If GPS is on device create Geolocation object named "my_geo" //Request updates from my_geo every 2000 milliseconds. Run onGeoUpdate function //when Event is triggered. After that create the text box for displaying data. if (Geolocation.isSupported) { var my_geo:Geolocation = new Geolocation(); my_geo.setRequestedUpdateInterval(2000); my_geo.addEventListener(GeolocationEvent.UPDATE, onGeoUpdate); var my_txt:TextField = new TextField(); my_txt.wordWrap=true; my_txt.width = 300; my_txt.height = 300; addChild(my_txt); } // If GPS is not supported on device display "No GPS Signal" else { addChild(my_txt); my_txt.wordWrap=true; my_txt.width = 300; my_txt.height = 300; addChild(my_txt); my_txt.text = "No GPS Signal "; } */ // False GPS reading being passed for testing //COMMENT THESE LINES OUT STARTING HERE--- gpsLat1 = 42.1234584; gpsLon1 = -83.1234577; gpsLat2 = 42.1234583; gpsLon2 = -83.1234577; // END OF WHAT SHOULD BE COMMENTED OUT--- // Equations to convert all RAW Geolocation information over to radians gpsLat1R = gpsLat1 * Math.PI / 180; gpsLon1R = gpsLon1 * Math.PI / 180; gpsLat2R = gpsLat2 * Math.PI / 180; gpsLon2R = gpsLon2 * Math.PI / 180; // The rest of the math dLon = gpsLon1 - gpsLon2; yy = Math.sin(dLon) * Math.cos(gpsLat2R); xx = Math.cos(gpsLat1R) * Math.sin(gpsLat2R) - Math.sin(gpsLat1R) * Math.cos(gpsLat2R) * Math.cos(dLon); bearing = Math.atan2(yy, xx) * 180 / Math.PI; // Run The Geoupdate function onGeoUpdate(); // onGeoUpdate basically displays the information that was collected and converted. // This is where you will put what you want the code to do with the results function onGeoUpdate():void { my_txt.text = "My Latitude is "+gpsLat1+ " and my Longitude is "+gpsLon1+ "My 2nd Latitude is "+gpsLat2+" and my 2nd Longitude is "+gpsLon2+ " Bearing is " +bearing; } } } } 

La fórmula que se necesita (para longitudes lon1 , lon2 y lat1 , lat2 latitudes de los dos puntos) se da en muchos lugares – por ejemplo, en http://www.movable-type.co.uk/scripts/latlong.html . La matemática va como esto (convertirlo a su idioma favorito …):

 dLon = lon2 - lon1; y = sin(dLon) * cos(lat2); x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) *cos(dLon); bearing = atan2(y, x) * 180 / Pi; 

Nota : atan2 reduce el resultado a un valor entre [-pi, pi]. Después de multiplicar por 180/pi el número estará entre [-180, 180]. A fin de obtener un valor entre 0 y 360 que podría hacer, por ejemplo:

 if (bearing < 0) bearing += 360; 

Espero que puedas completar cualquier otro detalle que necesites para que esto funcione para ti.

EDIT Yo he utilizado los números de su dio a escribir un poco de código: este es Matlab, pero debe ser bastante legible:

 % bearings lat1 = 42.1234584; lat2 = 42.1234583; lon1 = -83.1234577; lon2 = -83.1234510; % convert to radians: g2r = pi/180; lat1r = lat1 * g2r; lat2r = lat2 * g2r; lon1r = lon1 * g2r; lon2r = lon2 * g2r; dlonr = lon2r - lon1r; y = sin(dlonr) * cos(lat2r); x = cos(lat1r)*sin(lat2r) - sin(lat1r) * cos(lat2r)*cos(dlonr); % compute bearning and convert back to degrees: bearing = atan2(y, x) / g2r; fprintf(1,'x: %+.3e\ny: %+.3e\nbearing: %.3f\n', x, y, bearing); 

Esto resulta en la salida:

 x: -1.745e-09 y: +8.673e-08 bearing: 91.153 

Como puedes ver, y son minúsculas – representan la "fracción de la circunferencia de la tierra" que movías (alrededor de 3,5 metros hacia el este, parecería …). Debe poder depurar su implementación con estos números.

Tenga en cuenta que el GPS puede tener una mala precisión "absoluta" (en su caso, una incertidumbre de> 100 m), pero aún así es bueno con una precisión relativa (mide la diferencia entre dos posiciones mucho mejor que 100 m).

Si está utilizando la API de ubicación, cuando cambie su ubicación obtendrá una devolución de llamada que le dará un objeto de ubicación que puede obtener el bearing de la dirección se mueve de 0-360 grados

Utilicé una solución "breadcrumb".

Agrego mc a mi ubicación actual. Al mover el nuevo mc se compara con el mc anterior.

Así que primero encuentro mis coordenadas en un mapa fijo, luego busco mi "estás aquí". Entonces ponga pan rallado mientras me muevo … luego compara esos pan rallado para encontrar el rumbo.

 // geolocation function onGeoUpdate(event:GeolocationEvent):void{ MapHolder.Star.x = MapHolder.Map.x + (event.longitude - (Min_Longitude)) / ((Max_Longitude) - (Min_Longitude)) * 940; MapHolder.Star.y = MapHolder.Map.y + 800 - (event.latitude - Min_Latitude) / (Max_Latitude - Min_Latitude) * 800; /// then create new and previous var MapHolderStarxold = MapHolder.Star.x; var MapHolderStaryold = MapHolder.Star.y; ///breadcrumbs var randomMc:Number = Math.floor(Math.random()*myArray.length); var mc:MovieClip = new myArray[randomMc]; MapHolder.addChild(mc); mc.x = MapHolder.Star.x; mc.y = MapHolder.Star.y; MapHolder.dirArrow.x = MapHolderStarxold; MapHolder.dirArrow.y = MapHolderStaryold; //// MapHolder.Star point // find out mouse coordinates to find out the angle var cyB:Number = mc.y - MapHolder.dirArrow.y; var cxB:Number = mc.x - MapHolder.dirArrow.x; // find out the angle var RadiansB:Number = Math.atan2(cyB,cxB); // convert to degrees to rotate var DegreesB:Number = RadiansB * 180 / Math.PI; // rotate MapHolder.dirArrow.rotation = DegreesB; } 
  • ¿Cómo activar / desactivar los gps y los datos móviles en android mediante programación?
  • ¿Cómo evitar las frecuentes actualizaciones de ubicación?
  • Hacer Android "use-permission" opcional
  • LocationListener de NETWORK_PROVIDER está habilitado pero, onLocationChanged nunca se llama
  • ¿Por qué el registro de las actualizaciones de ubicación activa los contactos para actualizar?
  • ¿Puede el GPS ser emulado en Android en un teléfono real? (sin emulador)
  • Cliente de la API de Google que no se conecta de nuevo después de onConnectionSuspended (int Cause) called
  • Obtención de Latitude y Longitud 0.0 en Android M
  • ¿Cómo utilizar mejor los datos GPS?
  • Android - trazado de gps coordinar en mapa personalizado
  • Cambiar el modo de ubicación a alta precisión mediante programación Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.