如何将 Google Directions API 折线字段解码为 Objective-C for iPhone 中的经纬度点?

2024-02-05

我想在地图上绘制与我通过 Google Directions API 获取的方向 JSON 相对应的路线:https://developers.google.com/maps/documentation/directions/start https://developers.google.com/maps/documentation/directions/start

我已经弄清楚如何从步骤字段中提取纬度和经度,但这并不能很好地遵循弯曲的道路。我认为我需要的是解码折线信息,我找到了谷歌关于如何编码折线的说明:https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/utilities/polylinealgorithm

我确实在这里找到了一些 Android 代码以及解码折线的 Javascript,例如:

使用 google Directions API 的地图视图绘制方向 - 解码折线 https://stackoverflow.com/questions/6708408/map-view-draw-directions-using-google-directions-api-decoding-polylines

android 获取并解析Google Directions https://stackoverflow.com/questions/2964982/android-get-and-parse-google-directions

但我找不到相同的 Objective-C iPhone 代码,有人可以帮我吗?我确信如果有必要的话我可以自己做,但如果它已经在某个地方可用,它肯定会节省我一些时间。

编辑:这里的关键是能够逐个字符地解码 Base64 编码。更具体地说,我从 Google 得到了类似 JSON 的内容,它是使用 base64 编码等进行编码的:

...   "overview_polyline" : {
        "points" : "ydelDz~vpN_@NO@QEKWIYIIO?YCS@WFGBEBICCAE?G@y@RKBEBEBAD?HTpB@LALALCNEJEFSP_@LyDv@aB\\GBMB"
       },
...

注意:我应该提到这个问题是指 Google Maps API v1,在 v2 中使用 GMSPolyLine polyLineWithPath 来做到这一点要容易得多,下面的许多答案都会告诉你(感谢 @cdescours)。


我希望链接到我自己的链接不违反规则博客文章 http://objc.id.au/post/9245961184/mapkit-encoded-polylines如果它与问题相关,但我过去已经解决过这个问题。来自链接帖子的独立答案:

@implementation MKPolyline (MKPolyline_EncodedString)

+ (MKPolyline *)polylineWithEncodedString:(NSString *)encodedString {
    const char *bytes = [encodedString UTF8String];
    NSUInteger length = [encodedString lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
    NSUInteger idx = 0;

    NSUInteger count = length / 4;
    CLLocationCoordinate2D *coords = calloc(count, sizeof(CLLocationCoordinate2D));
    NSUInteger coordIdx = 0;

    float latitude = 0;
    float longitude = 0;
    while (idx < length) {
        char byte = 0;
        int res = 0;
        char shift = 0;

        do {
            byte = bytes[idx++] - 63;
            res |= (byte & 0x1F) << shift;
            shift += 5;
        } while (byte >= 0x20);

        float deltaLat = ((res & 1) ? ~(res >> 1) : (res >> 1));
        latitude += deltaLat;

        shift = 0;
        res = 0;

        do {
            byte = bytes[idx++] - 0x3F;
            res |= (byte & 0x1F) << shift;
            shift += 5;
        } while (byte >= 0x20);

        float deltaLon = ((res & 1) ? ~(res >> 1) : (res >> 1));
        longitude += deltaLon;

        float finalLat = latitude * 1E-5;
        float finalLon = longitude * 1E-5;

        CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(finalLat, finalLon);
        coords[coordIdx++] = coord;

        if (coordIdx == count) {
            NSUInteger newCount = count + 10;
            coords = realloc(coords, newCount * sizeof(CLLocationCoordinate2D));
            count = newCount;
        }
    }

    MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coords count:coordIdx];
    free(coords);

    return polyline;
}

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

如何将 Google Directions API 折线字段解码为 Objective-C for iPhone 中的经纬度点? 的相关文章

随机推荐

  • “selectedFilters”不是有效的关键字参数

    我使用 PyQt5 当我尝试保存文件名时出现错误 csv file list QtWidgets QFileDialog getOpenFileName self Open file csv fileName csv file list f
  • 防止 AngularJs 使用 jQuery 库

    Question 如何防止 AngularJs 使用 jQuery 背景 我正在 AngularJs 中开发一个独立的应用程序 可以 插入 到现有的客户端网站中 这些客户端网站可能已经使用 jQuery 如果您使用过 AngularJs 您
  • 程序在发生任何事情之前就在调试器中崩溃了

    我正在使用 MinGW 工具链构建一个适用于 Windows XP 的应用程序 它有时会意外崩溃 因此 我尝试使用调试器 Gdb 但程序在发生任何事情之前都会以代码 03 退出 事实上 我从GDB看到的只是 新线程3184 0x7b8 新线
  • @SpringBootTest 导致“未找到给定包含的测试”

    我有简单的单元测试 它启动我的应用程序并测试某些服务是否已实例化 有点像健全性检查 但是 这些测试并未在我的完整测试套件中运行 当单独运行时 我收到错误No tests found for given includes com exampl
  • 如何忽略 new Date() 上的时区?

    我有一个名为的 JavaScript 函数updateLatestDate接收作为参数的对象数组 数组中对象的属性之一是MeasureDate日期类型的属性 功能updateLatestDate返回数组中存在的最新日期 这是函数 funct
  • spring boot/batch 通过代码禁用批量自动启动

    我正在编写一个 Spring Batch 应用程序 其中包含需要按特定顺序执行的不同作业 为了做到这一点 我通过 JobLauncher 手动运行作业 并通过在属性文件中添加以下属性来禁用 Spring 批处理提供的自动启动功能 sprin
  • Spring的未来-XD [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我听到有传言称 Spring XD 失去了开发动力 并且 Spring 转向云服务 由于我正在考虑 XD 我考虑的另一个是 Apache B
  • executeScript 未定义或不是 ManifestV3 扩展中的函数

    为什么 Chrome 的这个功能不起作用 我正在尝试这个例子 https developer chrome com docs extensions mv3 content scripts programmatic https develop
  • 将资源添加到 JAR

    我想将资源文件 图像 文本文件 包含在 JAR 中 我将资产文件夹添加到类路径中 因此当我在 netBeans 中运行我的程序时 它可以正常工作 但是如果我构建项目 我会收到错误 Not copying library C Users Fl
  • 如何将 Access-Control-Allow-Origin 添加到 jetty 服务器

    我有一个码头服务器来运行我的网络服务 最近 我开发了一个使用 Web 服务的程序 并遇到了 Access Control Allow Origin 问题 如何将 Access Control Allow Origin 添加到 jetty 嵌
  • 如何通过位置和分隔符提取字符串的子字符串

    我们如何从字符串中分割子字符串 就像我有绳子一样 String mainString Trade Time Trade Number Amount Rs 现在我有其他字符串 String subString Amount 然后我想提取子字符
  • 使用烧瓶中的数据参数重定向

    我试图学习 Flask 并遇到了以下问题 这是我试图实现的示例 app route poll methods GET POST def poll form PollForm if form validate on submit return
  • 如何将 EditText 输入限制为数字(可能是十进制和带符号)输入?

    我读过了Android 将 EditText 限制为数字 https stackoverflow com questions 5200689 android limiting edittext to numbers and 如何在 andr
  • tftp put 的 inotify 事件 IN_MODIFY 发生两次

    我正在使用 inotify 来监听对文件的修改 当我测试文件修改时 程序运行正常 echo test gt tftpboot TEST Output Read 16 data IN MODIFY 但是当我执行 tftp put 时 会生成两
  • CSS 中的“$”是什么意思?

    我看到一个动画项目 里面有一堆 我不知道美元符号在 CSS 中的用途 我猜这是为了动画 这是我正在查看的一些代码的示例 emoji base color FFDA6A emoji like color 548DFF emoji like b
  • 使用 javascript canvas 调整图像大小(平滑)

    我正在尝试用画布调整一些图像的大小 但我不知道如何平滑它们 在 Photoshop 浏览器等上 他们使用一些算法 例如双三次 双线性 但我不知道这些算法是否内置在画布中 这是我的小提琴 http jsfiddle net EWupT htt
  • python 中的多个构造函数

    如何将以下两个类合并为一个类 Rectangle 以便可以通过 rect Rectangle side a side b 或 rect Rectangle side a area 创建 Rectangle 对象 class Rectangl
  • 使用 iText 将外部图像添加到 PDF

    我无法弄清楚如何使用 iText 将外部图像 由 URL 引用 添加到 PDF 这种事情可能吗 7 1 5 中的 PDF 规范表示您应该能够使用 URL 规范通过 URL 引用 PDF 这是我到目前为止所得到的 PdfFileSpecifi
  • codeigniter 发生数据库错误

    有人能帮我吗 我是一个初学者 试图进行佩戴 CodeIgniter 身份验证 但是当我尝试犯这样的错误时 数据库发生错误 Error Number 1046 未选择数据库 SELECT FROM user WHERE user userna
  • 如何将 Google Directions API 折线字段解码为 Objective-C for iPhone 中的经纬度点?

    我想在地图上绘制与我通过 Google Directions API 获取的方向 JSON 相对应的路线 https developers google com maps documentation directions start htt