JS爬取高德地圖地址信息(周邊設施經緯度)


需求:給定進百萬小區名稱及對應城市信息,通過高德獲取其周邊設施信息(交通、醫療、教育、生活設施)

高德JS API

爬取靈感來自高德開發支持的JS API,當然你也可以直接調用高德提供的api服務獲取地址信息,但是api服務是有次數限制。而JS API的調用並沒有次數限制,經我的驗證一個爬取節點控制在500毫秒的抓取頻率是沒有限制的。
https://lbs.amap.com/api/javascript-api/example/poi-search/keywords-search
image.png

高德地址信息獲取原理

通過JS引入高德的AMap對象,調用相關方法獲取對應數據。JS調用高德地圖顯示周邊信息也是這個邏輯。

准備工作

注冊高德地圖賬號->控制台創建應用->申請Key
需要申請Key才可以在自己js代碼中使用高德js
申請Key.png

數據抓取

數據獲取流程.png

數據服務API:
讀取小區數據放入list中 每來一次請求從list中pop一條數據返回,這樣前端可以多個節點多個任務同時抓取。

數據獲取:
要想使用高德 需引入如下2個js,其中的key即為高德官網申請的key

<script src="http://cache.amap.com/lbs/static/jquery-1.9.1.js"></script>
<script src="http://webapi.amap.com/maps?v=1.3&key=************&plugin=AMap.ArrivalRange,AMap.Scale,AMap.Geocoder,AMap.Transfer,AMap.Autocomplete" id="amap_key"></script>

get請求獲取小區數據,創建高德對象

$.ajax({
        type:"get", 
        url:"http://127.0.0.1:5075/api/community",
        dataType:"json",
        contentType:"application/json",
        success:function(data){ 
            params = data;
            console.log('Getapi data',data)
            MAP = new AMap.Map("container", {
                resizeEnable: true
            });
            getAddress(data)
        }
     });

調用高德JS搜素小區信息:
1.在AMap.service方法中構造構造地點查詢類
2.調用地點查詢類的search方法返回結果result
3.使用返回結果中的小區經緯度調用searchNearBy去獲取周邊數據

AMap.service(["AMap.PlaceSearch"], function() {
            var placeSearch = new AMap.PlaceSearch({ //構造地點查詢類
                pageSize: 3,
                pageIndex: 1,
                city: city, //城市
                map: MAP,
                type:"商務住宅|門牌信息",
                citylimit:true,
                extensions:"all",
                // panel: "panel"
            });
            //關鍵字查詢
     
            placeSearch.search(keyword, function(status, result) {
                console.log('getAddress info',result.info,result);
                
                searchNearBy(city,cpoint,keyword);
            });
        });

前端打印的搜索結果,獲取的信息非常詳細包括省市縣及其編碼,以及經緯度信息等:
打印結果.png

完整代碼

將代碼保存至index.html, 在同級目錄下python(python -m SimpleHTTPServer 8000)本地啟動http服務。
瀏覽器請求:http://localhost:8000?key=***************************

<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <title>高德房源地址獲取</title>
    <script src="http://cache.amap.com/lbs/static/jquery-1.9.1.js"></script>
    <!-- <script src="http://webapi.amap.com/maps?v=1.3&key=01aa9e655798548a06c7697db75a9903&plugin=AMap.ArrivalRange,AMap.Scale,AMap.Geocoder,AMap.Transfer,AMap.Autocomplete" id="amap_key"></script> -->
    <script type="text/javascript">
        // 根據請求url獲取小區信息 及構造高德js
        function GetRequest() {
           var url = decodeURIComponent(location.search); //獲取url中"?"符后的字串  
           var theRequest = new Object();  
           if (url.indexOf("?") != -1) {  
              var str = url.substr(1);  
              strs = str.split("&");  
              for(var i = 0; i < strs.length; i ++) {  
                 theRequest[strs[i].split("=")[0]]=unescape(strs[i].split("=")[1]);  
              }  
           }  
           return theRequest;  
        }

        var params = GetRequest();
        var key = params.key;
       // 動態構造引入高德js
        var mapSrc = 'http://webapi.amap.com/maps?v=1.3&key='+key+'&plugin=AMap.ArrivalRange,AMap.Scale,AMap.Geocoder,AMap.Transfer,AMap.Autocomplete';
        console.log(mapSrc)
        document.write('<script src='+mapSrc+'></sc' + 'ript>')
    </script>

</head>

<body id='body'>
<div id="container"></div>

<script type="text/javascript">
    function send_mongodb(save_data){
        save_url =  decodeURIComponent(location.href)+'&'+params.id; 
        console.log('amap_data done:',save_data,save_url)
        params = {
          "_template": "amap_gps_nearby",
          "_title": save_data.community+"周邊信息",
          "_timestamp": Date.parse(new Date()),
          "_hostname": '',
          "_url": save_url,
          "_data": {
            "data":save_data
            },
        "_timestampstr": new Date()
        }
        $.ajax({
            type:"POST", 
            url:"http://127.0.0.1:5125/upload",
            dataType:"json",
            contentType:"application/json",
            data:JSON.stringify(params), 
            success:function(data){ 
                console.log('POST mongodb:',data)
            }
         });
        setTimeout(function(){
            flag_over = true;
            // location.reload();
        }, 400);
        
    }

    function getAddress(params) {
        // alert('')
        var city = params.city;
        var district = params.district;
        var keyword = params.xiaoqu;
        var xiaoqu_code = params.xiaoqu_code;
        var xiaoqu = keyword;
        console.log('---------------------',city,keyword);

        AMap.service(["AMap.PlaceSearch"], function() {
            var placeSearch = new AMap.PlaceSearch({ //構造地點查詢類
                pageSize: 3,
                pageIndex: 1,
                city: city, //城市
                map: MAP,
                type:"商務住宅|門牌信息",
                citylimit:true,
                extensions:"all",
                // panel: "panel"
            });
            //關鍵字查詢
     
            placeSearch.search(keyword, function(status, result) {
                if(status==0){
                    console.log('請求失敗')
                    return
                }
                console.log('getAddress info',result.info,result);
                if(keyword!='' && result.poiList &&result.poiList.pois.length>0){
                    var detail = [];
                    var detail = result.poiList.pois[0];
                    for(i=0; i<result.poiList.pois.length; i++){
                        // 對返回的數據通過區縣進行二次篩選
                        var item = result.poiList.pois[i];
                        if(item.adname && district && (item.adname.indexOf(district)!=-1 || district.indexOf(item.adname)!=-1) &&
                            (xiaoqu.indexOf(item.name)!=-1 || item.name.indexOf(xiaoqu)!=-1)){
                            detail = item;
                            break;
                        }
                    }
                    var cpoint = [detail["location"]["lng"],detail["location"]["lat"]];
                    save_data = {"city":city,"district":district,"community":xiaoqu, "community_code":xiaoqu_code,"detail":detail}
                    searchNearBy(city,cpoint,keyword);
                }else{
                    flag_over = true;
                    console.log(keyword+' not find in amap');
                    // location.reload();
                }
            });
        });
    }

    function searchNearBy(city,cpoint,keyword){
        console.log('searchNearBy:',city,cpoint,keyword)
        var placeSearchNearBy = new AMap.PlaceSearch({ //構造地點查詢類
                pageSize: 5,
                type: '',
                pageIndex: 1,
                city: city, //城市
                citylimit:true,
                map: MAP,
            });
        var nearby = {};
        // len = 30;
        var types = [
            {'subway':'地鐵站'},{'bus':'公交車站'},{'parking_lot':'停車場'},{'other_traffic':'飛機場|火車站'},
            {'kids_school':'幼兒園'},{'primary_school':'小學'},{'middle_school':'初中'},{'high_school':'高等院校'},{'college':'大學'},{'train_school':'培訓機構'},{'library':'圖書館'},{'science_museum':'科技館'},{'AAA_hospital':'三級甲等醫院'},{'special_hospital':'專科醫院'},{'hospital':'綜合醫院'},{'clinic':'診所'},{'pharmacy':'醫葯保健銷售店'},{'shopping':'商場'},{'store':'便民商店|便利店'},{'supermarket':'超級市場'},{'comprehensive_market':'綜合市場'},{'bank':'銀行'},{'ATM':'ATM'},{'food':'中餐廳|外國餐廳|快餐廳'},{'drink':'咖啡廳|茶藝館|冷飲店|甜品店'},{'park':'公園'},{'movies':'電影院'},{'sports':'運動場館'},{'entertainment':'娛樂場所'},{'gym':'健身中心'}
            ]

        Search(placeSearchNearBy, types)
        function Search(placeSearchNearBy, types){
            if(types.length==0){
                flagSuccess = true;
                save_data['nearby'] = nearby;
                send_mongodb(save_data);
                return
            }
            var item = types.pop();
            for(var name in item){
                type = item[name]
            }
            placeSearchNearBy.setType(type);
            placeSearchNearBy.searchNearBy('', cpoint, 5000, function(status, result) {
                if(result.poiList && result.poiList.pois.length>0){
                    nearby[name] = result.poiList.pois;
                }
                else{
                    nearby[name] = [];
                }
                setTimeout(function(){
                    Search(placeSearchNearBy, types)
                }, 400);
                
            });
        }
    }

    save_data = {};

    setInterval(function(){
        location.reload();
    }, 1000*60*10);

    $.ajax({
            type:"get", 
            url:"http://127.0.0.1:5075/api/community",
            dataType:"json",
            contentType:"application/json",
            success:function(data){ 
                params = data;
                console.log('Getapi data',data)

                setTimeout(function(){
                    MAP = new AMap.Map("container", {
                        resizeEnable: true
                    });
                    getAddress(data)

                }, 400*10);
            }
         });

</script>
</body>
</html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM