iphone ios xcode location gpx

iphone - Cuando se utiliza GPX en Xcode para simular cambios de ubicación, ¿hay alguna forma de controlar la velocidad?



simulate location xcode (6)

Actualización: octubre de 2018 (Swift 4, Xcode 9.4)

He encontrado una solución muy simple. aunque no permite especificar la velocidad exacta, sin embargo, la velocidad puede controlarse especificando la distancia entre los puntos gps. La velocidad es directamente proporcional a la distancia entre dos puntos gps.

  1. Generar puntos GPX desde gpxGenerator.com
  2. En Xcode, cree un nuevo GPX a partir de archivo -> Nuevo archivo (o comando N). Buscar gpx
  3. Pega los puntos GPX que obtuviste de gpxGenerator.com en ese archivo gpx
  4. Elimine todas las etiquetas de tiempo (eso es lo que hace. No ignore este paso)
  5. Ejecute su aplicación y seleccione su archivo gpx desde el menú de depuración. (ver captura de pantalla) En mi caso, su nombre es SanFranciscoToNewYork

Eso es todo. Ahora, el simulador o dispositivo real debe simular los puntos en su archivo gpx con sp

Manifestación

Como se puede ver en la demostración, el marcador se está moviendo muy rápido. No es la velocidad lenta predeterminada. yo

Nota: This es mi archivo GPX de muestra que usé para la demostración

Estoy usando el siguiente archivo GPX en Xcode 4.2 para simular un cambio de ubicación. Funciona bien, pero no puedo controlar la velocidad del cambio de ubicación. El sello parece no estar funcionando. ¿Alguien tiene una solución para esto?

<?xml version="1.0"?> <gpx version="1.1" creator="Xcode"> <wpt lat="37.331705" lon="-122.030237"></wpt> <wpt lat="37.331705" lon="-122.030337"></wpt> <wpt lat="37.331705" lon="-122.030437"></wpt> <wpt lat="37.331705" lon="-122.030537"></wpt> </gpx>


El soporte de Xcode simula el cambio de velocidad con un archivo GPX.

Proporcione uno o más puntos de ruta que contengan un par de latitud / longitud. Si proporciona un punto de ruta, Xcode simulará esa ubicación específica. Si proporciona varios puntos de ruta, Xcode simulará una ruta visitando cada punto de ruta.

Opcionalmente, proporcionar un elemento de tiempo para cada punto de ruta. Xcode interpolará el movimiento a una velocidad de velocidad basada en el tiempo transcurrido entre cada punto de ruta. Si no proporciona un elemento de tiempo, entonces Xcode utilizará una velocidad de velocidad fija. Los puntos de ruta deben ordenarse por tiempo en orden ascendente.

Escribe así:

<wpt lat="39.96104510" lon="116.4450860"> <time>2010-01-01T00:00:00Z</time> </wpt> <wpt lat="39.96090940" lon="116.4451400"> <time>2010-01-01T00:00:05Z</time> </wpt> ... <wpt lat="39.96087240" lon="116.4450430"> <time>2010-01-01T00:00:09Z</time> </wpt>

Alrededor de -1 velocidad

La velocidad del objeto CoreLocation siempre será -1 durante la simulación. Una posible solución es guardar una última ubicación y luego calcular la velocidad nosotros mismos. Código de muestra:

CLLocationSpeed speed = location.speed; if (speed < 0) { // A negative value indicates an invalid speed. Try calculate manually. CLLocation *lastLocation = self.lastLocation; NSTimeInterval time = [location.timestamp timeIntervalSinceDate:lastLocation.timestamp]; if (time <= 0) { // If there are several location manager work at the same time, an outdated cache location may returns and should be ignored. return; } CLLocationDistance distanceFromLast = [lastLocation distanceFromLocation:location]; if (distanceFromLast < DISTANCE_THRESHOLD || time < DURATION_THRESHOLD) { // Optional, dont calculate if two location are too close. This may avoid gets unreasonable value. return; } speed = distanceFromLast/time; self.lastLocation = location; }


No creo (sé) que esto sea posible en el GPX directamente, pero puede probar el cambio de ubicación con Instrumentos / Automatización.

Usarías un script como:

var target = UIATarget.localTarget(); target.setLocation(<location); target.delay(5); target.setLocation(...);

Y así. Tomé este ejemplo del video de WWDC11 (Probando sus aplicaciones que reconocen la ubicación)

Soy consciente de que esto no le permite realmente definir la velocidad, pero los retrasos de alguna manera explican eso, espero. Tal vez eso te ayude.


No creo que puedas hacerlo con archivos GPX. Pero es fácil con la herramienta de automatización dentro de los instrumentos. Aquí está uno de los scripts que utilizo para mis pruebas de aplicaciones y la recopilación de capturas de pantalla:

var target = UIATarget.localTarget(); // speed is in meters/sec var points = [ {location:{latitude:48.8899,longitude:14.2}, options:{speed:8, altitude:200, horizontalAccuracy:10, verticalAccuracy:15}}, {location:{latitude:48.8899,longitude:14.9}, options:{speed:11, altitude:200, horizontalAccuracy:10, verticalAccuracy:15}}, {location:{latitude:48.8899,longitude:14.6}, options:{speed:12, altitude:200, horizontalAccuracy:10, verticalAccuracy:15}}, {location:{latitude:48.8899,longitude:14.7}, options:{speed:13, altitude:200, horizontalAccuracy:10, verticalAccuracy:15}}, {location:{latitude:49.2,longitude:14.10}, options:{speed:15, altitude:200, horizontalAccuracy:10, verticalAccuracy:15}}, {location:{latitude:49.4,longitude:14.8}, options:{speed:15, altitude:200, horizontalAccuracy:10, verticalAccuracy:15}}, {location:{latitude:48.8899,longitude:14.9}, options:{speed:9, altitude:200, horizontalAccuracy:10, verticalAccuracy:15}}, {location:{latitude:48.8899,longitude:15.1}, options:{speed:8, altitude:200, horizontalAccuracy:10, verticalAccuracy:15}}, {location:{latitude:48.8899,longitude:16.1}, options:{speed:3, altitude:200, horizontalAccuracy:10, verticalAccuracy:15}}, ]; for (var i = 0; i < points.length; i++) { target.setLocationWithOptions(points[i].location,points[i].options); target.captureScreenWithName(i+"_.png"); target.delay(1.0); }

Creé paso a paso cómo usé la simulación de ubicación con Automatización y Fugas para capturar capturas de pantalla y encontrar fugas.


Si no desea tratar con automator, puede hacerlo funcionar solo con un archivo GPX. El truco es crear un montón de puntos.

Por ejemplo, en lugar de crear solo 2 puntos para ir de A a B, crea un grupo de puntos intermedios entre ellos. Esto funciona porque el simulador de ubicación toma tiempo constante para viajar de un punto a otro, sin importar la distancia entre los dos puntos.

En lugar de tener que crear un montón de puntos manualmente, puede utilizar el siguiente código.

Instrucciones:

  1. Pegue el código a continuación, ajustando la constante kDesiredSpeed ​​a su gusto.
  2. Agregue un UITapGestureRecognizer a su vista de mapa, vinculándolo a mapViewTapped:
  3. Agregue botones que llamen a startRecordingPoints y stopRecordingPoints.
  4. Ejecutar la aplicación.
  5. Toque el botón startRecordingPoints.
  6. Toque donde debe comenzar la ruta.
  7. Toque otra ubicación en el mapa. Esto generará X cantidad de puntos entre el último nodo y el nuevo nodo para que parezca que se mueva a la velocidad deseada.
  8. Repita el paso anterior tantas veces como desee.
  9. Pulse detener la grabación.
  10. Copia la salida de la consola.
  11. Archivo> Nuevo archivo ...
  12. Elija Recurso> Archivo GPX
  13. Pega los contenidos y guarda el archivo.
  14. Toque la flecha de ubicación en el depurador y elija su archivo GPX.
  15. Siéntese y observe cómo la ubicación se actualiza exactamente a la velocidad que desea.

Código:

@property (strong, nonatomic) CLLocation *lastRecordedPoint; @property (strong, nonatomic) NSMutableString *recordingOutput; ... - (IBAction)mapViewTapped:(UITapGestureRecognizer *)sender { if (sender.state != UIGestureRecognizerStateEnded || !self.recordingOutput) { return; } CLLocationCoordinate2D coord = [self.mapView convertPoint:[sender locationInView:self.mapView] toCoordinateFromView:self.mapView]; [self recordPoint:coord]; } - (void)recordPoint:(CLLocationCoordinate2D)newPoint { const CGFloat kAppleTravelTime = 2; // the default time it takes to travel from one point to another const CGFloat kDesiredSpeed = 6; // meters per sec const CGFloat kDesiredDistanceBetweenPoints = kDesiredSpeed * kAppleTravelTime; NSString * const kFormatString = @" <wpt lat=/"%f/" lon=/"%f/"></wpt>/n"; CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:newPoint.latitude longitude:newPoint.longitude]; NSInteger numberOfPoints = 1; if (self.lastRecordedPoint) { CLLocationDistance distance = [self.lastRecordedPoint distanceFromLocation:newLocation]; numberOfPoints = MAX(round(distance / kDesiredDistanceBetweenPoints), 1); CGFloat deltaLatitude = newPoint.latitude - self.lastRecordedPoint.coordinate.latitude; CGFloat deltaLongitude = newPoint.longitude - self.lastRecordedPoint.coordinate.longitude; for (NSInteger i = 0; i < numberOfPoints; i++) { CLLocationDegrees latitude = self.lastRecordedPoint.coordinate.latitude + (numberOfPoints/distance * deltaLatitude) * (i+1); CLLocationDegrees longitude = self.lastRecordedPoint.coordinate.longitude + (numberOfPoints/distance * deltaLongitude) * (i+1); [self.recordingOutput appendFormat:kFormatString, latitude, longitude]; } } else { [self.recordingOutput appendFormat:kFormatString, newPoint.latitude, newPoint.longitude]; } NSLog(@"Recorded %ld point(s) to: %f,%f", (long)numberOfPoints, newPoint.latitude, newPoint.longitude); self.lastRecordedPoint = newLocation; } - (void)startRecordingPoints { NSLog(@"Started recording points. Tap anywhere on the map to begin recording points."); self.recordingOutput = [NSMutableString string]; [self.recordingOutput appendString:@"<?xml version=/"1.0/"?>/n<gpx version=/"1.1/" creator=/"Xcode/">/n"]; self.lastRecordedPoint = nil; } - (void)stopRecordingPoints { [self.recordingOutput appendString:@"</gpx>"]; NSLog(@"Done recording, here is your gpx file: /n%@", self.recordingOutput); self.recordingOutput = nil; }

Descargo de responsabilidad: kAppleTravelTime = 2 es solo una conjetura. Si tiene un valor más preciso, publíquelo en un comentario.


También hay un método que le permite pasar la velocidad y algunas otras propiedades:

target.setLocationWithOptions({latitude: 46.546928, longitude: 11.867127}, {altitude: 200.0, speed: 5});

(Consulte este AppleDoc para más detalles)

Aún puede ver sus NSLog''s en la aplicación de la consola (/Applications/Utilities/Console.app). Solo agrega un filtro para obtener los resultados adecuados.