菜鸟教程小白 发表于 2022-12-12 14:21:31

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


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

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

<pre><code> NSString* address = ;
    NSString* str = [address stringByReplacingOccurrencesOfString:@&#34;,&#34;
                                                       withString:@&#34;&#34;];
    str = [str stringByReplacingOccurrencesOfString:@&#34; &#34;
                                       withString:@&#34;+&#34;];


    NSURL *requestURL = ;
    NSURLRequest *request = ;

    //response
    NSData *response = ;
    NSError *jsonParsingError = nil;
    NSDictionary *locationResults = ;

    NSLog(@&#34;%@&#34;,locationResults);
    NSDictionary* results = [ objectAtIndex:0];
    NSArray* address_components = ;


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


      if (.location != NSNotFound)
      {
            streetNum = long_name;
      }
      else if (.location != NSNotFound)
      {
            streetName = long_name;
      }
      else if (.location != NSNotFound)
      {
            suburb = long_name;
      }
      else if (.location != NSNotFound)
      {
            state = short_name;
      }
      else if (.location != NSNotFound)
      {
            country = short_name;
      }
      else if (.location != NSNotFound)
      {
            postalCode = short_name;
      }
</code></pre>

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

<pre><code> {
         &#34;description&#34; : &#34;740 Spring Lane, Wallacedale, Victoria, Australia&#34;,
         &#34;id&#34; : &#34;ad2c41d2f934a30f4c5f8c4b336df8de988174d6&#34;,
         &#34;matched_substrings&#34; : [
            {
               &#34;length&#34; : 10,
               &#34;offset&#34; : 0
            },
            {
               &#34;length&#34; : 8,
               &#34;offset&#34; : 30
            },
            {
               &#34;length&#34; : 9,
               &#34;offset&#34; : 40
            }
         ],
         &#34;place_id&#34; : &#34;EjE3NDAgU3ByaW5nIExhbmUsIFdhbGxhY2VkYWxlLCBWaWN0b3JpYSwgQXVzdHJhbGlh&#34;,
         &#34;reference&#34; : &#34;CkQ1AAAASPpKC9JU4XQoFf3LUYwoF_hJFRpFt5VE67NhCPs8vV9ghXvVUeKgPm-BH-Owx-zvuhHEPhJU-Y2ReK5S49AdphIQiKpvir0TegpxEAjmmNJEJhoUCt7KXyZ6LoN51qT50Unrl5ceYMU&#34;,
         &#34;terms&#34; : [
            {
               &#34;offset&#34; : 0,
               &#34;value&#34; : &#34;740 Spring Lane&#34;
            },
            {
               &#34;offset&#34; : 17,
               &#34;value&#34; : &#34;Wallacedale&#34;
            },
            {
               &#34;offset&#34; : 30,
               &#34;value&#34; : &#34;Victoria&#34;
            },
            {
               &#34;offset&#34; : 40,
               &#34;value&#34; : &#34;Australia&#34;
            }
         ],
         &#34;types&#34; : [ &#34;route&#34;, &#34;geocode&#34; ]
      }
</code></pre>

<p>以下是上述自动完成地址的 Googlemap 地理编码 API 的输出</p>

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

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

<p>这是由自动完成 API 返回的</p>

<pre><code>{
         &#34;description&#34; : &#34;11 Victoria Parade, Collingwood, Victoria, Australia&#34;,
         &#34;id&#34; : &#34;dbeebdb81c8babd166ac8f89878e88c2cba333a1&#34;,
         &#34;matched_substrings&#34; : [
            {
               &#34;length&#34; : 18,
               &#34;offset&#34; : 0
            },
            {
               &#34;length&#34; : 9,
               &#34;offset&#34; : 43
            }
         ],
         &#34;place_id&#34; : &#34;EjQxMSBWaWN0b3JpYSBQYXJhZGUsIENvbGxpbmd3b29kLCBWaWN0b3JpYSwgQXVzdHJhbGlh&#34;,
         &#34;reference&#34; : &#34;CkQ4AAAATy4Z7xc3ermqeWnlxpl81pAVsBWOIl3S2JbCwwRxraLt39OJauWFnCR3NgGyruVBXfUo236mMe6CCQt5XRSYwRIQEL8JC7Qo8j3-0iD4AnJTtBoURjzgm8aHBa2g0tY4lkTKYTuVGPg&#34;,
         &#34;terms&#34; : [
            {
               &#34;offset&#34; : 0,
               &#34;value&#34; : &#34;11 Victoria Parade&#34;
            },
            {
               &#34;offset&#34; : 20,
               &#34;value&#34; : &#34;Collingwood&#34;
            },
            {
               &#34;offset&#34; : 33,
               &#34;value&#34; : &#34;Victoria&#34;
            },
            {
               &#34;offset&#34; : 43,
               &#34;value&#34; : &#34;Australia&#34;
            }
         ],
         &#34;types&#34; : [ &#34;route&#34;, &#34;geocode&#34; ]
      }
</code></pre>

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

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

<p>我们将不胜感激。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您在自动完成结果的描述中得到的只是一个字符串,仅此而已(不是一组特征,如街道、 zip 或门牌号)。服务<strong>尝试</strong>找到确切的位置(基于输入),但可能部分匹配。 </p>

<p>当你例如在 <a href="http://maps.google.com" rel="noreferrer noopener nofollow">http://maps.google.com</a> 输入 <strong><em>740 Spring Lane, Wallacedale, Victoria, Australia</em></strong>您将获得 <strong><em>Spring Ln, Wallacedale VIC 3303,Australia</em></strong></p> 的结果

<p>您也可以输入 <strong><em>12345 Spring Lane, Wallacedale, Victoria, Australia</em></strong>,您会得到相同的结果。</p>

<p>除此之外:我建议 <a href="https://developers.google.com/places/documentation/details#PlaceDetailsResults" rel="noreferrer noopener nofollow">request the place-details</a>基于 <code>place_id</code> 。虽然它不能给你想要的结果(门牌号),但结果应该更准确(绑定(bind)到一个特定的地方而不是一个地方的地址)。它还会返回该地点的更多详细信息。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Googlemap 地址自动完成和地理编码 API 返回差异地址,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28689241/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28689241/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Google map 地址自动完成和地理编码 API 返回差异地址