如何使用 iOS API 将 KML 文件 URL 加载到 Google 地图中?

2023-11-30

我将 Google 地图嵌入到 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 文件?


我知道这个问题已经存在一年多了,但我找不到任何解决方案,所以我希望我的解决方案有用。

您可以使用以下命令将 KML 加载到 GMSMapView 中iOS-KML-框架。我已经从正在使用的项目中移植了这段代码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];
    });

}

在最后一个方法的最后,我们是更新相机视图以适合添加到地图中的所有标记。如果不需要,您可以删除该部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 iOS API 将 KML 文件 URL 加载到 Google 地图中? 的相关文章

随机推荐

  • 如何在 Prolog 中将谓词作为另一个谓词的参数传递?

    我有这 3 个谓词 times X Y Result is X Y minus X Y Result is X Y plus X Y Result is X Y 例如我想通过times 2 2 in the plus X Y 像这样plus
  • JVM 是开源代码吗?

    JVM 是开源代码吗 如果没有 如何获取JVM的代码 这完全取决于您使用哪个 JVM 如果您使用 OpenJDK JVM 那么您可以从以下位置获取源代码here or here来自 OpenJDK 项目列表 或者here来自 GitHub
  • 无法连接到SQL Server 2008?

    我一直在尝试各种技巧 从启用 TCP IP 向防火墙添加例外到戳比尔盖茨巫毒娃娃 但似乎没有什么对我有用 通过management studio连接到sql server 2008真的那么难吗 也许 抢劫银行会更容易 当我弄清楚要抢劫哪家银
  • RSA 加密的结果是否保证是随机的

    我使用 RSACryptoServiceProvider 来加密一些小数据块 对于我正在研究的解决方案 重要的是 如果使用相同的公钥对同一段源数据加密两次 则结果 加密的数据块 不相同 我已经用一个例子对此进行了检查 它的效果正如我所希望的
  • 获取发件人电子邮件地址

    我有以下 VBA 代码 用于在收到特定主题时自动发送电子邮件 Private WithEvents Items As Outlook Items Private Sub Application Startup Dim objNS As Ou
  • 我们如何按类指定 jQuery 验证插件的规则?

    The jQuery 验证插件效果很好并且非常容易使用 selector validate 只需设置 CSS 类 如 必需的电子邮件 就会显示默认消息 但是 我需要自定义消息 该文档说您可以使用元素的键值对及其相应的消息来指定规则 sele
  • 如何在 Pygame 中使用 Sprite Collide

    我正在制作一个非常简单的游戏 小鸟 玩家 必须躲避岩石 如果它被岩石击中 你就会失败 我正在尝试使用 pygame sprite collide rect 来判断它们是否接触 但我似乎不知道如何正确使用它 这是我的代码 import pyg
  • Android - 创建进度对话框

    我是安卓开发新手 我想开发一个dialog with a progressbar在我的应用程序中 当我点击搜索按钮时dialog应与出现progressbar 显示在切换到另一个之前进度正在进行中activity 请用示例代码建议我 Use
  • 使用 Visual Studio 2008 编译 php 扩展,MODULE ID 与 php 不匹配

    使用 VC9 2008 和 VC10 2010 编译我自己的 php 扩展后 使用以下步骤 http blog slickedit com 2007 09 creating a php 5 extension with visual c 2
  • 使用低级键盘钩子更改键盘字符

    我正在创建自定义键盘布局 作为开始步骤 我想让用户按下一个键 让我的键盘钩子拦截它 并输出我选择的不同键 我找到了这个键盘挂钩代码 我试图根据我的目的对其进行稍微修改 http blogs msdn com toub archive 200
  • 在进程中断期间使用 python ctypes 时高延迟背后的原因

    在调查 Python 代码库中的关键路径时 我们发现 ctypes 在延迟方面的行为是相当不可预测的 我们的应用程序的更多背景 我们有很多进程 每个进程都通过共享内存进行通信 我们利用 python 库multiprocessing Raw
  • iPhone 如何通过无线或蓝牙访问另一台非 iPhone 设备?

    我试图弄清楚 iPhone 是否可以通过无线或蓝牙连接到另一台非 iPhone 设备 但发现了相互矛盾的信息 我发现的大部分内容都是在 SDK 3 0 版本发布之前发现的 当时这肯定是不可能的 查看堆栈溢出问题 例如iPhone 3 0 S
  • 将 HTTP 请求重定向到 HTTPS 的推荐方法

    我对如何将所有 http 页面重定向到 https 有一些疑问 我看到有人告诉我们要像这样重写reply 阿帕奇说要做this way 任何人都可以向我解释进行此更改的推荐方法是什么 将 http 重定向到 https 的唯一安全方法是使用
  • 如何调和独立的 head 和 origin/master?已经检查了旧的哈希值

    介绍和搜索 所以我认为我犯了一个严重的错误 我很担心 我已经解析了论坛中的独立负责人 我已经接近找到答案 但场景太具体 不适用于我所在的地方 如果您找到可以回答我的问题的特定主题 请链接我 例如 如何使分离的 HEAD 与 master o
  • 如何在knitr R代码块中间插入markdown?

    例如 我想在以下代码块中的两个图之间插入一个中断 而不将其分解 r plot 1 100 1 100 plot 1 100 1 100 这样的结果是这样的 r plot 1 100 1 100 br r plot 1 100 1 100 I
  • switch(enum) 后“缺少返回语句” - 为什么?

    编译器声称末尾缺少 return 语句MyClass parse 这是代码 package de hs rm safelyovertaken ble import android support annotation NonNull imp
  • 如何使用 SA_OAuthTwitterEngine 在没有 PIN 的情况下从 iPhone 发布推文?

    我正在开发一个 iPhone 应用程序 它将推文发送到 Twitter 为此 我使用 SA OAuthTwitterEngine MGTwitterEngine 类 我将应用程序注册到 www twitter com apps 并传递消费者
  • 注意:尝试获取非对象的属性

    我正在学习一些 PHP 它应该打印 0 但是我收到错误 注意 尝试获取非对象的属性 JSON 字符串外部的括号使其成为数组内部的对象 您可以通过指定所需的数组成员来访问该对象 obj 0 gt qty 或者更改您的 json 字符串 以便它
  • 基于 REST API 令牌的身份验证

    我正在开发一个需要身份验证的 REST API 由于身份验证本身是通过 HTTP 上的外部 Web 服务进行的 因此我推断我们将分配令牌以避免重复调用身份验证服务 这让我想到了我的第一个问题 这真的比要求客户端在每个请求上使用 HTTP 基
  • 如何使用 iOS API 将 KML 文件 URL 加载到 Google 地图中?

    我将 Google 地图嵌入到 iPhone 地图的视图控制器中 我可以使用以下方法创建我的地图 GMSCameraPosition camera GMSCameraPosition cameraWithLatitude 39 93 lon