我已将谷歌地图嵌入到iPhone上的地图中的视图控制器中。我可以使用以下方式创建我的地图:
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:39.93
longitude:-75.17
zoom:12];
mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera];
// use GPS to determine location of self
mapView_.myLocationEnabled = YES;
mapView_.settings.myLocationButton = YES;
mapView_.settings.compassButton = YES;
现在,我想添加一个显示路径的kml文件(来自URL)。我想在GMSMapView中有一些东西允许它作为一个层或其他东西,但我没有运气。我见过KMS教程,但是使用了其他一些套件,MK。无论如何,我有没有办法使用Google Maps for iOS API加载KML文件?
答案 0 :(得分:3)
我知道这个问题超过1年但我找不到任何解决方案,所以我希望我的解决方案有用。
您可以使用iOS-KML-Framework将KML加载到GMSMapView中。我已使用KML-Viewer
的项目移植了此代码添加从给定URL解析KML的方法,确保将正确的应用程序包传递给dispatch_queue_create():
- (void)loadKMLAtURL:(NSURL *)url
{
dispatch_queue_t loadKmlQueue = dispatch_queue_create("com.example.app.kmlqueue", NULL);
dispatch_async(loadKmlQueue, ^{
KMLRoot *newKml = [KMLParser parseKMLAtURL:url];
[self performSelectorOnMainThread:@selector(kmlLoaded:) withObject:newKml waitUntilDone:YES];
});
}
处理KML解析结果或错误:
- (void)kmlLoaded:(id)sender {
self.navigationController.view.userInteractionEnabled = NO;
__kml = sender;
// remove KML format error observer
[[NSNotificationCenter defaultCenter] removeObserver:self name:kKMLInvalidKMLFormatNotification object:nil];
if (__kml) {
__geometries = __kml.geometries;
dispatch_async(dispatch_get_main_queue(), ^{
self.navigationController.view.userInteractionEnabled = YES;
[self reloadMapView];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
self.navigationController.view.userInteractionEnabled = YES;
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", nil)
message:NSLocalizedString(@"Failed to read the KML file", nil)
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil];
[alertView show];
});
}
}
从KML中查看几何项目,并将它们作为标记添加到GMSMapView:
- (void)reloadMapView
{
NSMutableArray *annotations = [NSMutableArray array];
for (KMLAbstractGeometry *geometry in __geometries) {
MKShape *mkShape = [geometry mapkitShape];
if (mkShape) {
if ([mkShape isKindOfClass:[MKPointAnnotation class]]) {
MKPointAnnotation *annotation = (MKPointAnnotation*)mkShape;
GMSMarker *marker = [[GMSMarker alloc] init];
marker.position = annotation.coordinate;
marker.appearAnimation = kGMSMarkerAnimationPop;
marker.icon = [UIImage imageNamed:@"marker"];
marker.title = annotation.title;
marker.userData = [NSString stringWithFormat:@"%@", geometry.placemark.descriptionValue];
marker.map = self.mapView;
[annotations addObject:annotation];
}
}
}
// set bounds in next run loop.
dispatch_async(dispatch_get_main_queue(), ^{
GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] init];
for (id <MKAnnotation> annotation in annotations)
{
bounds = [bounds includingCoordinate:annotation.coordinate];
}
GMSCameraUpdate *update = [GMSCameraUpdate fitBounds:bounds];
[self.mapView moveCamera:update];
[self.mapView animateToViewingAngle:50];
});
}
在最后一个方法的最后,我们updating the camera view以适应添加到地图中的所有标记。如果不需要,您可以删除此部分。
答案 1 :(得分:0)
SDK尚不支持KML。请在issue tracker中提交功能请求。
答案 2 :(得分:0)
这是我使用提到的iOS-KML-Framework解决类似问题的方法。
#import <GoogleMaps/GoogleMaps.h>
#import "KML.h"
@property (weak, nonatomic) IBOutlet GMSMapView *mapView;
- (void)loadZonesFromURL:(NSURL *)url {
KMLRoot* kml = [KMLParser parseKMLAtURL: url];
for (KMLPlacemark *placemark in kml.placemarks) {
GMSMutablePath *rect = [GMSMutablePath path];
if ([placemark.geometry isKindOfClass:[KMLPolygon class]]) {
KMLLinearRing *ring = [(KMLPolygon *)placemark.geometry outerBoundaryIs];
for (KMLCoordinate *coordinate in ring.coordinates) {
[rect addCoordinate:CLLocationCoordinate2DMake(coordinate.latitude, coordinate.longitude)];
}
GMSPolygon *polygon = [GMSPolygon polygonWithPath:rect];
polygon.fillColor = [UIColor colorWithRed:67.0/255.0 green:172.0/255.0 blue:52.0/255.0 alpha:0.3];
polygon.map = self.mapView;
}
}
}