(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
//simply get the speed provided by the phone from newLocation
double gpsSpeed = newLocation.speed;
// alternative manual method
if(oldLocation != nil) { CLLocationDistance distanceChange = [newLocation getDistanceFrom:oldLocation]; NSTimeInterval sinceLastUpdate = [newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp]; double calculatedSpeed = distanceChange / sinceLastUpdate;
}
}
另外IOS8开始 didUpdateToLocation 方法 变为:
现在的问题是现在的方法把之前 newLocation和oldLocation 放进了一个数组. 里边是NSindexSet 我怎样取啊?
这个是GPS标准输出数据http://aprs.gids.nl/nmea/#vbw。可以看到里面信息包括速度信息(其实这是位置计算的时候计算出来的,并不是GPS卫星报给手机的)。手机系统的SDK一般支持返回部其中的一部分数据,至少GPGGA, GPGSV之类的肯定有接口。GPS在正常情况下是每一秒就会上报一个位置信息(标准位置信息包括经纬度,海拔和相对UTC时间),导航应用可以自己做运算。当然如果为了让速度显示非常精确且变化平滑,还是有很多东西要处理的,还需要针对地图的路线进行不断的纠错。
2楼 @vincent89 对iOS不了解,但在Android里单纯的定位在LocationManager,陀螺仪,加速度计,指南针之类的在SensorManager。但在实际应用中,SensorManager和LocationManager是混合的,比如室内定位的应用中,GPS,WIFI, 手机的基站,指南针,加速度传感器等都会参与到运算中来,以提高定位的精度,在Android里有一个FusedLocation。 估计iOS也有相关的玩意儿,可能会更高级一些。
陀螺仪的话,不知道你要了解到什么程度,简单了解可以查一下陀螺仪芯片的数据手册。这个bosch,ST,Invensense等都有相关产品,你可以google“Bosch ST Invensense Gyro"...