• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - Google map 地址自动完成和地理编码 API 返回差异地址

[复制链接]
菜鸟教程小白 发表于 2022-12-12 14:21:31 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用谷歌地图的地方自动完成 API 来自动完成用户键入的地址,一旦我完成了所需地址的选择,将选定的地址字符串从谷歌地方自动完成地址传递到谷歌地图地理编码 api,以获取详细的组件,问题是有时,即使自动完成 API 返回的地址相同,geocode API 也不会返回街道号码,不确定哪里出错了,下面是我正在使用的代码和两个服务的输出

这就是我从地理编码服务中检索详细地址的方式

 NSString* address = [NSString stringWithFormat"http://maps.googleapis.com/maps/api/geocode/json?address=%@&sensor=false",completionText];
    NSString* str = [address stringByReplacingOccurrencesOfString","
                                                       withString""];
    str = [str stringByReplacingOccurrencesOfString" "
                                         withString"+"];


    NSURL *requestURL = [NSURL URLWithString:str];
    NSURLRequest *request = [NSURLRequest requestWithURLrequestURL)];

    //response
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSError *jsonParsingError = nil;
    NSDictionary *locationResults = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];

    NSLog(@"%@",locationResults);
    NSDictionary* results = [[locationResults objectForKey"results"] objectAtIndex:0];
    NSArray* address_components = [results objectForKey"address_components"];


    for (id addr in address_components) {
        NSString *long_name = [addr valueForKey"long_name"];
        NSString *short_name = [addr valueForKey"short_name"];
        NSString *types = [[addr valueForKey"types"] objectAtIndex:0];


        if ([types rangeOfString:@"street_number"].location != NSNotFound)
        {
            streetNum = long_name;
        }
        else if ([types rangeOfString:@"route"].location != NSNotFound)
        {
            streetName = long_name;
        }
        else if ([types rangeOfString:@"locality"].location != NSNotFound)
        {
            suburb = long_name;
        }
        else if ([types rangeOfString:@"administrative_area_level_1"].location != NSNotFound)
        {
            state = short_name;
        }
        else if ([types rangeOfString:@"country"].location != NSNotFound)
        {
            country = short_name;
        }
        else if ([types rangeOfString:@"postal_code"].location != NSNotFound)
        {
            postalCode = short_name;
        }

这是一个地址示例,其中地址具有街道号码,但地理编码点返回它

 {
         "description" : "740 Spring Lane, Wallacedale, Victoria, Australia",
         "id" : "ad2c41d2f934a30f4c5f8c4b336df8de988174d6",
         "matched_substrings" : [
            {
               "length" : 10,
               "offset" : 0
            },
            {
               "length" : 8,
               "offset" : 30
            },
            {
               "length" : 9,
               "offset" : 40
            }
         ],
         "place_id" : "EjE3NDAgU3ByaW5nIExhbmUsIFdhbGxhY2VkYWxlLCBWaWN0b3JpYSwgQXVzdHJhbGlh",
         "reference" : "CkQ1AAAASPpKC9JU4XQoFf3LUYwoF_hJFRpFt5VE67NhCPs8vV9ghXvVUeKgPm-BH-Owx-zvuhHEPhJU-Y2ReK5S49AdphIQiKpvir0TegpxEAjmmNJEJhoUCt7KXyZ6LoN51qT50Unrl5ceYMU",
         "terms" : [
            {
               "offset" : 0,
               "value" : "740 Spring Lane"
            },
            {
               "offset" : 17,
               "value" : "Wallacedale"
            },
            {
               "offset" : 30,
               "value" : "Victoria"
            },
            {
               "offset" : 40,
               "value" : "Australia"
            }
         ],
         "types" : [ "route", "geocode" ]
      }

以下是上述自动完成地址的 Google map 地理编码 API 的输出

{
    results =     (
                {
            "address_components" =             (
                                {
                    "long_name" = "Spring Lane";
                    "short_name" = "Spring Ln";
                    types =                     (
                        route
                    );
                },
                                {
                    "long_name" = Wallacedale;
                    "short_name" = Wallacedale;
                    types =                     (
                        locality,
                        political
                    );
                },
                                {
                    "long_name" = Victoria;
                    "short_name" = VIC;
                    types =                     (
                        "administrative_area_level_1",
                        political
                    );
                },
                                {
                    "long_name" = Australia;
                    "short_name" = AU;
                    types =                     (
                        country,
                        political
                    );
                },
                                {
                    "long_name" = 3303;
                    "short_name" = 3303;
                    types =                     (
                        "postal_code"
                    );
                }
            );
            "formatted_address" = "Spring Lane, Wallacedale VIC 3303, Australia";
            geometry =             {
                bounds =                 {
                    northeast =                     {
                        lat = "-37.9132082";
                        lng = "141.8506572";
                    };
                    southwest =                     {
                        lat = "-37.9283224";
                        lng = "141.8505337";
                    };
                };
                location =                 {
                    lat = "-37.9266631";
                    lng = "141.8506572";
                };
                "location_type" = "GEOMETRIC_CENTER";
                viewport =                 {
                    northeast =                     {
                        lat = "-37.9132082";
                        lng = "141.8519444302915";
                    };
                    southwest =                     {
                        lat = "-37.9283224";
                        lng = "141.8492464697085";
                    };
                };
            };
            "partial_match" = 1;
            "place_id" = "ChIJV74lHNPCzGoRnS8t_EDR8zk";
            types =             (
                route
            );
        }
    );
    status = OK;
}

输出没有组件类型“街道编号”,其中自动完成的地址字符串在开头就正确。许多地址都会发生这种情况,有什么问题吗?还是我需要使用其他服务? 具有门牌号的地址示例如下

这是由自动完成 API 返回的

{
         "description" : "11 Victoria Parade, Collingwood, Victoria, Australia",
         "id" : "dbeebdb81c8babd166ac8f89878e88c2cba333a1",
         "matched_substrings" : [
            {
               "length" : 18,
               "offset" : 0
            },
            {
               "length" : 9,
               "offset" : 43
            }
         ],
         "place_id" : "EjQxMSBWaWN0b3JpYSBQYXJhZGUsIENvbGxpbmd3b29kLCBWaWN0b3JpYSwgQXVzdHJhbGlh",
         "reference" : "CkQ4AAAATy4Z7xc3ermqeWnlxpl81pAVsBWOIl3S2JbCwwRxraLt39OJauWFnCR3NgGyruVBXfUo236mMe6CCQt5XRSYwRIQEL8JC7Qo8j3-0iD4AnJTtBoURjzgm8aHBa2g0tY4lkTKYTuVGPg",
         "terms" : [
            {
               "offset" : 0,
               "value" : "11 Victoria Parade"
            },
            {
               "offset" : 20,
               "value" : "Collingwood"
            },
            {
               "offset" : 33,
               "value" : "Victoria"
            },
            {
               "offset" : 43,
               "value" : "Australia"
            }
         ],
         "types" : [ "route", "geocode" ]
      }

以下是地理编码服务在发送自动完成地址作为输入后返回的结果

results =     (
                {
            "address_components" =             (
                                {
                    "long_name" = 11;
                    "short_name" = 11;
                    types =                     (
                        "street_number"
                    );
                },
                                {
                    "long_name" = "Victoria Parade";
                    "short_name" = "Victoria Parade";
                    types =                     (
                        route
                    );
                },
                                {
                    "long_name" = Collingwood;
                    "short_name" = Collingwood;
                    types =                     (
                        locality,
                        political
                    );
                },
                                {
                    "long_name" = Victoria;
                    "short_name" = VIC;
                    types =                     (
                        "administrative_area_level_1",
                        political
                    );
                },
                                {
                    "long_name" = Australia;
                    "short_name" = AU;
                    types =                     (
                        country,
                        political
                    );
                },
                                {
                    "long_name" = 3066;
                    "short_name" = 3066;
                    types =                     (
                        "postal_code"
                    );
                }
            );
            "formatted_address" = "11 Victoria Parade, Collingwood VIC 3066, Australia";
            geometry =             {
                bounds =                 {
                    northeast =                     {
                        lat = "-37.8087633";
                        lng = "144.9830508";
                    };
                    southwest =                     {
                        lat = "-37.8087778";
                        lng = "144.9830487";
                    };
                };
                location =                 {
                    lat = "-37.8087633";
                    lng = "144.9830508";
                };
                "location_type" = "RANGE_INTERPOLATED";
                viewport =                 {
                    northeast =                     {
                        lat = "-37.8074215697085";
                        lng = "144.9843987302915";
                    };
                    southwest =                     {
                        lat = "-37.8101195302915";
                        lng = "144.9817007697085";
                    };
                };
            };
            "place_id" = EjMxMSBWaWN0b3JpYSBQYXJhZGUsIENvbGxpbmd3b29kIFZJQyAzMDY2LCBBdXN0cmFsaWE;
            types =             (
                "street_address"
            );
        }
    );
    status = OK;
}

我们将不胜感激。



Best Answer-推荐答案


您在自动完成结果的描述中得到的只是一个字符串,仅此而已(不是一组特征,如街道、 zip 或门牌号)。服务尝试找到确切的位置(基于输入),但可能部分匹配。

当你例如在 http://maps.google.com 输入 740 Spring Lane, Wallacedale, Victoria, Australia您将获得 Spring Ln, Wallacedale VIC 3303,Australia

的结果

您也可以输入 12345 Spring Lane, Wallacedale, Victoria, Australia,您会得到相同的结果。

除此之外:我建议 request the place-details基于 place_id 。虽然它不能给你想要的结果(门牌号),但结果应该更准确(绑定(bind)到一个特定的地方而不是一个地方的地址)。它还会返回该地点的更多详细信息。

关于ios - Google map 地址自动完成和地理编码 API 返回差异地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28689241/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap