如何将CLLocation转换为CLLocationDegrees,以便我可以创建CLLocationCoordinate2D结构?
在基于位置的应用程序中,我们使用MKMapPoints来存储位置,例如当前用户位置.
当我们尝试在MKMapView上使用此位置时,要设置最初显示的区域(放大用户),我们将其转换为CLLocationCoordinate2D
有一种方便的方法:namenly:MKCoordinateForMapPoint,但在测试期间,这给出了奇怪的结果.
MKMapPoint mapPoint = MKMapPointMake(51.96, 6.3); // My area ;)
CLLocationCoordinate2D automagicCoordinate = MKCoordinateForMapPoint(mapPoint);
CLLocationCoordinate2D manualCoordinate = CLLocationCoordinate2DMake(mapPoint.x, mapPoint.y);
Run Code Online (Sandbox Code Playgroud)
我希望automagicCoordinate和manualCoordinate都是完全一样的.但是当我在调试器中检查它时,我得到以下结果:
automagicCoordinate.latitude = (CLLocationDegrees) 85.05
automagicCoordinate.longitude = (CLLocationDegrees) -179.99
manualCoordinate.latitude = (CLLocationDegrees) 51.96
manualCoordinate.longitude = (CLLocationDegrees) 6.3
Run Code Online (Sandbox Code Playgroud)
为什么使用该方法创建的坐标不正确?
我正在使用CoreLocation并从我的应用程序AppDelegate中启动locationManager.示例代码如下......
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// ...
// start location manager
if([CLLocationManager locationServicesEnabled])
{
myLocationManager_ = [[CLLocationManager alloc] init];
myLocationManager_.delegate = self;
[myLocationManager_ startUpdatingLocation];
}
else
{
// ... rest of code snipped to keep this short
Run Code Online (Sandbox Code Playgroud)
在这种方法中,我们看到更新的位置.
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSString *currentLatitude = [[NSString alloc] initWithFormat:@"%g", newLocation.coordinate.latitude];
NSLog(@"AppDelegate says: latitude: %@", currentLatitude);
// ... rest of code snipped
Run Code Online (Sandbox Code Playgroud)
现在,在我的应用程序的其他区域中,我需要确定用户当前位置(纬度,经度).我可以结合上面的代码到需要当前位置的ViewControllers但后来我不得不CLLocationManager的多个实例运行(我认为) - 为什么复制此代码?有没有办法,从其他ViewControllers,我可以从AppDelegate获取位置信息?
PS - 我正在使用Xcode 4.3 w/ARC
iphone objective-c core-location cllocationmanager cllocation
我是iOS新手.我有一个应用程序,允许用户在不同的视图控制器中更新其位置.我试图最小化执行此操作的代码量,因此我将所有与位置相关的方法放在一个单独的类中,而不是复制方法来实现这一点.
import UIKit
import CoreLocation
class LocationUtil: NSObject, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
func findUserLocation()->Void{
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
Run Code Online (Sandbox Code Playgroud)
从我的视图控制器我这样称呼这个类.
override func viewDidLoad() {
super.viewDidLoad()
let locUtil = LocationUtil()
locUtil.findUserLocation()
}
Run Code Online (Sandbox Code Playgroud)
但是,没有任何委托方法被调用.当我在视图控制器中直接使用相同的代码时,它工作正常.我究竟做错了什么?
我确信这个问题有一个明显的解决方案,但我已经尝试了一段时间不同的东西,但我无法弄清楚。基本上我已经得到了两点之间的距离,并且我试图将它从 Double 转换为 Int(以删除所有小数点),但是我尝试过的一切都没有奏效。
这是我的代码:
let userLocation = CLLocation(latitude: mapView.userLocation.coordinate.latitude, longitude: mapView.userLocation.coordinate.longitude)
let annotationLocation = CLLocation(latitude: latitudePassed, longitude: longitudePassed)
var distance = CLLocationDistance(annotationLocation.distanceFromLocation(userLocation))
if distance > 1000 {
distance = distance / 1000
rideAnnotation.subtitle = "\(distance) kilometer(s)"
} else {
rideAnnotation.subtitle = "\(distance) meters"
}
Run Code Online (Sandbox Code Playgroud)
我尝试先转换为字符串,然后转换为 int,再转换为 inttoInt()和其他一些东西,但没有成功。
有人有什么建议吗?
我正在尝试在swift中创建一个函数,准确计算任何位置与地球原点的垂直和水平距离(纬度:0,经度:0).我知道iOS有distanceFromLocation功能,但这给了我直接位置.我正在寻找的是那个方向的水平和垂直分量.我试着提出自己的解决方案,但是当我根据我得到的水平和垂直分量测试直接距离时,它与实际距离不匹配.这是我的功能:
func distanceFromOrigin(location:CLLocation) {
let lat = location.coordinate.latitude
let lon = location.coordinate.longitude
let earthOriginLocation = CLLocation(coordinate: CLLocationCoordinate2DMake(0.0, 0.0), altitude: CLLocationDistance(0.0), horizontalAccuracy: kCLLocationAccuracyBestForNavigation, verticalAccuracy: kCLLocationAccuracyBestForNavigation, timestamp: NSDate())
var horDistance = earthOriginLocation.distanceFromLocation(CLLocation(latitude: 0.0, longitude: location.coordinate.longitude))
var verDistance = earthOriginLocation.distanceFromLocation(CLLocation(latitude: location.coordinate.latitude, longitude: 0.0))
let overallDistance = earthOriginLocation.distanceFromLocation(location)
if lat < 0 {
print("Object is South of Equator")
verDistance *= -1
} else if lat > 0 {
print("Object is North of Equator")
} else {
print("Object is at the Equator")
}
if lon …Run Code Online (Sandbox Code Playgroud) 如何在 mapview 中为 CLLocation 数组创建路线?我创建了一条折线,我想通过步行创建一条路线。这是我的代码:
@IBAction func addPolyline(sender: AnyObject) {
let locations = [CLLocation(latitude: annotazioni.objectAtIndex(0).coordinate.latitude, longitude:annotazioni.objectAtIndex(0).coordinate.longitude ),
CLLocation(latitude: annotazioni.objectAtIndex(1).coordinate.latitude, longitude:annotazioni.objectAtIndex(1).coordinate.longitude ),
CLLocation(latitude: annotazioni.objectAtIndex(2).coordinate.latitude, longitude:annotazioni.objectAtIndex(2).coordinate.longitude ),
CLLocation(latitude: annotazioni.objectAtIndex(3).coordinate.latitude, longitude:annotazioni.objectAtIndex(3).coordinate.longitude ),
CLLocation(latitude: annotazioni.objectAtIndex(4).coordinate.latitude, longitude:annotazioni.objectAtIndex(4).coordinate.longitude ),
CLLocation(latitude: annotazioni.objectAtIndex(5).coordinate.latitude, longitude:annotazioni.objectAtIndex(5).coordinate.longitude ),
CLLocation(latitude: annotazioni.objectAtIndex(6).coordinate.latitude, longitude:annotazioni.objectAtIndex(6).coordinate.longitude )]
addPolyLineToMap(locations)
}
func addPolyLineToMap(locations: [CLLocation!]){
var coordinates = locations.map({ (location: CLLocation!) -> CLLocationCoordinate2D in
return location.coordinate
})
let geodesic = MKGeodesicPolyline(coordinates: &coordinates, count: locations.count)
mapView.addOverlay(geodesic)
}
func mapView(mapView: MKMapView!, viewForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
if (overlay is MKPolyline) …Run Code Online (Sandbox Code Playgroud) 我正在创建一个使用用户当前位置的应用程序。第一次运行时,在提示用户允许或拒绝该应用使用其位置后,我想在用户按下“允许”按钮时做一些事情。有没有一种方法可以检测用户何时按下了“允许”按钮?
我正在尝试将kCLLocationAccuracyHundredMeters 的位置精度用于我的应用程序中的标准位置更新,这似乎在一段时间内工作得相对较好,但每隔一段时间我会在更新之间收到 10 分钟的间隔(在行驶数英里时)不同的方向),这似乎与设置不符。这是我的位置管理器上的设置。此外,我只使用前台位置更新,因此对于这些测试,我一直在屏幕上显示应用程序,而应用程序始终处于前台。
self.locManager = [[CLLocationManager alloc] init];
self.locManager.delegate = self;
self.locManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
self.locManager.distanceFilter = 15;
Run Code Online (Sandbox Code Playgroud)
我使用相同的其他设置尝试了kCLLocationAccuracyBest,我在整个驱动器中都获得了完美的测量结果,但我不需要那么准确的位置。我认为百米精度仍然会以较低的精度提供相对一致的更新,这就是我们正在寻找的。
这只是使用kCLLocationAccuracyHundredMeters设置与 kCLLocationAccuracyBest 的副作用吗?
在 iPhone 6s 上测试:11.0.2 和 iPhone 7Plus:11.0.3
任何帮助表示赞赏,谢谢!
编辑:
我应该澄清一下,我确实在下面列出的 CLLocationManager 委托方法中设置了日志记录,但从未收到任何回调/日志。
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error;
- (void)locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(nullable NSError *)error;
- (void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager;
- (void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager;
Run Code Online (Sandbox Code Playgroud) 如何找到距离用户最近的位置?基本上,我有一堆CLLocation,我想找到最接近用户的那个.我已检索到用户当前位置但我想找到最近的位置CLLocation.我该怎么做呢?你可以NSLog就近.