[問題] 請問關於Google map經緯度取得問題

看板Ajax作者 (阿瑋)時間9年前 (2015/04/17 16:58), 9年前編輯推噓4(4035)
留言39則, 2人參與, 最新討論串1/2 (看更多)
各位版友大家好 小弟我是javascript的初學者 我想請問各位關於Google取得經緯度的函式問題 我參考google api的範例寫出來的函式如下: function addressGps(add) { var geocoder = new google.maps.Geocoder(); geocoder.geocode({address:add},function geoResults(results, status){ //回應函數 狀態ok說明有結果 if (status == google.maps.GeocoderStatus.OK) { var ans = results[0].geometry.location; //document.write(ans); return (ans); }else{ alert(":error " + status); } }); } 其中傳入的add變數是中文地址,我希望得到此地址轉出來的經緯度數字 但是用return傳出來ans變數,在外頭印出來卻是undefined 如果直接在此函式裏頭印,會印出全部搜尋過的地址的經緯度結果 我想請問各位版友,有沒有辦法單獨一個地址一個地址對應的方式去取得其經緯度的數值 而不是像現在這樣用return拿不到數值,或是一次印出一堆數值 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.211.91.17 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1429261082.A.212.html ※ 編輯: william01044 (218.211.91.17), 04/17/2015 16:58:29 ※ 編輯: william01044 (218.211.91.17), 04/17/2015 16:59:27

04/17 17:23, , 1F
你何不在return前把內容指定給外圍的變數?
04/17 17:23, 1F

04/17 17:25, , 2F
而且我想你應該沒有真的接到return的值,你注意到它有
04/17 17:25, 2F

04/17 17:25, , 3F
兩層function嗎?裡面那層只是回呼函數
04/17 17:25, 3F

04/17 17:26, , 4F
我猜你是用類似var result = addressGps(add);的方式跑
04/17 17:26, 4F

04/17 17:27, , 5F
感謝P大的回應 我想請問指定給外圍的變數是指什麼?
04/17 17:27, 5F

04/17 17:27, , 6F
但addressGps本身沒有回傳值(至少你沒寫),所以收不到
04/17 17:27, 6F

04/17 17:27, , 7F
是在function輸入參數中再多加一個當回傳參數嗎?
04/17 17:27, 7F

04/17 17:28, , 8F
不是,是比較新手的寫法
04/17 17:28, 8F

04/17 17:28, , 9F
兩層function我是知道的...但是我試過幾種方式
04/17 17:28, 9F

04/17 17:29, , 10F
在函式外面宣告比如var glocation;
04/17 17:29, 10F

04/17 17:29, , 11F
我拆不開這兩個function 拆開來就沒辦法正常執行...
04/17 17:29, 11F

04/17 17:29, , 12F
可能我功力還太弱T_T
04/17 17:29, 12F

04/17 17:29, , 13F
然後在return前寫glocation = ans;
04/17 17:29, 13F

04/17 17:30, , 14F
這樣就可以硬把結果拉出來,不過這種寫法很糟XD
04/17 17:30, 14F

04/17 17:31, , 15F
理論上你要的值存在geocoder裡面,但function結束就沒了
04/17 17:31, 15F

04/17 17:31, , 16F
如果你要拉出來,正規方式是要回傳兩次
04/17 17:31, 16F

04/17 17:32, , 17F
我剛剛試過P大您說的方法 但是直ans的值還是沒出來
04/17 17:32, 17F

04/17 17:32, , 18F
但我不熟geocoder的組成,所以沒辦法回答你如何回傳XD
04/17 17:32, 18F

04/17 17:33, , 19F
我是在這個函式結尾前面加上var A = ans; return(A)
04/17 17:33, 19F

04/17 17:34, , 20F
但是結果是空值 沒有辦法印出來
04/17 17:34, 20F

04/17 17:43, , 21F
不是不是,宣告要在函式宣告之前
04/17 17:43, 21F

04/17 17:44, , 22F
之後存取A就不要再寫var了
04/17 17:44, 22F

04/17 17:44, , 23F
把var a;寫在你貼的程式"之前"
04/17 17:44, 23F

04/17 17:45, , 24F
然後裡面return前寫 a = ans;
04/17 17:45, 24F

04/17 17:45, , 25F
這才是我想表達的方法(雖然很爛)
04/17 17:45, 25F

04/17 17:46, , 26F
狀況一樣耶 還是沒有值T_T
04/17 17:46, 26F

04/17 17:46, , 27F
而且我明明是用for迴圈去傳地址
04/17 17:46, 27F

04/17 17:47, , 28F
但是在這個函式裏頭印出來的經緯度卻都連在一起
04/17 17:47, 28F

04/17 17:47, , 29F
基本上你的問題在於不了解"變數存活週期"
04/17 17:47, 29F

04/17 17:47, , 30F
並不是一個地址印一個經緯度...
04/17 17:47, 30F

04/17 17:48, , 31F
所以我在猜是不是這個geocoder函式是全部蒐集好再傳
04/17 17:48, 31F

04/17 17:48, , 32F
如果你打算好好學習程式,建議先去了解一下變數存活週期
04/17 17:48, 32F

04/17 17:48, , 33F
因為看google api範例的時候 裏頭有說非同步
04/17 17:48, 33F

04/17 17:49, , 34F
我覺得不是變數周期的問題 因為我試過放在任何地方
04/17 17:49, 34F

04/17 17:49, , 35F
都沒有數值
04/17 17:49, 35F

04/17 17:50, , 36F
不是因為那個變數在函數內被結束的關係...
04/17 17:50, 36F

04/17 17:51, , 37F
你方便貼完整一點的程式嗎?老實說我連你用迴圈也不知道
04/17 17:51, 37F

04/17 17:54, , 38F
如果你外面還有包迴圈,就會多很多種可能
04/17 17:54, 38F

04/17 17:58, , 39F
全文在另一篇
04/17 17:58, 39F
文章代碼(AID): #1LCCiQ8I (Ajax)
文章代碼(AID): #1LCCiQ8I (Ajax)