久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

iOS集成GoogleMap的示例分析-創新互聯

這篇文章主要介紹了iOS集成GoogleMap的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創新互聯提供網站制作、網站設計、網頁設計,品牌網站設計廣告投放平臺等致力于企業網站建設與公司網站制作,10年的網站開發和建站經驗,助力企業信息化建設,成功案例突破近千家,是您實現網站建設的好選擇.

簡介:

最近花了些時間看了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的代碼源文件,輸入:

iOS集成GoogleMap的示例分析

定位:

一、在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:這時候地圖就出來了

iOS集成GoogleMap的示例分析

添加大頭針

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 *)mapView
didTapPOIWithPlaceID:(NSString *)placeID
   name:(NSString *)name
  location:(CLLocationCoordinate2D)location{
}

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

搜索:

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

效果如圖:

iOS集成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 *)viewController
didAutocompleteWithPlace:(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 *)viewController
didFailAutocompleteWithError:(NSError *)error {
 [self dismissViewControllerAnimated:YES completion:nil];
 // TODO: handle the error.
 DLog(@"Error: %@", [error description]);
}

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

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“iOS集成GoogleMap的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創新互聯建站,關注創新互聯網站建設公司行業資訊頻道,更多相關知識等著你來學習!

另外有需要云服務器可以了解下創新互聯建站www.js-pz168.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網站題目:iOS集成GoogleMap的示例分析-創新互聯
當前路徑:http://www.js-pz168.com/article12/idogc.html

成都網站建設公司_創新互聯,為您提供網站制作網頁設計公司云服務器品牌網站建設網站建設手機網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都app開發公司
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
久久久人人爽| 91精品国产综合久久久蜜臀粉嫩 | 国产精品久久久久天堂| 夜夜嗨av一区二区三区四季av | 亚洲欧美日韩一区二区三区在线观看| 午夜欧美大尺度福利影院在线看| 国产精品一卡二| 久久99久久99精品蜜柚传媒| 91国偷自产一区二区开放时间 | αv一区二区三区| 综合久久国产| 久久久www成人免费无遮挡大片| 亚洲国产一区二区a毛片| 国产激情精品久久久第一区二区| 国产一区二区无遮挡| 色视频成人在线观看免| 久久久久亚洲综合| 亚洲成在线观看| 不卡欧美aaaaa| 亚洲图片欧洲图片日韩av| 精品国产第一区二区三区观看体验| 一区二区三区中文字幕电影 | 999在线免费观看视频| 正在播放91九色| 久久午夜老司机| 日韩精品免费专区| 97超级碰碰| 在线观看网站黄不卡| 国产精品青草久久| 激情图片小说一区| 欧美黑人3p| 欧美成人女星排行榜| 亚洲国产成人av网| 91蜜桃婷婷狠狠久久综合9色| 色婷婷综合视频在线观看| 日本一区二区三区免费乱视频| 男女视频一区二区| 久久99久久精品国产| 日韩欧美美女一区二区三区| 亚洲成人久久影院| 91蜜桃视频在线| 欧美三级电影在线观看| 亚洲另类在线一区| jizz一区二区| 欧美性淫爽ww久久久久无| 中文字幕亚洲区| 高清日韩电视剧大全免费| 亚洲精品一卡二卡三卡四卡| 国产日韩欧美精品在线| 国产一区二区剧情av在线| 天天综合狠狠精品| 亚洲国产精品成人综合色在线婷婷| 国产一区二区免费视频| 亚洲三级一区| 日韩理论片网站| 97久久超碰国产精品电影| 欧美视频一区二| 亚洲国产中文字幕| 国产在线精品二区| 欧美v日韩v国产v| 久久se精品一区二区| 神马一区二区影院| 1024成人网色www| 91亚洲精华国产精华精华液| 51精品国自产在线| 免费在线观看视频一区| 日本在线成人一区二区| 欧美国产亚洲另类动漫| 成人av动漫在线| 777久久久精品| 日韩av电影一区| 日韩精品在在线一区二区中文| 中文字幕中文字幕一区| 91麻豆国产福利在线观看| 欧美一区二视频| 狠狠色丁香婷婷综合| 色综合久久久久网| 亚洲图片欧美色图| 欧美极品一区二区| 国产精品青草综合久久久久99| 成人av资源在线| 欧美一级欧美三级| 国产一区二区免费看| 欧美吞精做爰啪啪高潮| 日本系列欧美系列| 亚洲激情一区二区| 亚洲午夜一二三区视频| 免费日韩av电影| 亚洲天堂av老司机| 狠狠久久综合婷婷不卡| 欧美高清在线一区二区| 91在线精品一区二区三区| 欧美成人官网二区| 成人精品免费看| 日韩欧美在线综合网| 国产精品白丝av| 欧美一区二区播放| 福利91精品一区二区三区| 欧美一区日韩一区| 国产精品一区免费视频| 69堂精品视频| 国产mv日韩mv欧美| 欧美一级生活片| 成人爽a毛片一区二区免费| 日韩一级片在线观看| 成人三级在线视频| 精品美女被调教视频大全网站| 床上的激情91.| 精品国产免费一区二区三区香蕉| 中文字幕一区日韩精品欧美| 国产高清一区视频| 国产精品久久久久久久久免费桃花 | 亚洲国产精华液网站w| 91在线国产福利| 日本一区二区三区高清不卡| 粉嫩高清一区二区三区精品视频| 国产亚洲1区2区3区| www.久久艹| 亚洲图片另类小说| 欧美在线日韩精品| 婷婷开心久久网| 在线观看91视频| 国模冰冰炮一区二区| 91精品国产aⅴ一区二区| 成人一道本在线| 久久久不卡网国产精品一区| 国产精品视频在线免费观看 | 水蜜桃久久夜色精品一区的特点 | 欧美精品123| 午夜国产不卡在线观看视频| 色婷婷av久久久久久久| 国产在线精品一区二区夜色 | 一区二区三视频| 日本不卡一区二区三区高清视频| 欧美日韩一区二区三区在线 | 国产一区二区三区奇米久涩| 伊人开心综合网| 色婷婷国产精品久久包臀| 国内成人免费视频| 欧美mv和日韩mv的网站| 国产精品久久波多野结衣| 亚洲女人****多毛耸耸8| 亚洲自拍三区| 56国语精品自产拍在线观看| av在线播放一区二区三区| 中文字幕精品—区二区四季| 欧美自拍资源在线| 蜜臀va亚洲va欧美va天堂| 91精品国模一区二区三区| 91毛片在线观看| 夜夜嗨av一区二区三区网页 | 久久成人免费电影| 欧美videos大乳护士334| 国产视频精品网| 天天操天天色综合| 91精品国产乱码久久蜜臀| 97se视频在线观看| 亚洲中国最大av网站| 欧美日韩一级片网站| 91网上在线视频| 亚洲午夜一区二区| 777xxx欧美| 国产精品免费一区二区三区四区 | 在线观看网站黄不卡| av电影天堂一区二区在线| 亚洲欧洲精品天堂一级 | 欧美aaaaaa午夜精品| 精品入口麻豆88视频| 久久99精品久久久久久青青日本| 日本午夜精品视频在线观看| 精品国产三级电影在线观看| 欧美一级二级三级| 国产资源精品在线观看| 亚洲国产高清在线| 色噜噜狠狠一区二区三区果冻| www.成人在线| 亚洲亚洲人成综合网络| 欧美一级日韩一级| 欧美xxxx黑人又粗又长密月| 久久99精品网久久| 国产精品免费视频网站| 91极品美女在线| 97夜夜澡人人双人人人喊| 天天操天天干天天综合网| 精品日韩一区二区三区| 日韩精品资源| 暴力调教一区二区三区| 亚洲国产日日夜夜| 欧美成人a∨高清免费观看| 欧美日本韩国一区二区三区| 国产精品自拍网站| 亚洲另类春色国产| 欧美一级免费观看| 日韩欧美亚洲在线| 成人av网站在线| 石原莉奈一区二区三区在线观看| 2024国产精品视频| 在线观看日韩精品| 激情视频一区二区| 国产高清精品久久久久|