1

次のviewdidloadメソッドと場所へのdidupdateを持つ単純なマップビューがあります。

- (void)viewDidLoad {
    NSLog(@"in view did load");
    [super viewDidLoad];
    self.mapView.showsUserLocation = YES;
    self.put_url = nil;


    locationManager = [[CLLocationManager alloc] init];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
    [locationManager setDelegate:self];

    noUpdates = 0;
    [locationManager startUpdatingLocation];

    self.availableParking = [[NSMutableArray alloc] init];
    //self.availableParking = nil;

}


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    NSLog(@"in didupdatetolocatoin");
     if([newLocation horizontalAccuracy] < 100 && [newLocation horizontalAccuracy] > 0) {


    // Add annotation to map
    DDAnnotation *annotation = [[DDAnnotation alloc] initWithCoordinate:newLocation.coordinate title:@"Park Here?"];

    MKCoordinateRegion region;
    MKCoordinateSpan   span;
    span.latitudeDelta = 0.05;
    span.longitudeDelta = 0.05;


    region.span = span;
    region.center = newLocation.coordinate;



    self.mapView.region = region;



    NSLog(@"in didupdatetolocation");
    noUpdates++;
         NSLog(@"IN UPDATELOCATION NOUPDATES = %d",noUpdates);
    if (noUpdates == 1) {
        [self.mapView addAnnotation:annotation];
        NSLog(@"ADDED ANNOTATION IN didUpdateToLocation!!");


        [locationManager stopUpdatingLocation];
        [self.settingsViewController setState:self.mapView.userLocation.subtitle andCity:@"fuckface"];



        NSLog(@"STOPPED UPDATING LOCATION");


        UpdateLocation *updatedLocation = [[[UpdateLocation alloc] initWithUserid:@"fuckface" andCoordinate:newLocation.coordinate withMapViewController:self]
                                           autorelease];
        NSLog(@"Lat = %f, Long = %f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
        //[NSThread detachNewThreadSelector:@selector(getLocations) toTarget:self withObject:nil];
        [[NSNotificationCenter defaultCenter]
         addObserver:self
         selector:@selector(sendUpdate)
         name:@"NoteFromOne"
         object:updatedLocation]; 


        }
    // We only update location once, and let users to do the rest of the changes by dragging annotation to place they want

        }  else {
            NSLog(@"Accuracy not good enough %lf", [newLocation horizontalAccuracy]);

        }



}

ワイヤレス ネットワークに接続すると、問題なくズームインし、現在の場所に注釈ピンをドロップできます。3G ネットワーク上では、ピンをズームまたはドロップすることはありません。理由についてのアイデアはありますか?前もって感謝します。

ここにいくつかのスクリーンショットがあります:

3G の場合: 代替テキスト http://www.freeimagehosting.net/uploads/fe7fcbb2ea.jpg

Wi-Fi あり: 代替テキスト http://www.freeimagehosting.net/uploads/6b653e60a7.jpg

4

1 に答える 1

0

GPS ユニットは、ネットワーク接続とは何の関係もありません (GPS 信号が利用できない場合を除きます。GPS 信号が利用できない場合、GPS は Wi-Fi ホットスポットまたはデバイスが接続されているセルを使用して、位置を推測しようとする場合があります)。GPS 信号が利用可能な場合、それとは独立して機能し、ネットワークは実際にマップを表示するためにのみ使用されます。投稿したコードから、水平精度が 100 メートル未満に達した場合にのみマップを表示し、それ以外の場合は GPS ユニットに位置を更新させます。ただし、まったく同じ場所でコードを試すと、デバイスの GPS ユニットは常に同じ更新を返すはずです。したがって、私はあなたが説明している動作を本当に理解していません: これは、GPS 信号が利用できないために別のネットワーク接続が利用可能であるときに、GPS ユニットが同じ場所に対して異なる更新を返した場合にのみ可能です。2 つのケースで同じ緯度/経度が表示されていますか? 同じ精度を見ていますか?どちらの場合も、正確に同じ場所でこれを測定するように注意してください。

同じアップデートを取得した場合、3G セルラー接続が十分に強力ではないか、明らかにしか利用できないため、マップを取得できなかった可能性があります。同じ場所から 3G ネットワークの速度をテストしてみてください。

関連する考慮事項。指定された時間が経過するまで (たとえば 20 秒、これには NSTimer を使用します)、または指定されたレベルの精度に達するまで、どちらか早い方まで GPS ユニットを動作させる必要があります。そうしないと、バッテリーを過度に消費する可能性があります。

于 2009-10-18T11:01:51.990 に答える