iOS-高德地图点击地图获取点击点对应的地理位置,并添加自定义的大头针

这是我在开发中遇到的问题,如果大家有什么更好的方法或者建议都可以留言给我,不说了直接粘代码吧

///地图需要v4.5.0及以上版本才必须要打开此选项(v4.5.0以下版本,需要手动配置info.plist)
    [AMapServices sharedServices].enableHTTPS = YES;
    
    ///初始化地图
    _mapView = [[MAMapView alloc] initWithFrame:self.locationView.bounds];
    _mapView.delegate = self;
    //给_mapView添加长按手势
    UILongPressGestureRecognizer *lpress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
    lpress.delegate = self;
    [_mapView addGestureRecognizer:lpress];

    ///把地图添加至view
    [self.locationView addSubview:_mapView];

///进入地图就显示定位小蓝点
    // 开启定位
    _mapView.showsUserLocation = YES;
    // 追踪用户位置
    _mapView.userTrackingMode = MAUserTrackingModeFollow;
    
    // 设置成NO表示关闭指南针;YES表示显示指南针
    _mapView.showsCompass= NO;
    //全局的大头针
    _pointAnnotation = [[MAPointAnnotation alloc] init];

#pragma mark - 允许多手势响应
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

//自定义大头针我这里只是把大头针变成一张自定义的图片
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MAPointAnnotation class]])
    {
        static NSString *reuseIndetifier = @"annotationReuseIndetifier";
        MAAnnotationView *annotationView = (MAAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIndetifier];
        if (annotationView == nil)
        {
            annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIndetifier];
        }
        annotationView.image = [UIImage imageNamed:@"list_map_ico_location"];
        //设置中心点偏移,使得标注底部中间点成为经纬度对应点
        annotationView.centerOffset = CGPointMake(0, -18);
        return annotationView;
    }
    return nil;
}

- (void)longPress:(UIGestureRecognizer*)gestureRecognizer{
    if (gestureRecognizer.state == UIGestureRecognizerStateEnded){
        return;
    }
    [_mapView removeAnnotation:_pointAnnotation];
    //坐标转换
    CGPoint touchPoint = [gestureRecognizer locationInView:_mapView];
    CLLocationCoordinate2D touchMapCoordinate =
    [_mapView convertPoint:touchPoint toCoordinateFromView:_mapView];
    
    _pointAnnotation.coordinate = touchMapCoordinate;
    //_pointAnnotation.title = @"设置名字";
    
    [_mapView addAnnotation:_pointAnnotation];
    
    [self setLocationWithLatitude:touchMapCoordinate.latitude AndLongitude:touchMapCoordinate.longitude];
}

- (void)setLocationWithLatitude:(CLLocationDegrees)latitude AndLongitude:(CLLocationDegrees)longitude{
    
    NSString *latitudeStr = [NSString stringWithFormat:@"%f",latitude];
    NSString *longitudeStr = [NSString stringWithFormat:@"%f",longitude];
    _mapCoordinate = [NSString stringWithFormat:@"%@,%@",latitudeStr,longitudeStr];
    //NSLog(@"%@",_mapCoordinate);
    //反编码 经纬度---->位置信息
    CLLocation *location=[[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
    CLGeocoder *geocoder=[[CLGeocoder alloc]init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        if (error) {
            NSLog(@"反编码失败:%@",error);
            [self.view makeToast:@"该网点经纬度信息有误,请重新标注!"];
        }else{
            //NSLog(@"反编码成功:%@",placemarks);
            CLPlacemark *placemark=[placemarks lastObject];
            //NSLog(@"%@",placemark.addressDictionary[@"FormattedAddressLines"]);
            NSDictionary *addressDic=placemark.addressDictionary;
            
            NSString *state=[addressDic objectForKey:@"State"];
            NSString *city=[addressDic objectForKey:@"City"];
            NSString *subLocality=[addressDic objectForKey:@"SubLocality"];
            NSString *street=[addressDic objectForKey:@"Street"];
            //NSLog(@"%@,%@,%@,%@",state,city,subLocality,street);
            NSString *strLocation;
            if (street.length == 0 || street == NULL || [street isEqualToString:@"(null)"]) {
                strLocation= [NSString stringWithFormat:@"%@%@%@",state,city,subLocality];
            }else{
                strLocation= [NSString stringWithFormat:@"%@%@%@%@",state,city,subLocality,street];
            }
            
            self.addressTextView.text = strLocation;
        }
    }];
}

/*
 * 手机定位你当前的位置,并获得你位置的信息
 */
- (void)mobilePhonePositioning{
    
    _locationManager = [[AMapLocationManager alloc] init];
    _locationManager.delegate = self;
    [AMapServices sharedServices].apiKey =@"你的key值";
    // 带逆地理信息的一次定位(返回坐标和地址信息)
    [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    //   定位超时时间,最低2s,此处设置为10s
    _locationManager.locationTimeout =10;
    //   逆地理请求超时时间,最低2s,此处设置为10s
    _locationManager.reGeocodeTimeout = 10;
    
    // 显示进度圈
    [self showHUDWithStatus:@"正在定位您的位置..."];
    
    // 带逆地理(返回坐标和地址信息)。将下面代码中的 YES 改成 NO ,则不会返回地址信息。
    [_locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
        // 隐藏进度圈
        [self dismissHUDIgnoreShowCount];

        if (error)
        {
            //NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
            [self.view makeToast:@"抱歉,未能定位到你的位置!"];
            if (error.code == AMapLocationErrorLocateFailed)
            {
                return;
            }
        }
        
        //NSLog(@"location:%@", location);
        NSString *latitude = [NSString stringWithFormat:@"%f",location.coordinate.latitude];
        NSString *longitude = [NSString stringWithFormat:@"%f",location.coordinate.longitude];
        _mapCoordinate = [NSString stringWithFormat:@"%@,%@",latitude,longitude];
        
        if (regeocode)
        {
            //NSLog(@"reGeocode:%@", regeocode);
            self.addressTextView.text = regeocode.formattedAddress;
        }
    }];
}
具体的效果图如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值