Fw: [請益] 資料庫計算經緯度問題

看板Database作者 (計畫)時間12年前 (2012/06/23 12:11), 編輯推噓0(0011)
留言11則, 2人參與, 最新討論串1/1
※ [本文轉錄自 PHP 看板 #1FvK6v7p ] 作者: steveko (計畫) 看板: PHP 標題: [請益] 資料庫計算經緯度問題 時間: Sat Jun 23 12:10:29 2012 想請教有關利用兩個資料表來計算經緯度的問題 第一個資料表包含了商家的"名稱","電話","地址","郵遞區號","商家位置的經度"與 "商家位置的緯度" 第二個資料表只包含"郵遞區號","經度","緯度"(這裡的經緯度為各郵遞區號的中心點) 我想做個搜尋的功能,讓使用者輸入郵遞區號,就可以查出此郵遞區號範圍10公里 以內的商家 例如我輸入郵遞區號"106",就利用第二個資料表的郵遞區號106中心點經緯度,去跟 第一個資料表的商家經緯度去做計算,mysql出來的結果即為所求. 但是想了很久還是想不出一個解決的方法,以下是我唯一想到的,但是跑不出來, 不知道各位高手有沒有什麼解決方法??? $zip = "zipcode.zip"; $zip1 = "steve.zip"; $lng = "zipcode.lng"; $lat = "zipcode.lat"; $lng1 = "steve.lng"; $lat1 = "steve.lat"; $sql_query = "SELECT * FROM `steve` JOIN `zipcode` on $zip=$zip1 where $zip1 like "使用者輸入的郵遞區號" IN (SELECT * FROM `steve` JOIN `zipcode` on $zip=$zip1 where (2 * 6378.137* ASIN(SQRT(POW(SIN(PI() * ($lat1 – $lat) / 360), 2) + COS(PI() * $lat1 / 180)* COS($lat* PI() / 180) * POW(SIN(PI() * ($lng1 – $lng) / 360), 2)))) <= 10) "; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.224.201.21 ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: steveko (61.224.201.21), 時間: 06/23/2012 12:11:19

06/23 15:11, , 1F
table2的值是固定的 何妨先算好?
06/23 15:11, 1F

06/23 15:13, , 2F
同理 table1資料進來的時候也可以先算好
06/23 15:13, 2F

06/23 15:14, , 3F
別把DB當AP SERVER用吧...
06/23 15:14, 3F

06/23 16:57, , 4F
你可以考慮建個view去把郵遞區號跟十公尺的先算好
06/23 16:57, 4F

06/23 22:32, , 5F
view也是要找的時候現場算 這種不變的資料直接寫TABLE吧
06/23 22:32, 5F

06/23 22:33, , 6F
每家店對應的區號就那幾個 算一次存好再查不是省時省力?
06/23 22:33, 6F

06/24 15:57, , 7F
第一個店加資料肯定會隨時間而有變動啊,不可能另存成table
06/24 15:57, 7F

06/24 21:28, , 8F
店家的地址不變 會MATCH的區號是固定的 新增時算好就可
06/24 21:28, 8F

06/24 21:29, , 9F
不需要每次QUERY都算半天經緯度附近有包到哪些店
06/24 21:29, 9F

06/24 21:31, , 10F
在table 1加一個欄位存有MATCH到的區號 到時再撈就好了吧
06/24 21:31, 10F

06/24 21:32, , 11F
這種動態算的作法是傳入的經緯度不固定的時候才需要這樣
06/24 21:32, 11F
文章代碼(AID): #1FvK7eA0 (Database)