23

googlemapsビューポートセンターが変更されるたびに、郵便番号を使用してDBにクエリを送信しようとしています。これは、次のような逆ジオコーディングで実行できることを知っています。

google.maps.event.addListener(map, 'center_changed', function(){
newCenter();
});
...
function newCenter(){
var newc = map.getCenter();
geocoder.geocode({'latLng': newc}, function(results, status){
if (status == google.maps.GeocoderStatus.OK) {
  var newzip = results[0].address_components['postal_code'];
  }
});
};

もちろん、このコードは実際には機能しません。そのため、結果の配列から郵便番号を抽出するために、これをどのように変更する必要があるのか​​疑問に思いました。ありがとう

4

23 に答える 23

22

私がこれまでに気付いたのは、ほとんどの場合、郵便番号は常に返される各住所内の最後の値であるため、最初の郵便番号を取得する場合(これは私の場合です)、次のアプローチを使用できます。

var address = results[0].address_components;
var zipcode = address[address.length - 1].long_name;
于 2011-03-18T12:25:09.867 に答える
14

underscore.js librarayを使用すると、これを非常に簡単に行うことができます:http: //documentcloud.github.com/underscore/#find

_.find(results[0].address_components, function (ac) { return ac.types[0] == 'postal_code' }).short_name
于 2012-04-06T17:43:55.613 に答える
12

JQueryを使用していますか?

var searchAddressComponents = results[0].address_components,
    searchPostalCode="";

$.each(searchAddressComponents, function(){
    if(this.types[0]=="postal_code"){
        searchPostalCode=this.short_name;
    }
});

short_nameまたはlong_nameは
、「searchPostalCode」の上で機能します。変数には、郵便(zip?)コードIFが含まれ、GoogleMapsAPIから取得した場合にのみ含まれます。

クエリの見返りに「postal_code」が得られない場合があります。

于 2011-11-09T01:42:03.160 に答える
11

了解しました。わかりました。解決策は私が望むよりも少し醜く、おそらく最後のforループは必要ありませんが、address_components[]からがらくたを抽出する必要がある他の人のためのコードは次のとおりです。これはジオコーダーコールバック関数内にあります

// make sure to initialize i
for(i=0; i < results.length; i++){
            for(var j=0;j < results[i].address_components.length; j++){
                for(var k=0; k < results[i].address_components[j].types.length; k++){
                    if(results[i].address_components[j].types[k] == "postal_code"){
                        zipcode = results[i].address_components[j].short_name;
                    }
                }
            }
    }
于 2011-03-17T15:44:55.640 に答える
4
$.each(results[0].address_components,function(index,value){
    if(value.types[0] === "postal_code"){
        $('#postal_code').val(value.long_name);
    }
});
于 2018-12-14T16:51:05.680 に答える
3

.findアンダースコアメソッドに似たJavaScriptメソッドを使用することもできます_.findが、ネイティブであり、追加の依存関係は必要ありません。

const zip_code = results[0].address_components.find(addr => addr.types[0] === "postal_code").short_name;
于 2020-07-17T00:58:06.110 に答える
2

これには、forループが2つだけ必要です。最初の「type」が「postal_code」であることがわかると、「results」配列が更新されます。

次に、新しく見つかった配列セットで元の配列を更新し、再度ループします。

            var i, j,
            result, types;

            // Loop through the Geocoder result set. Note that the results
            // array will change as this loop can self iterate.
            for (i = 0; i < results.length; i++) {

                result = results[i];

                types = result.types;

                for (j = 0; j < types.length; j++) {

                    if (types[j] === 'postal_code') {

                        // If we haven't found the "long_name" property,
                        // then we need to take this object and iterate through
                        // it again by setting it to our master loops array and 
                        // setting the index to -1
                        if (result.long_name === undefined) {
                            results = result.address_components;
                            i = -1;
                        }
                        // We've found it!
                        else {
                            postcode = result.long_name;
                        }

                        break;

                    }

                }

            }
于 2011-06-22T20:50:25.533 に答える
2

このコードを使用することもできます。この関数は、ボタンクリックまたはオンブラーまたはキーアップまたはキーダウンでzipを取得するのに役立ちます。

この関数にアドレスを渡すだけです。

現在は必要ないため、有効なキーとセンサーオプションを削除してGoogleAPIを使用します。

function callZipAPI(addSearchZip)
{    
    var geocoder = new google.maps.Geocoder();
    var zipCode = null;

    geocoder.geocode({ 'address': addSearchZip }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {

            //var latitude = results[0].geometry.location.lat();
            //var longitude = results[0].geometry.location.lng();

            var addressComponent = results[0].address_components;            
            for (var x = 0 ; x < addressComponent.length; x++) {
                var chk = addressComponent[x];
                if (chk.types[0] == 'postal_code') {
                    zipCode = chk.long_name;
                }
            }
            if (zipCode) {
                alert(zipCode);
            }
            else {
                alert('No result found!!');
            }
        } else {            
            alert('Enter proper address!!');
        }
    });
}
于 2016-09-05T12:15:48.713 に答える
2

このコードを使用して「郵便番号」と「地域」を取得しますが、タイプの値を変更するだけで他のフィールドを取得できます。

JAVASCRIPT

var address = results[0].address_components;
var zipcode = '';
var locality = '';

for (var i = 0; i < address.length; i++) {
     if (address[i].types.includes("postal_code")){ zipcode = address[i].short_name; }    
     if (address[i].types.includes("locality")){ locality = address[i].short_name; }
}
于 2017-10-26T14:45:58.990 に答える
2

インデックスに依存するよりも、コンポーネント内のアドレスタイプキーをチェックする方が良いと思います。この問題は、スイッチケースを使用して解決しました。

      var address = '';
      var pin = '';
      var country = '';
      var state = '';
      var city = '';
      var streetNumber = '';
      var route ='';
      var place = autocomplete.getPlace(); 
      for (var i = 0; i < place.address_components.length; i++) {
        var component = place.address_components[i];
        var addressType = component.types[0];

        switch (addressType) {
            case 'street_number':
                streetNumber = component.long_name;
                break;
            case 'route':
                route = component.short_name;
                break;
            case 'locality':
                city = component.long_name;
                break;
            case 'administrative_area_level_1':
                state = component.long_name;
                break;
            case 'postal_code':
                pin = component.long_name;
                break;
            case 'country':
                country = component.long_name;
                break;
        }
       }
于 2019-04-03T14:45:47.983 に答える
1
places.getDetails( request_details, function(results_details, status){

                // Check if the Service is OK
                if (status == google.maps.places.PlacesServiceStatus.OK) {                  

                    places_postal           = results_details.address_components
                    places_phone            = results_details.formatted_phone_number
                    places_phone_int        = results_details.international_phone_number
                    places_format_address   = results_details.formatted_address
                    places_google_url       = results_details.url
                    places_website          = results_details.website
                    places_rating           = results_details.rating

                    for (var i = 0; i < places_postal.length; i++ ) {
                        if (places_postal[i].types == "postal_code"){
                            console.log(places_postal[i].long_name)
                        }
                    }

                }
            });

これは私にとって非常にうまく機能しているようです。これは新しいGoogleMapsAPIV3を使用した場合です。これが誰かを助けるなら、コメントを書いてください、私は私たちが話すときに私のスクリプトを書いています...それでそれは変わるかもしれません。

于 2011-12-27T01:22:45.667 に答える
1

PHPでは、このコードを使用します。ほぼすべての条件で機能します。

$zip = $data["results"][3]["address_components"];
$zip = $index[0]["short_name"];
于 2017-08-03T13:53:40.057 に答える
1

ロメインM.—ありがとう!Googleから最初に返された結果で郵便番号を見つける必要がある場合は、次の2つのループを実行できます。

for(var j=0;j < results[0].address_components.length; j++){
    for(var k=0; k < results[0].address_components[j].types.length; k++){
        if(results[0].address_components[j].types[k] == "postal_code"){
            zipcode = results[0].address_components[j].long_name;
        }
    }
}
于 2017-09-29T20:31:41.610 に答える
0

一言で言えば、それは大変な努力です。少なくともv2APIを使用すると、次のようにこれらの詳細を取得できます。

var place = response.Placemark[0];
var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);

myAddress = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName

myCity = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName

myState = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName

myZipCode = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber

先ほど行ったループ柔術を行わずに、個々のaddress_componentsを取得するためのより洗練された方法が必要です。

于 2011-03-17T19:44:36.667 に答える
0

この単純なコードは私のために働きます

for (var i = 0; i < address.length; i++) {
        alert(address[i].types);
        if (address[i].types == "postal_code")
            $('#postalCode').val(address[i].long_name);
        if (address[i].types == "")
            $('#country').val(address[i].short_name);
    }
于 2015-02-19T12:49:25.307 に答える
0

Jqueryの使用

  • address_components配列のどの場所に郵便番号が格納されているかを確認することはできません。address_components.length-1>にピンコードがない場合があります。これは、「Addresstolatlng」ジオコーディングにも当てはまります。
  • 郵便番号に「postal_code」文字列が含まれていることを確認できます。したがって、最善の方法はそれを確認することです。
   var postalObject = $.grep(results[0].address_components, function(n, i) {
                                    if (n.types[0] == "postal_code") {
                                        return n;
                                    } else {
                                        return null;
                                    }
                                });

                                $scope.query.Pincode = postalObject[0].long_name;
于 2016-02-11T04:52:14.583 に答える
0
 return $http.get('//maps.googleapis.com/maps/api/geocode/json', {
            params: {
                address: val,
                sensor: false
            }
        }).then(function (response) {
           var model= response.data.results.map(function (item) {
               // return item.address_components[0].short_name;
               var short_name;
             var st=  $.each(item.address_components, function (value, key) {
                    if (key.types[0] == "postal_code") {
                        short_name= key.short_name;
                    }
                });
             return short_name;

            });
                return model;
        });
于 2016-03-02T20:39:46.253 に答える
0

JSONPathを使用すると、1行のコードで簡単に実行できます。

var zip = $.results[0].address_components[?(@.types=="postal_code")].long_name;
于 2016-07-30T21:34:06.337 に答える
0
//autocomplete is the text box where u will get the suggestions for an address.

autocomplete.addListener('place_changed', function () {
//Place will get the selected place geocode and returns with the address              
//and marker information.
        var place = autocomplete.getPlace();
//To select just the zip code of complete address from marker, below loop //will help to find. Instead of y.long_name you can also use y.short_name. 
        var zipCode = null;
        for (var x = 0 ; x < place.address_components.length; x++) {
            var y = place.address_components[x];
            if (y.types[0] == 'postal_code') {
                zipCode = y.long_name;
            }
        }
    });
于 2016-09-02T17:54:59.907 に答える
0

最近では、RESTfulAPIから取得する方が良いようです。次のことを試してください。

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&key= YOUR_KEY_HERE

AJAX GET呼び出しの使用は完璧に機能します!

何かのようなもの:

var your_api_key = "***";
var f_center_lat = 40.714224;
var f_center_lon = -73.961452;

$.ajax({ url: "https://maps.googleapis.com/maps/api/geocode/json?latlng="+f_center_lat+","+f_center_lon+"&key="+your_api_key,
            method: "GET"
        })
        .done(function( res ) { if (debug) console.log("Ajax result:"); console.log(res);
            var zipCode = null;
            var addressComponent = res.results[0].address_components;
            for (var x = 0 ; x < addressComponent.length; x++) {
                var chk = addressComponent[x];
                if (chk.types[0] == 'postal_code') {
                    zipCode = chk.long_name;
                }
            }
            if (zipCode) {
                //alert(zipCode);
                $(current_map_form + " #postalcode").val(zipCode);
            }
            else {
                //alert('No result found!!');
                if (debug) console.log("Zip/postal code not found for this map location.")
            }
        })
        .fail(function( jqXHR, textStatus ) {
            console.log( "Request failed (get postal code via geocoder rest api). Msg: " + textStatus );
        });
于 2017-09-26T21:18:49.820 に答える
0

私がそれを手に入れたので、zipは最後または最後の前のものです。これが私の解決策である理由

const getZip = function (arr) {
  return (arr[arr.length - 1].types[0] === 'postal_code') ? arr[arr.length - 1].long_name : arr[arr.length - 2].long_name;
};
const zip = getZip(place.address_components);
于 2020-03-04T23:54:46.390 に答える
0

これが最も正確な解決策だと思います。

zipCode: result.address_components.find(item => item.types[0] === 'postal_code').long_name;
于 2021-10-18T08:07:13.687 に答える
0

postal_codeすべてのタイプを検索し、見つかったら戻ります。

const address_components = [{"long_name": "2b","short_name": "2b","types": ["street_number"]}, { "long_name": "Louis Schuermanstraat","short_name": "Louis Schuermanstraat", "types": ["route"]},{"long_name": "Gent","short_name": "Gent","types": ["locality","political" ]},{"long_name": "Oost-Vlaanderen","short_name": "OV","types": ["administrative_area_level_2","political"]},{"long_name": "Vlaanderen","short_name": "Vlaanderen","types": ["administrative_area_level_1","political"]},{"long_name": "België","short_name": "BE","types": ["country","political"]},{"long_name": "9040","short_name": "9040","types": ["postal_code"]}];
    
// address_components = results[0]address_components

console.log({
  'object': getByGeoType(address_components),
  'short_name': getByGeoType(address_components).short_name,
  'long_name': getByGeoType(address_components).long_name,
  'route': getByGeoType(address_components, ['route']).long_name,
  'place': getByGeoType(address_components, ['locality', 'political']).long_name
});


function getByGeoType(components, type = ['postal_code']) {
  let result = null;
  $.each(components,
    function() {
      if (this.types.some(r => type.indexOf(r) >= 0)) {
        result = this;
        return false;
      }
    });
  return result;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

于 2021-10-26T14:18:45.097 に答える