2011-11-12 20 views
0

jQueryとJavascriptで弱いです。私はこの既存のコードを利用して、ユーザーに完全な住所を郵便形式で届けさせたいと思っています。手紙や郵便局の封筒のようなものです。jQueryジオコードで住所を取得する

ユーザーがアドレスボックスにアドレスを入力し始め、jQueryのオートコンプリートが開始されます。ユーザーが完全なアドレスを参照すると、そのアドレスをクリックすると、ユーザーが選択したテストボックスをプロポにします郵便書式。ここで

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
<title>Get Address Details</title> 
     <script type="text/javascript" src="js/jquery-1.6.4.min.js"></script> 
     <script src="http://maps.google.com/maps/api/js?sensor=false"></script> 
     <script src="js/jquery-ui-1.8.7.min.js"></script> 
     <script src="js/jquery.ui.addresspicker.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
       $("#address1").addresspicker({ 
           elements: { 
           locality: '#city', 
           lat:  '#lat', 
           lng:  '#lng', 
           country: '#country' 
           } 
          }); 
     }); 
     </script> 

</head> 

<body> 

<form action="submit.php" method="post"> 
     <fieldset style="width: 300px; margin-bottom: 100px;"><legend>begin typing address</legend> 
     <label for="address1">Input Address: </label><input name="address1" id="address1" type="text"><br /></fieldset> 
     <fieldset style="width: 300px; text-align: right;"><legend>see results here</legend> 
     <label for="address2">Street Address: </label><input name="address2" id="address2" type="text"><br /> 

     <label for="lat">Lat: </label><input name="lat" id="lat" type="text"><br /> 

     <label for="lng">Lng: </label><input name="lng" id="lng" type="text"><br /> 

     <label for="city">City: </label><input name="city" id="city" type="text"><br /> 

     <label for="country">Country: </label><input name="country" id="country" type="text"><br /><br /> 

     <label for="postal">Postal Address: </label><textarea name="postal" id="postal" ></textarea><br /> 

     </fieldset> 

</form> 
</body> 

</html> 

アドレスピッカーのためのjavascriptのページは以下の通りですHTMLページであり、かつ、他のJSページは

/* 
* jQuery UI addresspicker @VERSION 
* 
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 
* Dual licensed under the MIT or GPL Version 2 licenses. 
* http://jquery.org/license 
* 
* http://docs.jquery.com/UI/Progressbar 
* 
* Depends: 
* jquery.ui.core.js 
* jquery.ui.widget.js 
* jquery.ui.autocomplete.js 
*/ 
(function($, undefined) { 

$.widget("ui.addresspicker", { 
    options: { 
     appendAddressString: "", 
     mapOptions: { 
      zoom: 5, 
      center: new google.maps.LatLng(46, 2), 
      scrollwheel: false, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
     }, 
     elements: { 
      map: false, 
      lat: false, 
      lng: false, 
      locality: false, 
      country: false 
     }, 
     draggableMarker: true 
    }, 

    marker: function() { 
     return this.gmarker; 
    }, 

    map: function() { 
     return this.gmap; 
    }, 

    updatePosition: function() { 
    this._updatePosition(this.gmarker.getPosition()); 
    }, 

    reloadPosition: function() { 
    this.gmarker.setVisible(true); 
    this.gmarker.setPosition(new google.maps.LatLng(this.lat.val(), this.lng.val())); 
    this.gmap.setCenter(this.gmarker.getPosition()); 
    }, 

    selected: function() { 
    return this.selectedResult; 
    }, 

    _create: function() { 
     this.geocoder = new google.maps.Geocoder(); 
     this.element.autocomplete({ 
      source: $.proxy(this._geocode, this), 
      focus: $.proxy(this._focusAddress, this), 
      select: $.proxy(this._selectAddress, this) 
     }); 

     this.lat  = $(this.options.elements.lat); 
     this.lng  = $(this.options.elements.lng); 
     this.locality = $(this.options.elements.locality); 
     this.country = $(this.options.elements.country); 
     if (this.options.elements.map) { 
      this.mapElement = $(this.options.elements.map); 
     this._initMap(); 
     } 
    }, 

    _initMap: function() { 
    if (this.lat && this.lat.val()) { 
     this.options.mapOptions.center = new google.maps.LatLng(this.lat.val(), this.lng.val()); 
    } 

    this.gmap = new google.maps.Map(this.mapElement[0], this.options.mapOptions); 
    this.gmarker = new google.maps.Marker({ 
     position: this.options.mapOptions.center, 
     map:this.gmap, 
     draggable: this.options.draggableMarker}); 
    google.maps.event.addListener(this.gmarker, 'dragend', $.proxy(this._markerMoved, this)); 
    this.gmarker.setVisible(false); 
    }, 

    _updatePosition: function(location) { 
    if (this.lat) { 
     this.lat.val(location.lat()); 
    } 
    if (this.lng) { 
     this.lng.val(location.lng()); 
    } 
    }, 

    _markerMoved: function() { 
    this._updatePosition(this.gmarker.getPosition()); 
    }, 

    // Autocomplete source method: fill its suggests with google geocoder results 
    _geocode: function(request, response) { 
    var address = request.term, self = this; 
    this.geocoder.geocode({ 'address': address + this.options.appendAddressString}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     for (var i = 0; i < results.length; i++) { 
      results[i].label = results[i].formatted_address; 
     }; 
     } 
     response(results); 
    }) 
    }, 

    _findInfo: function(result, type) { 
    for (var i = 0; i < result.address_components.length; i++) { 
     var component = result.address_components[i]; 
     if (component.types.indexOf(type) !=-1) { 
     return component.long_name; 
     } 
    } 
    return false; 
    }, 

    _focusAddress: function(event, ui) { 
    var address = ui.item; 
    if (!address) { 
     return; 
    } 

    if (this.gmarker) { 
     this.gmarker.setPosition(address.geometry.location); 
     this.gmarker.setVisible(true); 

     this.gmap.fitBounds(address.geometry.viewport); 
    } 
    this._updatePosition(address.geometry.location); 

    if (this.locality) { 
     this.locality.val(this._findInfo(address, 'locality')); 
    } 

     if (this.address) { 
     this.address.val(this._findInfo(address, 'address')); 
    } 
    if (this.country) { 
     this.country.val(this._findInfo(address, 'country')); 
    } 
    }, 

    _selectAddress: function(event, ui) { 
    this.selectedResult = ui.item; 
    } 
}); 

$.extend($.ui.addresspicker, { 
    version: "@VERSION" 
}); 


// make IE think it doesn't suck 
if(!Array.indexOf){ 
    Array.prototype.indexOf = function(obj){ 
     for(var i=0; i<this.length; i++){ 
      if(this[i]==obj){ 
       return i; 
      } 
     } 
     return -1; 
    } 
} 

})(jQuery); 

答えて

1

私はそのプラグインの使用がやり過ぎかもしれないと思う現在のバージョンですあなたの状況のた​​めに。住所を自動完成するだけでは必要ないマップなどを処理するコードが含まれています。 jQueryUI autocomplete(これは既にプラグインに依存しています)を使用すると、わずか数行のコードしか必要としません。

$(document).ready(function() { 
    var geocoder = new google.maps.Geocoder(); 
    $("#address1").autocomplete({ 
     source: function (request, response) { 
      geocoder.geocode({ address: request.term }, function (results, status) { 
      if (status === google.maps.GeocoderStatus.OK) { 
       response($.map(results, function(result) { 
       if ($.inArray("street_address", result.types) >= 0) { 
        return result.formatted_address; 
       } 
       })); 
      } 
      }); 
     }, 
     select: function (event, ui) { 
      var parts = ui.item.label.split(",") 
       , address1 = parts[0] 
       , address2 = parts.slice(1).join(",").trim(); 
      $("#postal").val(address1 + "\n" + address2); 
     } 
    }); 
}); 

は(私は例えばjsfiddleまたは類似を使用しようとしたが、これらのサービスは、マップのAPIを持つ素晴らしいプレーしていない):

私はこのようなものを使用します。

重要な部分は、以下のとおりです。

  • はオートコンプリートにsourceパラメータとして関数を使用します。この関数では、google.maps.Geocoderを使用して入力アドレスをジオコーディングします。
  • ジオコーディング要求のコールバックで、オートコンプリートの選択肢を、指定されたアドレスで更新します。

ユーザーは、アドレス選択した後:

  • はコンマでアドレスを分割します。
  • アドレスの最初の部分を取り出し、最後の部分と組み合わせます。
  • #postalフィールドに結果の文字列を入力します。
+0

あなたはそれを釘付けにしました!それはまさに私がやろうとしていたものです! – simian

0

これを行うには、アドレスのデータベースが必要です。あなたは、おそらく1つを購入することができたりと同様のものを見つけることができる場合があります。私は、ユーザーが入力を開始するたびに実行されるオートコンプリート機能では、ジオコーダーを実行するために恐ろしい考えですhttp://www2.royalmail.com/marketing-services/address-management-unit/address-data-products/postcode-address-file-paf?campaignid=paf_redirect

を。これらのサイトのほとんどはジオコードのクエリに毎日の制限があります。それ以外の場合はお金を払わなければなりません。

+0

GoogleマップAPIには、1日あたりのリクエスト数が25,000 ** **に制限されています。おそらく、OPはこの制限について心配する必要はありません。いずれにせよ、OPの戦略のその部分は、この質問の範囲外であるように思われる(私の意見では)。さらに、OPは商業用地図APIキーを実際に支払ったことがあり、その点を完全に否定する。 –

+0

私はそれが有効な点だと思います。 –

+0

ええ、私はジオコードGoogleマップapiは、私が今まで必要だったよりも1日あたり1000のものだと思っていました。私は1日あたり約10回の使用を予期しています...大規模なデータベースを作成して取得する作業を行うのではなく、この既存のものを活用したいと考えていました。 – simian

関連する問題