亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Google Maps API Javascript,從頁面上的表單輸入中獲取經度緯度

Google Maps API Javascript,從頁面上的表單輸入中獲取經度緯度

滄海一幻覺 2022-06-09 11:29:29
我正在嘗試創建一個 1 頁地圖生成器,他們在其中輸入地址和郵政編碼。這部分有效Geolocation API 然后進行反向查找以獲取經度和緯度,并將其填充到 2 個隱藏的輸入字段以供以后使用。這部分不起作用然后,我需要使用 Maps API 從隱藏的輸入中獲取經度和緯度值并生成地圖,但是,變量為 NULL,因為它們設置在單擊時激活的函數中。我需要能夠在設置值后觸發地圖生成器代碼,或者最初從一組數字傳遞一組值,然后單擊按鈕使用隱藏值重新運行代碼。<script>var apiKey='REMOVED FOR PRIVACY';var longitude, latitude, map;jQuery(document).ready(function( $ ) {    $('#find-address').click(function () {        var address = $('#address').val();        var postcode = $('#postcode').val();        var addressClean = address.replace(/\s+/g, '+');        var postcodeClean = postcode.replace(/\s+/g, '+');        var apiCall = 'https://maps.googleapis.com/maps/api/geocode/json?address='+addressClean+',+'+postcodeClean+'&key='+apiKey+'';        $.getJSON(apiCall,function (data, textStatus) {            longitude = data.results[0].geometry.location.lng;            latitude = data.results[0].geometry.location.lat;            document.getElementById("long").value = longitude;            document.getElementById("lat").value = latitude;        });        setTimeout(function(){            longitude = $("input#long").val();            latitude = $("input#lat").val();            if(longitude && latitude){                longitude = parseFloat(longitude);                latitude = parseFloat(latitude);                initMap(longitude,latitude);            }        }, 1000);    });});function initMap(longitude,latitude) {    var myLatlng = new google.maps.LatLng(latitude,longitude);    var mapOptions = {      zoom: 12,      center: myLatlng    }    var map = new google.maps.Map(document.getElementById("map-embed-div"), mapOptions);    var marker = new google.maps.Marker({        position: myLatlng,        map: map,        draggable: true,        title: "Where's your garden?"    });};</script><script src="https://maps.googleapis.com/maps/api/js?key=REMOVED_FOR_PRIVACY&callback=initMap" async defer></script>我嘗試在 setTimeout 函數中調用該函數并在函數回調中傳遞值,但這會返回 NULL。在 timeout 函數中移動所有內容會引發未定義 initMap 的 promise 錯誤。
查看完整描述

1 回答

?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

有幾個問題。

  1. 我收到 JavaScript 錯誤:InvalidValueError: setCenter: not a LatLng or LatLngLiteral with finite coordinates: in property lat: NaN is not an accepted value因為在您的 API 中包括:

你有callback=initMap,但你不希望它在 API 加載時運行,你希望它在用戶單擊“查找地址”后運行。刪除:

<script src="https://maps.googleapis.com/maps/api/js?key=REMOVED_FOR_PRIVACY" async defer></script>
  1. 我收到 JavaScript 錯誤:Uncaught TypeError: Cannot read property 'geometry' of undefined當我單擊“查找地址”時,因為沒有錯誤檢查。如果我檢查文本狀態(至少使用 Google 測試鍵),它會告訴我:"API keys with referer restrictions cannot be used with this API."status: "REQUEST_DENIED". 如果我對地理編碼器的請求使用不受限制的密鑰,我會得到一個帶有標記的地圖(至少對于有效地址)。我建議使用 Google JavaScript API v3 Geocoder,并添加錯誤檢查:

var geocoder = new google.maps.Geocoder();

geocoder.geocode({

  address: addressClean + "," + postcodeClean

}, function(results, status) {

  console.log(status);

  if (status == 'OK') {


    console.log(results);

    longitude = results[0].geometry.location.lng();

    latitude = results[0].geometry.location.lat();

    document.getElementById("long").value = longitude;

    document.getElementById("lat").value = latitude;

    // geocoder is asynchronous, do this in the callback function

    longitude = $("input#long").val();

    latitude = $("input#lat").val();


    if (longitude && latitude) {

      longitude = parseFloat(longitude);

      latitude = parseFloat(latitude);


      initMap(longitude, latitude);

    }

  } else alert("geocode failed")

});

代碼片段:


var apiKey = 'AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk';

var longitude, latitude, map;


jQuery(document).ready(function($) {

  $('#find-address').click(function() {

    var address = $('#address').val();

    var postcode = $('#postcode').val();

    var addressClean = address.replace(/\s+/g, '+');

    var postcodeClean = postcode.replace(/\s+/g, '+');

    var apiCall = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + addressClean + ',+' + postcodeClean + '&key=' + apiKey + '';


    //$.getJSON(apiCall,function (data, textStatus) {

    var geocoder = new google.maps.Geocoder();

    geocoder.geocode({

      address: addressClean + "," + postcodeClean

    }, function(results, status) {

      console.log(status);

      if (status == 'OK') {


        console.log(results);

        longitude = results[0].geometry.location.lng();

        latitude = results[0].geometry.location.lat();

        document.getElementById("long").value = longitude;

        document.getElementById("lat").value = latitude;

        // geocoder is asynchronous, do this in the callback function

        longitude = $("input#long").val();

        latitude = $("input#lat").val();


        if (longitude && latitude) {

          longitude = parseFloat(longitude);

          latitude = parseFloat(latitude);


          initMap(longitude, latitude);

        }

      } else alert("geocode failed")

    });

  });


  function initMap(longitude, latitude) {

    var myLatlng = new google.maps.LatLng(latitude, longitude);


    var mapOptions = {

      zoom: 12,

      center: myLatlng

    }


    var map = new google.maps.Map(document.getElementById("map-embed-div"), mapOptions);


    var marker = new google.maps.Marker({

      position: myLatlng,

      map: map,

      draggable: true,

      title: "Where's your garden?"

    });

  };

})

/* Always set the map height explicitly to define the size of the div

 * element that contains the map. */


#map {

  height: 100%;

}



/* Optional: Makes the sample page fill the window. */


html,

body {

  height: 100%;

  margin: 0;

  padding: 0;

}

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<form action="/instant-quote-test/#wpcf7-f3686-p3924-o1" method="post" class="wpcf7-form mailchimp-ext-0.5.14" novalidate="novalidate">

  <div style="display: none;">

    <input type="hidden" name="_wpcf7" value="3686" /><br />

    <input type="hidden" name="_wpcf7_version" value="5.1.7" /><br />

    <input type="hidden" name="_wpcf7_locale" value="en_GB" /><br />

    <input type="hidden" name="_wpcf7_unit_tag" value="wpcf7-f3686-p3924-o1" /><br />

    <input type="hidden" name="_wpcf7_container_post" value="3924" />

  </div>


  <p><span class="wpcf7-form-control-wrap your-fname"><input type="hidden" name="your-fname" value="" size="40" class="wpcf7-form-control wpcf7dtx-dynamictext wpcf7-dynamichidden" aria-invalid="false" /></span><span class="wpcf7-form-control-wrap your-email"><input type="hidden" name="your-email" value="" size="40" class="wpcf7-form-control wpcf7dtx-dynamictext wpcf7-dynamichidden" aria-invalid="false" /></span>

    <span

      class="wpcf7-form-control-wrap your-phone"><input type="hidden" name="your-phone" value="" size="40" class="wpcf7-form-control wpcf7dtx-dynamictext wpcf7-dynamichidden" aria-invalid="false" /></span>

  </p>



  <input type="text" name="street-address" value="77 Mass Ave" size="40" class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required" id="address" aria-required="true" aria-invalid="false" placeholder="Street Address" />


  <input type="text" name="post-code" value="02139" size="40" class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required" id="postcode" aria-required="true" aria-invalid="false" placeholder="Post Code" />


  <input type="hidden" id="lat" value=""><input type="hidden" id="long" value="">

  <input type="hidden" name="addressField1" value=""><input type="hidden" name="postcodeField">

  <a href="#" id="find-address" title="Find Address" class="button">Find Address</a>


  <div id="map-embed">

    <div id="map-embed-div" style="height:400px;width:100%;"></div>

  </div>


  <div id="after-map-quote">

    <input type="submit" value="Get My Lawn Care Quote" class="wpcf7-form-control wpcf7-submit quote-send" />

  </div>

</form>

<!-- Replace the value of the key parameter with your own API key. -->

<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk" async defer></script>


查看完整回答
反對 回復 2022-06-09
  • 1 回答
  • 0 關注
  • 373 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號