iT邦幫忙

0

本可正確執行的”輸入地址轉經緯度”程式,突無法動了,出現TypeError: Cannot read properties of undefined (reading 'geometry')

  • 分享至 

  • xImage

各位先進大家好:

我有隻本可正常運作將"輸入地址轉經緯度"的php程式,近日才發現它無法正常工作了。

我之前是用別人寫好的程式去硬改的,對 axios 的相關技術並不熟,不知道有沒有先進,可以告訴我這個沒定義 'geometry' 的問題要怎樣修正?是技術更新後缺了甚麼資訊需再補上去嗎?還是?或要去哪裡找文件或範例來研究?

不知道提供以下的程式碼及資訊,足不足夠了解這程式的問題出在哪及怎樣修正?
如果還需要更多的資訊才能釐清問題,還請建議怎樣提供會更好。

非常非常感謝大家的幫忙 🙇

主要程式如下



$showLatLongUrl='';
if($ss_u_lat=="" && $ss_u_long=="") //如果沒登入預設顯示目前所在位置
{
  $showLatLongUrl= 'fun_02CurrtPosition.php?fr='.$fr.'&pid='.$pid.'&uid='.$uid;
}
else
{
//如果登入且SESSION有位置資訊,就顯示SESSION所存的位置
  $showLatLongUrl='fun_02LatLongToMap.php?lat_curr='.$ss_u_lat.'&long_curr='.$ss_u_long.'&fr='.$fr.'&pid='.$pid.'&u_lo_addr='.$ss_u_lo_addr_encode.'&uid='.$uid;
  echo'<br>showLatLongUrl='.$showLatLongUrl;
}

$addrToMap="";

$html = <<< HEREDOC
<div class="container-fluid">
<div class="row col-xs-12">

<!-- 秀出我輸入的地址 -->
<div class="container" style="display:inline;">
  <h3> 設定位置</h3>
  請填寫附近位置知名地標(如台北101)或詳細地址(如台中市中正路1號),送出地址。如未設定,系統會以下方地圖所顯示的位置進行定位。

  <form id="location-form" class="form-inline" style="display:inline;" >
    <input type="text" id="locationInput" class="form-control" size=50 
			     value="{$ss_u_lo_addr}"><br>       
	  <button type="submit" class="btn btn-default" >送出地址</button>
    <input type="hidden" name="fr" id="fr" value={$fr} />
    <input type="hidden" name="pid" id="pid" value={$pid} />
    <input type="hidden" name="uid" id="uid" value={$uid} />   
  </form> 

  <!-- 秀出我目前所在位置 -->  
      <form id="registration_form1" name="registration_form1" 
					   action="fun_02CurrtPosition.php?fr={$fr}&uid={$uid}&pid={$pid}" 
					   target="mainframe" method="post" style="display:inline;">
         <script>
            function clearAddr(position)
               {  document.getElementById("locationInput").value='使用我現在的位置';  }
         </script>   
      </form> 
</div> 
</div>

<div class="row">
  <script>
    // Call Geocode
    // geocode();
    // Get location form
    var locationForm = document.getElementById('location-form');
    var fr = document.getElementById('fr').value;
    var pid = document.getElementById('pid').value;
    var uid = document.getElementById('uid').value;  

    // Listen for submiot
    locationForm.addEventListener('submit', geocode);

    function geocode(e){
      // Prevent actual submit
      e.preventDefault();

      var location = document.getElementById('locationInput').value;
      
      console.log("location="+location)   //這裡有正確抓到表單輸入的地址

      axios.get('https://maps.googleapis.com/maps/api/geocode/json',{
        params:{
          address:location,
          key:'AIzaSyC*********************k'
        }
      })
      .then(function(response){
        // Log full response
        console.log("response="+response); 
				//這裡發生無法出現正確訊息的錯誤response=[object Object]
				//TypeError: Cannot read properties of undefined (reading 'geometry') at fun_01setLocation.php?fr=uad&uid=42:445:44

        // Geometry
        var lat = response.data.results[0].geometry.location.lat;
        var lng = response.data.results[0].geometry.location.lng;

        
        // 以下log就都沒顯示了
        console.log("lat01=")
        console.log("lat01="+lat)
        console.log("lng01="+lng)   
        console.log(fr)
        console.log(location)
        
				//用得到的經緯度畫出地圖
        parent.frames["mainframe"].window.location.href="fun_02LatLongToMap.php?lat_curr=" +lat+"&long_curr="+lng+"&address="+location+"&fr="+fr+"&pid="+pid+"&uid="+uid;
     
      })
      .catch(function(error){   console.log(error); 
      });
    }
  </script>

        <!-- iframe 在這裡設定START -->
        <div id="map" >
	        <iframe class= "well well-sm col-xs-12" src={$showLatLongUrl} name="mainframe" 
							width="100%" max-height="90%" marginwidth="0" marginheight="0" scrolling="No" style="background:#eee" 
							frameborder="0" id="mainframe" allowfullscreen>
					</iframe>
        </div>
        <!-- iframe 在這裡設定END -->

  </div>
</div>

HEREDOC;

$head = <<< HEREDOC
 
 <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

HEREDOC;

https://ithelp.ithome.com.tw/upload/images/20230701/20105754xgFKWCeqDo.jpg

  • 有行號的程式碼截圖
    https://ithelp.ithome.com.tw/upload/images/20230701/20105754fpkRclJpqF.png

感恩先進們撥冗讀完問題,懇請大家幫忙解惑了 🙏

敬祝 順心如意

Ellen

pickuse iT邦新手 3 級 ‧ 2023-07-01 21:05:19 檢舉
你先把response印出來看看裡面有沒有你那個參數吧?
然後不要這樣 console.log("response="+response);
你應該要這樣 console.log("response=", response);
你那樣寫會被強制轉型成文字,你什麼都看不到只看得到[Object object]
suellen iT邦新手 5 級 ‧ 2023-07-04 16:06:23 檢舉
Dear pickuse,

抱歉,前兩天家裡有事在忙,回得較晚還請見諒~

非常謝謝 pickuse 的幫忙,一秒發現我跟JS很不熟😂。
根據您的建議修改log語法後,果然馬上就 log 出細節資料並找到問題了,說我 API KEY 的權限不足,我只要將我 api key的限制設定關掉,功能就又正常了。

log出來的畫面截圖如下:
https://drive.google.com/file/d/1lUTccTk1r3n3YaU0iXmbYclG_9ctaxa5/view?usp=sharing

其中,api key的限制,我是這樣的設的:
*.by37.org/*
*.googleapis.com/*

api key 限制的設定畫面截圖如下:
https://drive.google.com/file/d/1dDlvEfjkd5jOooc_Cd5F6o6_B2qKhTvn/view?usp=sharing

這樣的限制設定,不論是'讀經緯度畫地圖'或'定位使用者目前所在位置'都跑的很正常,唯有解析地址這個功能,會發生錯誤,顯示存取拒絕。只要將限制設定拿掉,地址就可以正常轉經緯度了。

我目前已"暫"將 API KEY 的限制關掉,不知道這個部分 pickuse 或有其他先進知道api key的限制該如何設定才能讓地址解析功能正常運作嗎?
還是希望可以約略的保護一下。

& 我該針對api key的存取限制設定,開另一個新發問嗎?

先在此謝謝先進大大的解惑🥰

敬祝 順心如意平安
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答