3

iPhone のマップのビュー コントローラーに Google マップを埋め込んでいます。以下を使用してマップを作成できます。

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 ファイルをロードする方法はありますか?

4

3 に答える 3

4

この質問が1年以上前のものであることは知っていますが、解決策が見つからなかったので、私の解決策が役立つことを願っています.

iOS-KML-Frameworkを使用して、KML を GMSMapView に読み込むことができます。KML ビューアーを使用していたプロジェクトからこのコードを移植しました。

指定された 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];
    });

}

最後のメソッドの最後で、マップに追加されたすべてのマーカーに合わせてカメラ ビューを更新しています。不要な場合は、この部分を削除できます。

于 2015-02-13T20:38:15.233 に答える
0

KML は SDK ではまだサポートされていません。イシュー トラッカーに機能リクエストを提出してください。

于 2013-06-28T10:09:50.727 に答える