iOS開發(fā)之高德地圖的應(yīng)用與開發(fā)之二:固定在地圖中心的大頭針裁替,移動地圖并顯示位置

序言

在我們生活周圍的應(yīng)用中經(jīng)诚盥辏看到這樣的現(xiàn)象就是有一個固定的大頭針在地圖中心貌笨,然后移動地圖的時候弱判,地址會發(fā)生變化,例如我們平常用的應(yīng)用小黃車ofo锥惋,膜拜昌腰,小藍(lán)單車等,都是在地圖的中心固定一個大頭針膀跌,當(dāng)移動地圖的時候就刷新周邊的數(shù)據(jù)遭商。

思路

這其實(shí)不是一個真正的大頭針,其實(shí)是一個自定義的視圖捅伤。一個圖片添加到地圖中心劫流,然后在mapView拖動地圖的代理方法中,去翻解析根據(jù)定位坐標(biāo),進(jìn)行周邊搜索祠汇。

示例代碼

1、添加地圖
self.mapView = [[MAMapView alloc] initWithFrame:CGRectMake(20, 64 + 100, self.view.frame.size.width - 40, self.view.frame.size.height - 64 - 150)];
    self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.mapView.delegate = self;
    self.mapView.mapType = MAMapTypeStandard;
    // 禁止旋轉(zhuǎn)
    self.mapView.rotateEnabled = NO;
    // 禁止立體旋轉(zhuǎn)
    self.mapView.rotateCameraEnabled = NO;
    self.mapView.showsBuildings = NO;
    self.mapView.showsCompass = YES;
    self.mapView.showsUserLocation = YES;
    self.mapView.userTrackingMode = MAUserTrackingModeFollow;
    [self.view addSubview:self.mapView];

    // 初始化搜索
    self.searchAPI = [[AMapSearchAPI alloc] init];
    self.searchAPI.delegate = self;
#pragma mark--創(chuàng)建假的大頭針
- (void)creatPinView {
    self.pinView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 48, 48)];
    self.pinView.image = [UIImage imageNamed:@"mapimage"];
    self.pinView.center = CGPointMake((self.view.frame.size.width - 40) * 0.5, (self.view.frame.size.height - 64 - 150) * 0.5);
    self.pinView.hidden = NO;
    [self.mapView addSubview:self.pinView];
}
2、創(chuàng)建地址顯示標(biāo)簽
#pragma mark--creatPostionLabel
- (void)creatPostionLabel {
    self.positonLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 64 + 20, self.view.frame.size.width - 40, 60)];
    self.positonLabel.font = [UIFont systemFontOfSize:15];
    self.positonLabel.textColor = [UIColor cyanColor];
    self.positonLabel.backgroundColor = [UIColor grayColor];
    self.positonLabel.numberOfLines = 2;
    [self.view addSubview:self.positonLabel];
}
3浴捆、進(jìn)行單次逆地理定位查出當(dāng)前位置
-(void)configLocationManager {

self.locationManager = [[AMapLocationManager alloc] init];
[self.locationManager setDelegate:self];
//設(shè)置期望定位精度
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
//設(shè)置不允許系統(tǒng)暫停定位
[self.locationManager setPausesLocationUpdatesAutomatically:NO];
//設(shè)置允許在后臺定位
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
//設(shè)置定位超時時間
[self.locationManager setLocationTimeout:DefaultLocationTimeout];
//設(shè)置逆地理超時時間
[self.locationManager setReGeocodeTimeout:DefaultReGeocodeTimeout];
//設(shè)置開啟虛擬定位風(fēng)險監(jiān)測弟塞,可以根據(jù)需要開啟
[self.locationManager setDetectRiskOfFakeLocation:NO];

//進(jìn)行單次帶逆地理定位請求
[self.locationManager requestLocationWithReGeocode:YES completionBlock:self.completionBlock];
[self.mapView setZoomLevel:17.5];

}

4、顯示當(dāng)前的位置
#pragma mark - Initialization
- (void)initCompleteBlock {
    __weak ShowPostionViewController *weakSelf = self;
    self.completionBlock = ^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
        if (error != nil && error.code == AMapLocationErrorLocateFailed) {
            //定位錯誤:此時location和regeocode沒有返回值我抠,不進(jìn)行annotation的添加
            // 重新進(jìn)行,單次定位
            [weakSelf.locationManager requestLocationWithReGeocode:YES completionBlock:weakSelf.completionBlock];
            NSLog(@"定位錯誤:{%ld - %@};", (long)error.code, error.userInfo);
            return;
        } else if (error != nil
                 && (error.code == AMapLocationErrorReGeocodeFailed
                     || error.code == AMapLocationErrorTimeOut
                     || error.code == AMapLocationErrorCannotFindHost
                     || error.code == AMapLocationErrorBadURL
                     || error.code == AMapLocationErrorNotConnectedToInternet
                     || error.code == AMapLocationErrorCannotConnectToHost))
        {
            //逆地理錯誤:在帶逆地理的單次定位中苇本,逆地理過程可能發(fā)生錯誤,此時location有返回值菜拓,regeocode無返回值瓣窄,進(jìn)行annotation的添加
            NSLog(@"逆地理錯誤:{%ld - %@};", (long)error.code, error.userInfo);
            // 重新進(jìn)行,單次定位
            [weakSelf.locationManager requestLocationWithReGeocode:YES completionBlock:weakSelf.completionBlock];
            
        } else if (error != nil && error.code == AMapLocationErrorRiskOfFakeLocation) {
            //存在虛擬定位的風(fēng)險:此時location和regeocode沒有返回值,不進(jìn)行annotation的添加
            NSLog(@"存在虛擬定位的風(fēng)險:{%ld - %@};", (long)error.code, error.userInfo);
            
            return;
        } else {
            //沒有錯誤:location有返回值纳鼎,regeocode是否有返回值取決于是否進(jìn)行逆地理操作康栈,進(jìn)行annotation的添加
        }
        
        //有無逆地理信息,annotationView的標(biāo)題顯示的字段不一樣
        if (regeocode) {
            weakSelf.positonLabel.text = [NSString stringWithFormat:@"%@", regeocode.formattedAddress];
            weakSelf.location = location;
        } else {
        }
        
    };
    
}
5喷橙、在mapView被拖動時啥么,更新位置發(fā)起翻解析搜索請求
#pragma mark--移動地圖的時候點(diǎn)擊事件
- (void)mapView:(MAMapView *)mapView mapDidMoveByUser:(BOOL)wasUserAction {
    if (!wasUserAction) {
        return;
    }
    CGPoint center = CGPointMake(self.mapView.bounds.size.width * 0.5, self.mapView.bounds.size.height * 0.5);
    CLLocationCoordinate2D coor2d = [mapView convertPoint:center toCoordinateFromView:self.mapView];
    self.lastLocation = coor2d;
    // ReGEO解析
    AMapReGeocodeSearchRequest *request = [[AMapReGeocodeSearchRequest alloc] init];
    request.location = [AMapGeoPoint locationWithLatitude:coor2d.latitude longitude:coor2d.longitude];
    [self.searchAPI AMapReGoecodeSearch:request];
}
6、更新位置
- (void)onReGeocodeSearchDone:(AMapReGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response {
    NSString *address = response.regeocode.formattedAddress;
    self.positonLabel.text = address;
    // 定位結(jié)果
    NSLog(@"location:{lat:%f; lon:%f}", request.location.latitude, request.location.longitude);
    self.pinView.hidden = NO;
    [self.mapView setCenterCoordinate:self.lastLocation animated:YES];
}

案例demo如下:
https://github.com/Wululu6/MapKitDemo1.git
參考內(nèi)容:
http://www.reibang.com/p/0cd5260153c9
http://www.reibang.com/p/2ede1fc70fe2
查看地圖更多內(nèi)容請點(diǎn)擊以下鏈接:
定位

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贰逾,一起剝皮案震驚了整個濱河市悬荣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疙剑,老刑警劉巖氯迂,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異言缤,居然都是意外死亡嚼蚀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門管挟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轿曙,“玉大人,你說我怎么就攤上這事僻孝〉嫉郏” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵穿铆,是天一觀的道長您单。 經(jīng)常有香客問我,道長荞雏,這世上最難降的妖魔是什么虐秦? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任平酿,我火速辦了婚禮,結(jié)果婚禮上悦陋,老公的妹妹穿的比我還像新娘染服。我一直安慰自己,他們只是感情好叨恨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布柳刮。 她就那樣靜靜地躺著,像睡著了一般痒钝。 火紅的嫁衣襯著肌膚如雪秉颗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天送矩,我揣著相機(jī)與錄音蚕甥,去河邊找鬼。 笑死栋荸,一個胖子當(dāng)著我的面吹牛菇怀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晌块,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼爱沟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匆背?” 一聲冷哼從身側(cè)響起呼伸,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钝尸,沒想到半個月后括享,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡珍促,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年铃辖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猪叙。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡娇斩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沐悦,到底是詐尸還是另有隱情成洗,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布藏否,位于F島的核電站,受9級特大地震影響充包,放射性物質(zhì)發(fā)生泄漏副签。R本人自食惡果不足惜遥椿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淆储。 院中可真熱鬧冠场,春花似錦、人聲如沸本砰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽点额。三九已至舔株,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間还棱,已是汗流浹背载慈。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珍手,地道東北人办铡。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像琳要,于是被迫代替她去往敵國和親寡具。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345