end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

javascript - Geolocation API で緯度経度を取得し、更に google map api で、緯度経度→住所 変換

住所フォームへの入力の手間を軽減できないかと考えてみた。

動作はしますが、表示される住所精度は、PCやスマホ等の利用環境に影響を受ける為、 自動入力後、手修正が必要。

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>input address test</title>
</head>
<body>
  <h1>end0tknr's input address test</h1>

  ブラウザの Geolocation API で緯度・経度を取得し、<br/>
  更に google map api で、緯度・経度→住所 変換します。<br/>
  表示される住所精度は、PCやスマホ等の利用環境に影響を受ける為、<br/>
  自動入力後、手修正を行って下さい。<br/>
  
  <form method="post">
    <table>
      <thead>
    <tr><td colspan="2">
        <button type="button" onClick="myform.input_address();">GET ADDRESS</button>
    </td></tr>
      </thead>
      <tbody>
    <tr>
      <td>緯度・経度</td>
      <td><input id="lat" type="text" style="width:95px;">
          <input id="lng" type="text" style="width:95px;">
      </td>
    </tr>
    <tr>
      <td>郵便番号</td>
      <td><input id="zipcode" type="text" style="width:200px;"></td>
    </tr>
    <tr>
      <td>都道府県</td>
      <td><input id="pref" type="text" style="width:200px;"></td>
    </tr>
    <tr>
      <td>市区町村</td>
      <td><input id="city" type="text" style="width:200px;"></td>
    </tr>
    <tr>
      <td>その他  </td>
      <td><input id="address_other" type="text" style="width:200px;"></td>
    </tr>
      </tbody>
    </table>
  </form>
  <script src="//cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
  <script src="form.js"></script>
</body>
</html>
(function() {
    var MyForm = function() {};
    MyForm.prototype = {
    gmap_api_url :'https://maps.googleapis.com/maps/api/geocode/json',
    gmap_api_opt :{"key"     :"AIza ないしょ sMu4",
               "language":"ja",
               "sensor"  :false},
        
    input_address: function(){
        if( ! navigator.geolocation ) { // Geolocation API 対応check
        alert( "ご利用のブラウザは、現在位置(緯度/軽度)を取得できません。");
        return false;
        }

        var this_obj = this;
        navigator.geolocation.getCurrentPosition(
        function(position){this_obj.post_current_pos_success(position)},
        function(error   ){this_obj.post_current_pos_error(error)},
        {"enableHighAccuracy": false,
         "timeout"   : 8000,
         "maximumAge": 2000});
    },

    post_current_pos_success: function(position){
        var lat = position.coords.latitude;
        var lng = position.coords.longitude;
        var acc_latlng = position.coords.accuracy;
        $("#lat").val(lat);
        $("#lng").val(lng);

        var req_data = this.gmap_api_opt;
        console.log(req_data);
        req_data["latlng"] = lat+","+lng;
        
            $.ajax({url: this.gmap_api_url,
                    type: 'GET',
                    data: req_data })
                .done( (data) => { this.post_conv_latlng_to_address(data) })
                .fail( (data) => { alert("error",data)  });
    },

    post_current_pos_error: function(error){
        var err_msgs = {0: "原因不明のエラーです" ,
                1: "位置情報の取得が未許可です" ,
                2: "通信状況等により位置情報取得に失敗" ,
                3: "位置情報取得がtimeout"};
        alert( err_msgs[error.code] );
    },
    

    post_conv_latlng_to_address: function(data){
        if (data.status != "OK"){
        alert("緯度・経度→住所返還に失敗しました");
        return false;
        }

        for (var i=0; i<data.results.length; i++) {
        var addr_compo = data.results[i].address_components.reverse();
        
        if(!addr_compo[0].long_name.match( /^\d{3}-?\d{4}$/g ) ||
           addr_compo[1].long_name != "日本" ){
            continue;
        }
        console.log(data.results[i]);
        
        $("#zipcode").val(addr_compo[0].long_name);
        $("#pref").val(addr_compo[2].long_name);
        $("#city").val(addr_compo[3].long_name);

        var formatted_address = data.results[i].formatted_address;
        var addr_header =
            "日本、〒" + addr_compo[0].long_name + " " +
            addr_compo[2].long_name +
            addr_compo[3].long_name;
        var address_other = formatted_address.replace(addr_header, '');
        $("#address_other").val( address_other );
        break;
        }
        
    }
    }
    window.myform = new MyForm();
})();