地圖3級(jí)顯示城市區(qū)域崇猫,商圈,和具體標(biāo)注需忿,選擇地鐵線路查看地鐵沿線標(biāo)注

前言
我們的APP是做房地產(chǎn)類诅炉,所以用戶有在地圖中根據(jù)區(qū)域,不同商圈屋厘,地鐵線路站牌來查看樓盤的需求涕烧。我們的功能就是在用戶進(jìn)入地圖頁時(shí)按區(qū)域顯示新樓盤或者二手房數(shù)量,用戶根據(jù)需要點(diǎn)擊區(qū)域進(jìn)入二級(jí)商圈顯示商圈內(nèi)樓盤數(shù)量汗洒,用戶點(diǎn)擊某個(gè)商圈進(jìn)入該商圈內(nèi)的樓盤位置視圖澈魄,樓盤標(biāo)注顯示樓盤信息,價(jià)格信息仲翎,點(diǎn)擊樓盤標(biāo)簽進(jìn)入詳情頁痹扇,功能效果可參考房天下的地圖模式。
地鐵模式:用戶選擇地鐵線或者站點(diǎn)溯香,在地圖上顯示地鐵線路標(biāo)注鲫构,站點(diǎn)標(biāo)注。點(diǎn)擊某個(gè)站點(diǎn)顯示附近樓盤標(biāo)注信息玫坛。

52E19613DD831D0961CD1BCBF73442F0.png

![Uploading 33C948F3F2B44F1084ED64A77BA8A4CE_098266.png . . .]


77A19972045653C1B7F2A9C49D980FFE.png
33C948F3F2B44F1084ED64A77BA8A4CE.png
AE5B8A54B4AD60A3A0FAEB1815B85DC9.png
6543E08D6CBAEAE5F86F5995F45B8C60.png

功能實(shí)現(xiàn)

1结笨、準(zhǔn)備
地圖:我們的APP是基于百度地圖的
后臺(tái):需要分別返回區(qū)域,商圈湿镀,樓盤的接口炕吸。

2、實(shí)現(xiàn)
創(chuàng)建自定義的annotationview繼承于BMKAnnotationView
創(chuàng)建好對(duì)應(yīng)的model勉痴,存儲(chǔ)后臺(tái)返回的數(shù)據(jù)
剛進(jìn)入地鐵時(shí)默認(rèn)加載區(qū)域的標(biāo)注赫模。
//添加區(qū)域標(biāo)注

-(void)addAreaAnnotation{
    
    [_mapView removeAnnotations:self.mapViewAnnotations];
    
    NSMutableArray *annotations= [NSMutableArray new];
    for (AreaModel *model in self.areaArray) {
        
        AreaAnnotation *areaAnnotation = [AreaAnnotation new];
        areaAnnotation.coordinate = model.location;
        areaAnnotation.areaModel = model;
        [annotations addObject:areaAnnotation];
    }
    
    self.mapViewAnnotations = [annotations copy];
    [_mapView addAnnotations:self.mapViewAnnotations];
}

實(shí)現(xiàn)百度地圖的代理方法
// 根據(jù)anntation生成對(duì)應(yīng)的View

- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation{
//普通annotation
    if ([annotation isKindOfClass:[AreaAnnotation class]]) {
        
        static NSString *AreaAnnotationViewID = @"AreaAnnotationViewID";
        AreaAnnotationView *annotationView = (AreaAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AreaAnnotationViewID];
        if (annotationView == nil) {
            annotationView = [[AreaAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AreaAnnotationViewID];
            annotationView.delegate = self;
        }
        annotationView.titleLabel.text = ((AreaAnnotation *)annotation).areaModel.areaName;
        annotationView.subTitleLabel.text = ((AreaAnnotation *)annotation).areaModel.houseNums;
        return annotationView;
        
    }
}

區(qū)域的標(biāo)注AreaAnnotationView 自定義視圖繼承于BMKAnnotationView
這樣區(qū)域的標(biāo)注就已經(jīng)加載完成。
下面實(shí)現(xiàn)點(diǎn)擊區(qū)域加載商圈的功能:
這里在區(qū)域標(biāo)注的點(diǎn)擊代理里實(shí)現(xiàn)

- (void)didSelectAreaAnnotationView:(UIView *)view{
    
    //當(dāng)當(dāng)前的選擇點(diǎn)移到最前
    UIView *tapDetectingView = view.superview;
    [tapDetectingView bringSubviewToFront:view];
    
    if([view isKindOfClass:[AreaAnnotationView class]]){
        
        if (_isNewhouse) {
            //統(tǒng)計(jì)
            [MobClick event:@"searchNewHouseOnMap_bubble_arecaClickEvent"];
        }else {
            //統(tǒng)計(jì)
            [MobClick event:@"searchNewHouseOnMap_bubble_houseClickEvent"];
        }
        
        AreaAnnotationView *areaAnnotationView = (AreaAnnotationView *)view;
        AreaAnnotation *annotation= (AreaAnnotation *)areaAnnotationView.annotation;
        
        [_mapView setMapStatus:[BMKMapStatus statusWithCenterCoordinate:annotation.coordinate zoomLevel:15] withAnimation:YES];
        
        [self.searchMenuForHouseView setCurrentSelectLocationModel:annotation.areaModel];
        
    }
}

這里沒有做網(wǎng)絡(luò)請(qǐng)求的方法蒸矛,因?yàn)楸幌旅孢@個(gè)方法中替代了瀑罗,這個(gè)下面說

    [_mapView setMapStatus:[BMKMapStatus statusWithCenterCoordinate:annotation.coordinate zoomLevel:15] withAnimation:YES];

商圈的加載和區(qū)域是一樣的胸嘴,這里就不再贅述了

這是mapView的代理方法,當(dāng)mapView的zoomLevel改變或者mapView的region發(fā)生改變是會(huì)調(diào)用斩祭,我們的加載數(shù)據(jù)請(qǐng)求是放在這里做的劣像,不同的地圖zoomlevel顯示不同標(biāo)注:
一般區(qū)域的標(biāo)注在地圖上顯示縮放水平為12、13級(jí)
商圈的標(biāo)注在地圖上顯示縮放水平為14摧玫、15級(jí)
樓盤耳奕,學(xué)校在地圖上顯示縮放水平為17級(jí)
據(jù)此我們可以根據(jù)不同的縮放水平來進(jìn)行不同的網(wǎng)絡(luò)請(qǐng)求
-(void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
 
    if (mapView.zoomLevel <= 13 && !_inModalStatus ){
        
        if(self.areaArray.count>0){
            
            [self addAreaAnnotation];
        }else {
            [self loadAreaAnnotation];
        }
        
    }else if (mapView.zoomLevel >13 && mapView.zoomLevel <17 && !_inModalStatus){
        
        self.areaArray = nil;
        [self loadTradingAnnotationWith:mapView.region.center fromMenuChoosed:animated];
        
    }else if (mapView.zoomLevel >= 17){
        
        self.areaArray = nil;
        [self loadVillageAnnotationWith:mapView.region.center fromMenuChoosed:animated];
        
    }else {
        
        if (!animated){
            
            [self resetArea:@"地圖位置"];
        }
        [self.mapView removeAnnotations:self.mapViewAnnotations];
    }
}

這里我們?cè)賮碚f下這個(gè)方法

[_mapView setMapStatus:[BMKMapStatus statusWithCenterCoordinate:annotation.coordinate zoomLevel:15] withAnimation:YES];

進(jìn)到這個(gè)方法的定義內(nèi):
/**

  • 設(shè)置地圖狀態(tài)
  • @param [in] mapStatus 地圖狀態(tài)信息
  • @param [in] bAnimation 是否需要?jiǎng)赢嬓Ч瑃rue:需要做動(dòng)畫
    */
    這是百度地圖提供的方法
    我們需要做的是計(jì)算BMKMapStatus诬像;這個(gè)類包含這些屬性:
///縮放級(jí)別:[3~19]
@property (nonatomic, assign) float fLevel;
///旋轉(zhuǎn)角度
@property (nonatomic, assign) float fRotation;
///俯視角度:[-45~0]
@property (nonatomic, assign) float fOverlooking;
///屏幕中心點(diǎn)坐標(biāo):在屏幕內(nèi)吮铭,超過無效
@property (nonatomic) CGPoint targetScreenPt;
///地理中心點(diǎn)坐標(biāo):經(jīng)緯度
@property (nonatomic) CLLocationCoordinate2D targetGeoPt;
///當(dāng)前地圖范圍,采用直角坐標(biāo)系表示颅停,向右向下增長(zhǎng)
@property (nonatomic, assign, readonly) BMKMapRect visibleMapRect;

這里我們需要的就是縮放級(jí)別和地理中心點(diǎn)坐標(biāo):經(jīng)緯度
我們這里對(duì)做了一個(gè)類別并提供這個(gè)方法來計(jì)算這2個(gè)屬性

+ (BMKMapStatus *)statusWithCenterCoordinate:(CLLocationCoordinate2D )centerCoordinate
                                   zoomLevel:(NSUInteger)zoomLevel;

這樣就可以當(dāng)?shù)貓D位置和縮放發(fā)生改變時(shí)被獲取到谓晌,去執(zhí)行代理方法。

這樣地圖3級(jí)顯示區(qū)域癞揉、商業(yè)纸肉、樓盤的功能就實(shí)現(xiàn)了。
下面再簡(jiǎn)單說下在地圖上畫地鐵的方法:

//畫地鐵
-(void)addSubWayAnnotationAndDrawSubWayLine{
    
    [_mapView removeAnnotations:self.modalAnimations];
    
    NSArray* arrayForOverlays = [NSArray arrayWithArray:_mapView.overlays];
    [_mapView removeOverlays:arrayForOverlays];
    
    CLLocationCoordinate2D *coords =  malloc([self.subWayArray count] * sizeof(CLLocationCoordinate2D));
    
    NSMutableArray *annotations= [NSMutableArray new];
    
    for (int i = 0; i<self.subWayArray.count; i++) {
        SubWayStationModel *model = self.subWayArray[i];
        
        SubWayStationAnnotation *station = [SubWayStationAnnotation new];
        station.subWayStationModel = model;
        station.coordinate = model.location;
        [annotations addObject:station];
        //point
        coords[i] = model.location;
    }
    
    self.modalAnimations = [annotations copy];
    [_mapView addAnnotations:self.modalAnimations];
    
    //構(gòu)建BMKPolyline
    BMKPolyline* polyline = [BMKPolyline polylineWithCoordinates:coords count:self.subWayArray.count];
    
    //添加分段紋理繪制折線覆蓋物
    [self.mapView addOverlay:polyline];
    
    //設(shè)置地圖位置
    [self mapViewFitPolyLine];
}

//根據(jù)地鐵點(diǎn)設(shè)置地圖位置
- (void)mapViewFitPolyLine{
    
    CLLocationCoordinate2D center;
    
    if (self.searchModel.stationCoordinate.latitude>0) {
        center = self.searchModel.stationCoordinate;
    }else {
        
        if (self.subWayArray.count>0) {
            NSInteger index = self.subWayArray.count/2;
            SubWayStationModel *model = self.subWayArray[index];
            center = model.location;
        }
    }
    
    [_mapView setMapStatus:[BMKMapStatus statusWithCenterCoordinate:center zoomLevel:15] withAnimation:YES];
    
}

- (BMKOverlayView*)mapView:(BMKMapView *)map viewForOverlay:(id<BMKOverlay>)overlay{
    if ([overlay isKindOfClass:[BMKPolyline class]]) {
        BMKPolylineView* polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
        polylineView.lineWidth = 4.0;
        polylineView.fillColor = [UIColor colorWithHex:0xfb3534];
        polylineView.strokeColor = [UIColor colorWithHex:0xfb3534];
        return polylineView;
    }
    return nil;
}

就是簡(jiǎn)單的拿數(shù)據(jù)顯示喊熟,并沒有什么需要說的柏肪。地鐵站的標(biāo)注跟區(qū)域商圈一樣顯示。
感覺說的比較亂芥牌,如果有朋友做這方面的可以留言或者加我QQ聊烦味。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市壁拉,隨后出現(xiàn)的幾起案子谬俄,更是在濱河造成了極大的恐慌,老刑警劉巖弃理,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溃论,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痘昌,警方通過查閱死者的電腦和手機(jī)钥勋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辆苔,“玉大人算灸,你說我怎么就攤上這事∽て。” “怎么了菲驴?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)街佑。 經(jīng)常有香客問我谢翎,道長(zhǎng),這世上最難降的妖魔是什么沐旨? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任森逮,我火速辦了婚禮,結(jié)果婚禮上磁携,老公的妹妹穿的比我還像新娘褒侧。我一直安慰自己,他們只是感情好谊迄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布闷供。 她就那樣靜靜地躺著,像睡著了一般统诺。 火紅的嫁衣襯著肌膚如雪歪脏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天粮呢,我揣著相機(jī)與錄音婿失,去河邊找鬼。 笑死啄寡,一個(gè)胖子當(dāng)著我的面吹牛豪硅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挺物,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼懒浮,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了识藤?” 一聲冷哼從身側(cè)響起砚著,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痴昧,沒想到半個(gè)月后赖草,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剪个,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年秧骑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扣囊。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乎折,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侵歇,到底是詐尸還是另有隱情骂澄,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布惕虑,位于F島的核電站坟冲,受9級(jí)特大地震影響磨镶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜健提,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一琳猫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧私痹,春花似錦脐嫂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至暗膜,卻和暖如春匀奏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背学搜。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工攒射, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恒水。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓会放,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親钉凌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咧最,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容