亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

詳解iOS集成GoogleMap(定位、搜索)

2020-07-26 02:30:42
字體:
來源:轉載
供稿:網友

簡介:

最近花了些時間看了GoogleMap官方文件并集成到國際版app中,網上關于GoogleMap for iOS的講解相對Android來說少一點,比較有幫助的幾乎全是英文文檔。下面是我開發過程中遇到的坑、以及采用的解決方法。

集成GoogleMap步驟:

  1. 1、Cocoapods導入pod 'GoogleMaps'
  2. 2、獲取API密匙(前提是已經在GoogleMapSDK中創建好自己的應用)
  3. 3、配置plist文件搭建定位環境
  4. 4、調用代理方法實現需求

tips:pod 'GoogleMaps'、pod 'GooglePlaces'、pod 'GooglePlacePicker'這三個框架。(GoogleMaps:顯示基本的定位功能;GooglePlaces:實現搜索功能,官方文檔叫做地點自動完成;GooglePlacePicker:是實現獲取某個POI的的詳細信息,比如名字、詳細地址、路線等)

景點(POI)包括公園、學校和政府大樓,等等。 另外,如果地圖類型為 kGMSTypeNormal,商家景點默認將顯示在地圖上。 商家景點表示商店、餐館和酒店之類的商家。

按照 Google Places API 中的定義,一個 POI 對應于一個地點。 例如,休閑公園為景點,但噴泉之類的地點通常不屬于景點(除非它們具有國家或歷史意義)。

配置plist文件:

打開plist的代碼源文件,輸入:

定位:

一、在AppDelegate 頭文件 導入框架

#import

二、向您的 application:didFinishLaunchingWithOptions: 方法添加以下內容,使用我們剛才獲取到的 API 密鑰替代 YOUR_API_KEY:

[GMSServices provideAPIKey:@"YOUR_API_KEY"];

tips:這一步是在啟動app的時候,GoogleMap準備代理工作。

三、在我們需要顯示地圖的控制器調用API方法

@property (nonatomic,strong) CLLocationManager *locationManager;//地圖定位對象@property (nonatomic,strong) GMSMapView *mapView;//地圖@property (nonatomic,strong) GMSMarker *marker;//大頭針@property (nonatomic,strong) GMSPlacesClient * placesClient;//可以獲取某個地方的信息//注冊的代理@interface TestMapViewController ()

tips:這是在控制器.h文件聲明的屬性。

(一)初始化一個地圖對象

GMSMapView:是控制地圖的外觀類

GMSCameraPosition:是控制地圖要顯示的內容類

GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-23.12960481 longitude:113.30887721            zoom:Level]; self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; self.mapView.delegate = self; //注冊代理屬性 self.mapView.settings.compassButton = YES;//顯示指南針 [self.view addSubview:self.mapView];

tips:上面的經緯度可以隨便傳一個,之后會獲取到新的經緯度并更新位置

(二)初始化一個定位管理者對象

if (self.locationManager == nil) {  self.locationManager = [[CLLocationManager alloc]init]; } self.locationManager.delegate = self; [self.locationManager requestAlwaysAuthorization];//授權方式,如果在后臺也需要定位,那就選擇 requestAlwaysAuthorization。 self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;//最精確的定位 self.locationManager.distanceFilter = kCLDistanceFilterNone; // 默認是kCLDistanceFilterNone,也可以設置其他值,表示用戶移動的距離小于該范圍內就不會接收到通知 [self.locationManager startUpdatingLocation];

tips:CLLocationManager 是負責獲取用戶行為的類,列如獲取用戶當前位置信息。更多詳細信息請閱覽CLLocationManager。里面講解CLLocationManager的一些應用場景并有代碼實例。

運行app:這時候我們會看到并沒有實景地圖出來,原因是:前面提到的GMSCameraPosition類,我們并沒有在定位成功之后將定位內容賦它。

GMSCameraPosition類,它是負責顯示定位內容的。很重要!

(三)在定位成功的API代理方法中,獲取經緯度并轉成影像賦值

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ CLLocation *curLocation = [locations lastObject]; // 通過location 或得到當前位置的經緯度 CLLocationCoordinate2D curCoordinate2D = curLocation.coordinate; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:curCoordinate2D.latitude longitude:curCoordinate2D.longitude zoom:Level]; CLLocationCoordinate2D position2D = CLLocationCoordinate2DMake(curLocation.coordinate.latitude, curLocation.coordinate.longitude); self.mapView.camera = camera;//這句話很重要很重要,將我們獲取到的經緯度轉成影像并賦值給地圖的camera屬性 [self.locationManager stopUpdatingLocation];//定位成功后停止定位}

tips:locationManager: didUpdateLocations: 代理方法是GoogleMap 中實現定位成功后回調的代理方法,你可以在這里獲取到經緯度。

運行app:這時候地圖就出來了

添加大頭針

GMSMarker類是負責顯示大頭針,默認是紅色,你可以自定義大頭針,用圖片或者改變顏色,具體看官方文檔GMSMarker。

 self.marker = [GMSMarker markerWithPosition:position2D]; self.marker.map = self.mapView;

tips:position2D是在定位成功之后轉換得到的CLLocationCoordinate2D屬性經緯度值。

小坑提示:這時候有可能會出現,定位成功之后出現多個大頭針。原因是:進行定位的時候,map獲取多個預測位置,從而產生生成多個大頭針的現象。解決辦法:在每次生成大頭針之前先清除之前的那個,只生成最精準的最后一個。

[self.marker.map clear]; self.marker.map = nil;

反編碼(經緯度轉成具體位置):

 CLGeocoder *geocoder = [[CLGeocoder alloc]init]; //反地理編碼 [geocoder reverseGeocodeLocation:curLocation completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullable error) {     if (error) {  }else{       CLPlacemark *placemark = [placemarks objectAtIndex:0];//第一個位置是最精確的    //賦值詳細地址    DLog(@"placemark---路號name:%@-市locality:%@-區subLocality:%@-省administrativeArea:%@-路thoroughfare:%@",placemark.name,placemark.locality,placemark.subLocality,placemark.administrativeArea,placemark.thoroughfare);     }];

這時候就已經可以獲取到具體的國家、省、市、區、街道了。

補充:反編碼是獲取不到POI位置的(我獲取不到)。這時候可以使用

self.placesClient = [GMSPlacesClient sharedClient];//獲取某個地點的具體信息 [self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {  if (error != nil) {   DLog(@"Current Place error %@", [error localizedDescription]);   return;  }   //  for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods) {//   GMSPlace* place = likelihood.place;//   NSLog(@"Current Place name %@ at likelihood %g", place.name, likelihood.likelihood);//   NSLog(@"Current Place address %@", place.formattedAddress);//   NSLog(@"Current Place attributions %@", place.attributions);//   NSLog(@"Current PlaceID %@", place.placeID);//  }   //這里就可以獲取到POI的名字了   //這里做一些你想做的事    }];

點擊地圖并移動大頭針

這里是用到GMSMapViewDelegate的代理回調

回調1:這里是點擊地圖上的某個點API返回的代理方法,在這個代理方法,你可以獲取經緯度去反編譯地址

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate{ //點擊一次先清除上一次的大頭針 [self.marker.map clear]; self.marker.map = nil; // 通過location 或得到當前位置的經緯度 GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:coordinate.latitude longitude:coordinate.longitude zoom:Level]; CLLocationCoordinate2D position2D = CLLocationCoordinate2DMake(coordinate.latitude,coordinate.longitude); self.mapView.camera = camera; //大頭針 self.marker = [GMSMarker markerWithPosition:position2D]; self.marker.map = self.mapView; CLLocation *curLocation = [[CLLocation alloc]initWithLatitude:coordinate.latitude longitude:coordinate.longitude];   CLGeocoder *geocoder = [[CLGeocoder alloc]init]; //反地理編碼 [geocoder reverseGeocodeLocation:curLocation completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullable error) {     if (error) {       DLog(@"error.description:%@",error.description);      }else{       CLPlacemark *placemark = [placemarks objectAtIndex:0];       //賦值詳細地址   DLog(@"placemark---路號name:%@-市locality:%@-區subLocality:%@-省administrativeArea:%@-路thoroughfare:%@",placemark.name,placemark.locality,placemark.subLocality,placemark.administrativeArea,placemark.thoroughfare);  }]; }

回調2:這里也是點擊地圖上的某個點API返回的代理方法

- (void)mapView:(GMSMapView *)mapViewdidTapPOIWithPlaceID:(NSString *)placeID   name:(NSString *)name  location:(CLLocationCoordinate2D)location{}

tips:值得注意的,兩者的區別是:第二個點擊代理方法是當你點擊POI的時候才會回調,會返回place的name、ID、經緯度;第一個代理方法是只要點擊地圖任意一個位置就會回調,只會返回經緯度。也就是:每一次的點擊,只會執行其中一個代理方法。

搜索:

搜索功能在官方文檔是叫做“自動完成”,即你輸入一部分的文本,GoogleMap會根據你的文本預測出地點并自動填充返回,具體請看官方文檔自動完成

效果如圖:

這里你需要做的步驟跟做“定位”的一樣:

(1)獲取APIKEY

(2) 在application:didFinishLaunchingWithOptions: 注冊密匙

1[GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];

(3) 創建搜索UI并調用代理方法獲取API自動填充的結果數組集

小坑提示: GMSPlacesClient跟GMSServices的密匙是不一樣的,密匙不對的話,會出現反復調用

viewController:didFailAutocompleteWithError:的現象。

tips:搭建搜索UI又幾種方式:1)搜索框直接創建在導航欄 2)搜索欄創建在視圖頂部 3)自定義。根據你的需求用代碼~

(一)這里是第一種方式(搜索框直接創建在導航欄):

GMSAutocompleteViewController *acController = [[GMSAutocompleteViewController alloc] init]; acController.delegate = self; [self presentViewController:acController animated:YES completion:nil];

tips:這里就可以直接往搜索框編輯文字,API會直接給你返回搜索結果集合

(二)調用API代理方法:

// Handle the user's selection. 這是用戶選擇搜索中的某個地址后返回的結果回調方法- (void)viewController:(GMSAutocompleteViewController *)viewControllerdidAutocompleteWithPlace:(GMSPlace *)place {   [self dismissViewControllerAnimated:YES completion:nil]; [self.marker.map clear]; self.marker.map = nil; // 通過location 或得到當前位置的經緯度 GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:place.coordinate.latitude longitude:place.coordinate.longitude zoom:Level]; CLLocationCoordinate2D position2D = CLLocationCoordinate2DMake(place.coordinate.latitude,place.coordinate.longitude); self.marker = [GMSMarker markerWithPosition:position2D]; self.mapView.camera = camera; self.marker.map = self.mapView;   self.locationLabel.text = place.name; self.locationDetailLabel.text = place.formattedAddress;  }

tips:這個代理方法實現的是,當用戶在搜索集中選擇了在某一個結果返回地圖,并定位添加大頭針。

自動填充失敗的回調:

- (void)viewController:(GMSAutocompleteViewController *)viewControllerdidFailAutocompleteWithError:(NSError *)error { [self dismissViewControllerAnimated:YES completion:nil]; // TODO: handle the error. DLog(@"Error: %@", [error description]);}

tips:自動填充失敗后你可以在這里做一些事,默認是不管的。

補充:搜索欄的外觀是可以自定義的,你可以設置成跟自己的app一樣的風格~具體請看設置 UI 控件樣式屬性

到這里,搜索功能就算完成了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲最大福利视频网站| 在线精品国产欧美| 欧美激情高清视频| 69**夜色精品国产69乱| 亚洲va欧美va国产综合久久| 国产亚洲精品久久久优势| 中日韩美女免费视频网站在线观看| 亚洲欧美日本另类| 伊人亚洲福利一区二区三区| 日本一欧美一欧美一亚洲视频| 国产精品欧美风情| 国产成人精品午夜| 亚洲天堂视频在线观看| 欧美壮男野外gaytube| 久久精品亚洲热| 亚洲精品suv精品一区二区| 国产精品免费看久久久香蕉| 国产精品人成电影| 亚洲最大福利网| 欧美有码在线观看视频| 欧美最顶级的aⅴ艳星| 欧美日韩人人澡狠狠躁视频| 日本精品久久中文字幕佐佐木| 欧美专区在线播放| 欧美另类极品videosbestfree| 欧美黄网免费在线观看| 日韩高清电影好看的电视剧电影| www.xxxx精品| 久久91超碰青草是什么| 国产a∨精品一区二区三区不卡| 亚洲第一精品久久忘忧草社区| 欧美成人在线网站| 欧美电影免费看| 国产亚洲欧美一区| 亚洲欧美视频在线| 欧美色视频日本高清在线观看| 亚洲国产天堂久久国产91| 97热在线精品视频在线观看| 成人天堂噜噜噜| 97在线视频免费看| 欧美在线一级视频| 久久精品国产v日韩v亚洲| 亚洲精品动漫久久久久| 8090成年在线看片午夜| 欧美一级电影免费在线观看| 庆余年2免费日韩剧观看大牛| 国产精品视频精品| 精品久久久久久亚洲国产300| 国产精品高潮视频| 成人免费网站在线观看| 欧美电影在线免费观看网站| 俺去啦;欧美日韩| 伦伦影院午夜日韩欧美限制| 亚洲影影院av| 日本免费久久高清视频| 欧美黑人极品猛少妇色xxxxx| 国产香蕉97碰碰久久人人| 26uuu亚洲国产精品| 精品国产乱码久久久久久婷婷| 日韩欧美在线网址| 日韩精品在线电影| 国产精品久久久久久久久免费看| 91国内揄拍国内精品对白| 亚洲a∨日韩av高清在线观看| 少妇高潮久久久久久潘金莲| 亚洲精品国产综合区久久久久久久| 日韩电影在线观看永久视频免费网站| 91色视频在线导航| 国产免费亚洲高清| 日韩中文字幕免费视频| 欧美一性一乱一交一视频| 夜夜躁日日躁狠狠久久88av| 免费91麻豆精品国产自产在线观看| 91精品国产91久久久久| 国产精品444| 久久99国产精品久久久久久久久| 亚洲午夜色婷婷在线| 亚洲最大av网| 国产一区二区动漫| 国产精品视频地址| 日韩欧美亚洲国产一区| 国产欧美一区二区三区在线看| 91精品久久久久久久久久久久久久| 中文字幕在线观看日韩| 亚洲欧美在线x视频| 久久久日本电影| 一道本无吗dⅴd在线播放一区| 国产午夜精品免费一区二区三区| 欧美极品少妇xxxxⅹ裸体艺术| 日韩美女免费视频| 亚洲免费小视频| 日韩av在线网页| 欧美性高跟鞋xxxxhd| 日本午夜精品理论片a级appf发布| 欧美有码在线观看| 国产精品扒开腿做爽爽爽的视频| 尤物精品国产第一福利三区| 日韩欧美精品中文字幕| 久久亚洲春色中文字幕| 毛片精品免费在线观看| 亚洲精品中文字幕有码专区| 日韩免费中文字幕| 91在线国产电影| 日韩在线播放一区| 97视频在线看| 欧美日韩国产999| 亚洲国产精品人人爽夜夜爽| 色综合久久久久久中文网| 97av视频在线| 亚洲欧美另类国产| 欧美超级免费视 在线| 91色精品视频在线| 91免费的视频在线播放| 夜夜嗨av一区二区三区四区| 亚洲一区第一页| 欧美激情国产精品| 亚洲视频在线免费观看| 国产精品成人一区二区三区吃奶| 亚洲欧美三级在线| 日韩黄色av网站| 欧美与黑人午夜性猛交久久久| 国产精品第一第二| 精品动漫一区二区三区| 亚洲成人激情视频| 日韩一级黄色av| 日产日韩在线亚洲欧美| 日本免费在线精品| 欧美极品欧美精品欧美视频| 国产成人在线亚洲欧美| 亚洲人永久免费| 日韩有码片在线观看| 欧美日韩在线视频一区| 亚洲aa中文字幕| 成人妇女免费播放久久久| 日韩成人网免费视频| 国产精品最新在线观看| 欧美成人午夜影院| 欧美黑人一级爽快片淫片高清| 最近2019好看的中文字幕免费| 日韩在线观看免费全集电视剧网站| 精品国产一区二区三区久久久狼| 欧美亚洲视频在线观看| 中文字幕欧美日韩| 国产精品嫩草影院久久久| 欧美有码在线视频| 91社影院在线观看| 性欧美在线看片a免费观看| 久久久久久av| 日韩欧美aⅴ综合网站发布| 久久91精品国产| 国产欧美一区二区三区久久人妖| 欧美理论在线观看| 国产精品成人品| 亚洲欧美中文字幕在线一区| www.久久久久久.com| 亚洲www在线观看| 国产午夜精品一区二区三区| 亚洲国产又黄又爽女人高潮的| 亚洲欧美一区二区三区情侣bbw| 精品激情国产视频| 91久久久久久久一区二区| 在线电影av不卡网址| 精品福利免费观看| 亚洲精品电影在线观看|