iOS 接入谷歌地图

前言

项目为国外服务,所以需要接入谷歌地图。第一次接入,简单总结下。

谷歌地图接入

同百度,高德地图,先去 谷歌开发者中心注册,拿到key,绑定应用的bundleId.

第一步:

通过pod 集成
pod 'GoogleMaps'


添加下面的key到plist中,添加定位相关私有信息配置。
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>googlechromes</string>
    <string>comgooglemaps</string>
</array>
//引入框架

@import GoogleMaps;

AppDelegate 里完成对SDK的注册,完成认证。(key如果异常,地图会加载不出来)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [GMSServices provideAPIKey:YOUR_API_KEY];
}

第二步:显示地图。

引入框架,#import <GoogleMaps/GoogleMaps.h>

谷歌地图的视图通过类GMSMapView来展示。
GMSMapView初始化方式:

+ (instancetype)mapWithFrame:(CGRect)frame camera:(GMSCameraPosition *)camera;

可以看到camera不能为空,camera可以理解为一个初始定位点,后面我们获得用户的位置之后,可以重新设置用户的位置为定位点。

地图的一些主要属性:

是否启用指南针

mapView.settings.compassButton = YES;

仅当启用了My Location 按钮时,My Location 按钮才会出现在屏幕的右下角。 当用户点击该按钮时,如果当前已知用户的位置,摄像头会以动画方式聚焦于用户的当前位置。

mapView.settings.myLocationButton = YES;

是否禁用平移和缩放手势

 mapView.settings.scrollGestures = NO;
  mapView.settings.zoomGestures = NO;

然后就是大头针,(谷歌地图成其为标记GMSMarker对象),要添加标记,请创建一个包含 position 和 title 的 GMSMarker 对象,并设置其 map,您可以通过将 marker.appearAnimation 属性设置为 kGMSMarkerAnimationPop,从而以动画呈现方式将新标记添加到地图中。

添加标记:

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10);
GMSMarker *marker = [GMSMarker markerWithPosition:position];
marker.title = @"Hello World";
marker.map = mapView;

删除标记(通过将 GMSMarkemap 属性设置为nil,您可以将标记从地图中移除。 或者,您也可以通过调用 GMSMapViewclear 方法移除目前地图上的所有叠层(包括标记)。)

marker.map = nil;

清除所有标记,叠层

[mapView clear]

标记(大头针的一些属性)
//更改大头针的图片

marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
marker.icon = [UIImage imageNamed:@"house"];

自定义大头针,使用iconView属性,iconView 不会响应用户交互,因为它只是一张视图快照

marker.iconView = [[UIImageView alloc] initWithImage:house];

添加信息窗口(也就是弹出气泡)

您可以在用户点按标记时,通过信息窗口向其显示信息。 一次只能显示一个信息窗口。 如果用户点按另一个标记,将隐藏当前窗口,并打开新的信息窗口。

信息窗口的内容由 title 和 snippet属性定义。 如果 titlesnippet 属性均为空白或 nil,点击该标记将不会显示信息窗口。

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:position];
london.title = @"London";
london.map = mapView;

使用 `snippet 属性,您可以添加其他文本,该文本将以较小的字体显示在标题下面。 超出信息窗口宽度的字符串将自动换成多行。 特别长的消息可能会被截断

将信息窗口设置为自动刷新

如果您希望信息窗口的新属性或内容在更改后立即显示,而不用等待信息窗口先隐藏更改然后再将其显示,请将标记的tracksInfoWindowChanges设为 YEStrue

marker.tracksInfoWindowChanges = YES;

更改信息窗口的位置

息窗口绘制时朝向设备屏幕的相反方向,在其关联标记的上方居中显示。 您可以通过设置 infoWindowAnchor 属性来更改信息窗口相对于标记的位置。 此属性可接受 CGPoint,它定义为(x,y) 偏移,其中 x 和 y 的范围都介于0.01.0之间。默认偏移为(0.5, 0.0),即顶部中心。

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:position];
london.title = @"London";
london.snippet = @"Population: 8,174,100";
london.infoWindowAnchor = CGPointMake(0.5, 0.5);
london.icon = [UIImage imageNamed:@"house"];
london.map = mapView;

至于如何定位,获取用户的位置,使用系统的CLLocationManager

-(CLLocationManager *)locationManager{
    if (!_locationManager) {
        _locationManager = [[CLLocationManager alloc]init];
        _locationManager.delegate = self;
        [_locationManager requestAlwaysAuthorization];//授权方式,如果在后台也需要定位,那就选择 requestAlwaysAuthorization。
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;//最精确的定位
        _locationManager.distanceFilter = kCLDistanceFilterNone; // 默认是kCLDistanceFilterNone,也可以设置其他值,表示用户移动的距离小于该范围内就不会接收到通知
       
    }
    return _locationManager;
}

遵守协议后,实现下面的代理方法:

- (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:6];

    self.mapView.camera = camera;//这句话很重要很重要,将我们获取到的经纬度转成影像并赋值给地图的camera属性
    [self.locationManager stopUpdatingLocation];//定位成功后停止定位
}

最后看一下<GMSMapViewDelegate> 几个常用协议参考,可以类比一下百度或者高德地图,基本大同小异。

//地图即将移动

- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture;

在特定坐标点击手势后调用,但仅在未点击标记时调用。

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate;

在点击标记后调用。

- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker;

在点击标记的信息窗口后调用。

- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker;

end

电脑,手机都需要翻墙。负责地图会加载不出来。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容