【问题标题】:Get a address_components获取地址_components
【发布时间】:2012-11-13 03:32:12
【问题描述】:

我正在使用带有地理编码的 Google Places API。我的地址组件类型有问题。

我想以这种格式获取有关用户在自动完成中键入的地址的信息:
街道号码/街道/城市/省/国家/地区。

如果用户自动填写“Street 12, SomeCity, SomeProvince, SomeCountry”,我想在警报中返回所有这些信息。但是当用户只输入“someProvince, SomeCountry”时,我只想输入省和国家地址类型。

这是我的代码:

google.maps.event.addListener(autocomplete, 'place_changed', function () {
    var place = autocomplete.getPlace();
    alert('0: ' + place.address_components[0].long_name);
    alert('1: ' + place.address_components[1].long_name);
    alert('2: ' + place.address_components[2].long_name);
    alert('3: ' + place.address_components[3].long_name);
    alert('4: ' + place.address_components[4].long_name);
    alert('5: ' + place.address_components[5].long_name);
    alert('6: ' + place.address_components[6].long_name);
    alert('7: ' + place.address_components[7].long_name);
)};

问题是当用户自动完成完整地址时,它会正确显示所有这些警报。但是,当仅自动完成部分信息(仅国家/地区)时,它将显示 7 次键入的国家/地区。

http://gmaps-samples-v3.googlecode.com/svn/trunk/places/autocomplete-addressform.html

我想要,当没有给出街道和城市时,它会显示警报(“街道为空”等)。怎么做?

【问题讨论】:

    标签: google-maps google-api google-places-api


    【解决方案1】:

    为一个项目制作了这个功能。它解析

    • 街道
    • 号码
    • 国家
    • 压缩包
    • 城市

    来自 google georesponse

    function parseGoogleResponse(components) {
        _.each(components, function(component) {
          _.each(component.types, function(type) {
            if (type === 'route') {
              $("input[name=street]").val(component.long_name)
            }
            if (type === 'street_number') {
              $("input[name=nr]").val(component.long_name)
            }
            if (type === 'locality') {
              $("input[name=city]").val(component.long_name)
            }
            if (type === 'country') {
              $("input[name=country]").val(component.long_name)
            }
            if (type === 'postal_code') {
              $("input[name=zip]").val(component.long_name)
            }
          })
        })
      }
    

    【讨论】:

    • 这很有用,谢谢!可能会补充一点,如果使用 jQuery,$.each 需要同时将 indexcomponent 传递到其回调函数中。
    【解决方案2】:

    Address Types and Address Component Types

    使用这些类型并将它们映射到您的地址字段。请记住,城市、县、州等可能具有不同的含义,具体取决于其上下文。例如,North Hollywood 出现类型 neighborhood,因为它位于洛杉矶('locality')。

    function placeToAddress(place){
            var address = {};
            place.address_components.forEach(function(c) {
                switch(c.types[0]){
                    case 'street_number':
                        address.StreetNumber = c;
                        break;
                    case 'route':
                        address.StreetName = c;
                        break;
                    case 'neighborhood': case 'locality':    // North Hollywood or Los Angeles?
                        address.City = c;
                        break;
                    case 'administrative_area_level_1':     //  Note some countries don't have states
                        address.State = c;
                        break;
                    case 'postal_code':
                        address.Zip = c;
                        break;
                    case 'country':
                        address.Country = c;
                        break;
                    /*
                    *   . . . 
                    */
                }
            });
    
            return address;
        }
    

    【讨论】:

    • 非常感谢您提供的解决方案,该解决方案为查询 Google 返回的地址信息的稳健方式奠定了基础。
    • 谢谢!
    【解决方案3】:

    根据demo,您需要检查每个返回的地址组件以查看是否已返回街道/城市:

    google.maps.event.addListener(autocomplete, 'place_changed', function() {
        var place = autocomplete.getPlace();
        var components = place.address_components;
        var street = null;
        for (var i = 0, component; component = components[i]; i++) {
            console.log(component);
            if (component.types[0] == 'route') {
                street = component['long_name'];
            }
        }
        alert('Street: ' + street);
    });
    

    【讨论】:

    • 演示不存在
    【解决方案4】:

    为 AngularJS 制作了这个函数:

    function getAddressComponentByPlace(place) {
        var components;
    
        components = {};
    
        angular.forEach(place.address_components, function(address_component) {
            angular.forEach(address_component.types, function(type) {
                components[type] = address_component.long_name;
            });
        });
    
        return components;
    }
    

    结果如下:

    administrative_area_level_1: "Berlin"
    country: "Deutschland"
    locality: "Berlin"
    political: "Deutschland"
    postal_code: "10719"
    route: "Kurfürstendamm"
    street_number: "1"
    sublocality: "Bezirk Charlottenburg-Wilmersdorf"
    sublocality_level_1: "Bezirk Charlottenburg-Wilmersdorf"
    

    ES6 版本

      const parseGoogleAddressComponents = (addressComponents) => {
        let components = {};
        addressComponents.forEach((addressComponent) => {
          addressComponent.types.forEach((type) => {
            components[type] = addressComponent.long_name;
          });
        });
      
        return components;
      };
    

    【讨论】:

      【解决方案5】:

      我用纯 Javascript 编写了这个函数来从 google.maps.GeocoderAddressComponent 对象中获取相应的类型

      //gets "street_number", "route", "locality", "country", "postal_code"
      function getAddressComponents(components, type) {    
      
          for (var key in components) {
              if (components.hasOwnProperty(key)) {            
      
                  if (type == components[key].types[0]) {
                      return components[key].long_name;
                  }  
              }        
          }
      }
      

      【讨论】:

        【解决方案6】:

        这是一个简单的建议:

        function parseGoogleResponse (components) {
          var newComponents = {}, type;
          $.each(components, function(i, component) {
            type = component.types[0];
            newComponents[type] = {
              long_name: component.long_name,
              short_name: component.short_name
            }
          });
          return newComponents;
        }
        

        而用法将是:

        var components = parseGoogleResponse( places[0].address_components );

        【讨论】:

          【解决方案7】:

          简单的 ES6 版本:

          const addComponents = gPlaceObj?.place?.address_components

          然后使用 filter 选择您想要的每个组件:

          const country = addComponents.filter(x => x?.types?.includes('country'))[0];

          哪个会给你这个console.log(country)

          {"long_name": "United States", "short_name": "US", "types": ["country", "political"]}

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-24
            • 2010-11-04
            • 1970-01-01
            • 2011-10-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多