UIKit & graphicsHistorical technical note
Google Maps on iOS: markers and route playback
Records a Google Maps integration intended to make map presentation consistent across iOS and Android. It includes the main code for map initialisation, markers and route lines, along with the setup entry point for obtaining a maps API key.
Originally credited to Bison. Content is retained as published.
On this page
“iOS development is like moving things around; once you become skilled enough, you can start taking shortcuts.” Bison
The project I recently worked on needed its maps to match the Android client, which used Google Map rather than Baidu Maps.
To be honest, it was a bit troublesome. Before working alongside an Android client, I usually used Apple's built-in maps, Amap, or Baidu.
I had hardly worked with Google Maps before. The main code is below.
.h file
@property (strong, nonatomic) GMSMapView *_mapView;
.m file
// Create the map
- (void)creatMap{
_mapView = [[GMSMapView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view addSubview:_mapView];
[_mapView clear];
[self initMapView];
}It consists of the following three parts.
- (void)initMapView
{
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-6.13631
longitude:106.789352
zoom:ZOOM_LEVEL];
_mapView.mapType = kGMSTypeNormal;
_mapView.camera = camera;
_mapView.delegate = self;
_geocoder = [[GMSGeocoder alloc] init];
polyline = [[GMSPolyline alloc] init];
linepath = [GMSMutablePath path];
CLLocationCoordinate2D coords;
coords.latitude = -6.136271;
coords.longitude = 106.789216;
_mapView.camera = [GMSCameraPosition cameraWithTarget:coords
zoom:ZOOM_LEVEL];
//显示标注
GMSReverseGeocodeCallback handler = ^(GMSReverseGeocodeResponse *response,
NSError *error) {
if (response && response.firstResult) {
GMSMarker *marker = [[GMSMarker alloc] init];
marker.position = coords;
marker.title = response.firstResult.addressLine1;
marker.snippet = response.firstResult.addressLine2;
_addressData = response.firstResult.addressLine2;
[self refreshGpsInfo];
marker.appearAnimation = kGMSMarkerAnimationNone;
marker.icon = SETIMAGE(@"deviceannotation.png");
marker.map = _mapView;
} else {
NSLog(@"Could not reverse geocode point (%f,%f): %@",
coords.latitude, coords.longitude, error);
}
};
[_geocoder reverseGeocodeCoordinate:coords
completionHandler:handler];
//画线,轨迹回放
[linepath removeAllCoordinates];
[self drawLineWithLocationArray:trackArray];
/*
注,trackArray里面的数据格式
CLLocation *nowLocation = [[CLLocation alloc] initWithLatitude:coords.latitude longitude:coords.longitude];
[trackArray addObject:nowLocation];
*/
}// Draw a line for route playback
- (void)drawLineWithLocationArray:(NSArray *)locationArray
{
if(current_type == _CURRENT_TRACK)
polyline.strokeColor = [UIColor blueColor];
else
polyline.strokeColor = [UIColor redColor];
polyline.strokeWidth = 6.f;
// for(int idx = 0; idx < pointStrings.count; idx++)
for(int idx = 0; idx < locationArray.count; idx++)
{
CLLocation *location = [locationArray objectAtIndex:idx];
CLLocationDegrees latitude = location.coordinate.latitude;
CLLocationDegrees longitude = location.coordinate.longitude;
// create our coordinate and add it to the correct spot in the array
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
[linepath addCoordinate:coordinate];
}
polyline.path = linepath;
polyline.map = _mapView;
}For the Google Api, register on Google's developer website and enter the relevant information about your own app to obtain an apikey.