当前位置: 首页 > 面试题库 >

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

阴迪
2023-03-14
问题内容

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

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

我确实在这里找到了一些适用于Android的代码以及有关解码折线的Javascript

但是我找不到用于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)。


问题答案:

我希望与该问题相关的链接到我自己的博客文章的规则不违反规则,但是我过去已经解决了这个问题。来自链接帖子的独立答案:

@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


 类似资料:
  • 问题内容: 您能否告诉我如何传递如下所示的JSON字符串: 我这样尝试过: 提前致谢 最好的祝福 问题答案: 请注意,您的JSON数据具有以下结构: 顶级值是具有单个属性(称为“课程”)的对象(字典) “教训”属性是一个数组 “课程”数组中的每个元素都是一个具有几个属性的对象(包含课程的字典),其中包括“眩晕” 相应的代码是: 一些观察: 在中,参数是指向指针的指针。在这种情况下,通常使用代替。如

  • 问题内容: 首先,我发现了这一点:目标CHTML转义/转义,但对我不起作用。 我的编码字符(来自RSS feed,顺便说一句)如下所示: 我在网上搜索了所有内容,并找到了相关的讨论,但是没有解决我的特定编码问题,我认为它们被称为十六进制字符。 问题答案: 这些被称为字符实体引用。当采用它们的形式时,它们称为_数字实体引用_ 。基本上,它是应该替换的字节的字符串表示形式。在的情况下,它表示ISO-8

  • 问题内容: 我有一个类型为(com.vividsolutions.jts.geom.Geometry)的几何对象。它目前是经度,纬度形式,我想翻转坐标,使其经度为纬度,这样我就可以将其以GeoJSON格式用于mongodb。 我看到的约束是:a)我想翻转坐标的输入是Geometry对象。b)几何对象将是多边形类型或多多边形。c)我想在将类型强制转换为Polygon / multipolygon之前

  • 问题内容: 我有一个类型为(com.vividsolutions.jts.geom.Geometry)的几何对象。它目前是经度,纬度形式,我想翻转坐标,使其经度为纬度,这样我就可以将其以GeoJSON格式用于mongodb。 我看到的约束是:a)我想翻转坐标的输入是Geometry对象。b)几何对象将是多边形类型或多多边形。c)我想在将类型强制转换为Polygon / multipolygon之前

  • 问题内容: 我有一个包含两个纬度和经度字段的视图,并且我想创建一个新视图,将这些纬度/经度字段转换为几何/地理字段(不确定哪个最适合ArcGIS)。原始视图中的字段是双重类型,我希望在新视图中将它们转换为空间类型。 目前,我不确定如何将这些字段转换为空间类型。关于Stack Overflow的所有其他类似问题都从来没有给我提供一个可行的解决方案,因此,对于这个问题似乎是重复的,我深表歉意,但希望有

  • 问题内容: 给定纬度和经度,我们如何使用Javascript或Python将其转换为街道地址? 问题答案: 大多数人在99%的时间内将您链接到Google Maps的API。不错的答案。但是- 注意禁止用途,使用限制和使用条款!尽管许多分布式应用程序并未违反使用限制,但对于Web应用程序而言却是相当有限的。TOS不允许您将皮肤上的数据重新用于Google应用程序中。您不希望因Google发出的终止