【雲圖】如何製作全國KTV查詢系統?

酸奶小妹發表於2014-06-05

摘要:本文以【唱吧】531麥霸音樂節為案例,詳細解讀了如何匯入自有資料到高德雲圖,並進行檢索和展示。最後,調起高德mobile地圖來進行路線規劃和周邊查詢。

本案例可以應用在微信開發平臺,支付寶公眾服務上,適合餐飲商家,汽車4S店,銀行,停車場等業務。

由於使用高德雲圖+URI API的方式實現,開發者無需進行繁瑣的資料庫操作,即可實現自有資料的儲存與檢索。

效果圖:

--------------------------------------------------------------

 

一、資料準備

從唱吧531麥霸節官網獲得資料:http://changba.com/yunying/ktvStaticList.php

拷貝到excel,另存為CSV格式,並改成UTF-8或者GBK編碼。

 

 

二、匯入資料

登入雲圖:http://yuntu.amap.com/datamanager/index.html

點選新建地圖:

 

匯入剛才的資料:

 

點選預覽:

 

出現全國KTV分佈圖:

 

三、UE設計圖

1、對於KTV的展示,有列表模式和地圖模式2種。

2、按照城市檢索並展示KTV資料。

3、點選某個KTV,跳轉到高德mobile地圖,進行路線規劃。

 

四、雲圖展示全國KTV

 採用雲圖層的方法,將麻點圖展示出來。

//地圖-雲圖層
    mapObj.plugin('AMap.CloudDataLayer', function () {
        var layerOptions = {
            query:{keywords: ''},
            clickable:true
        };
        cloudDataLayer = new AMap.CloudDataLayer('538d71fee4b04192f1f4de77', layerOptions); //例項化雲圖層類
        cloudDataLayer.setMap(mapObj); //疊加雲圖層到地圖    
    });

 

示例圖:

 

五、列表展示北京市KTV

用雲檢索,檢索出北京市的KTV。

    //列表                 
    mapObj.plugin(["AMap.CloudDataSearch"], function() {       var searchOptions = {  
            keywords:'',  
            orderBy:'_id:ASC'  
        };     
        cloudSearch = new AMap.CloudDataSearch('538d71fee4b04192f1f4de77', searchOptions); //構造雲資料檢索類  
        AMap.event.addListener(cloudSearch, "complete", cloudSearch_CallBack); //查詢成功時的回撥函式  
        AMap.event.addListener(cloudSearch, "error", errorInfo); //查詢失敗時的回撥函式
        cloudSearch.searchNearBy(iPoint, 30000); //周邊檢索
    });  

 

示例圖:

 

六、採用URI API連結到高德mobile地圖

在點選列表,和點選麻點圖的時候,採取URI API的方式調取地圖。

這樣我們只需要知道一個經緯度,就可以調取地圖。

示例:

http://mo.amap.com/?q=31.234527,121.287689&name=名字

 

列表調取mo的程式碼:

//回撥函式-成功
function cloudSearch_CallBack(data) {   
    var resultStr="";  
    var resultArr = data.datas;  
    var resultNum = resultArr.length;  
    for (var i = 0; i < resultNum; i++) {    
        resultStr += "<div class=\"item\">";
        resultStr += "<a href='http://mo.amap.com/?q=" + resultArr[i]._location.getLat() + "," + resultArr[i]._location.getLng() + "&name=" + resultArr[i]._name + "'><h3>" + (i+1) + "、" + resultArr[i]._name + "</h3></a>";        
        resultStr += "<p>地址:" + resultArr[i]._address + "</p>";        
        resultStr += "<p>電話:" + resultArr[i].tel + "</p>";        
        resultStr += "</div>";        
    }  
    document.getElementById("list").innerHTML = resultStr;  
}   

 

點選麻點圖,出現資訊視窗,調取高德mo:

AMap.event.addListener(cloudDataLayer, 'click', function (result) {
            var clouddata = result.data;            
            //雲圖麻點
            var infoWindow = new AMap.InfoWindow({
                content: "<a href='http://mo.amap.com/?q=" + clouddata._location.getLat() + "," + clouddata._location.getLng() + "&name=" + clouddata._name + "'><h3>" + clouddata._name + "</h3></a>" + "<p>地址:" + clouddata._address + "</p>" + "<p>電話:" + clouddata.tel + "</p>",
                size:new AMap.Size(300, 0),
                autoMove:true,
                offset:new AMap.Pixel(0,-5)
            });
            infoWindow.open(mapObj, clouddata._location);            
        });

 

高德mo示意圖:

 

七、城市切換

城市切換的時候,雲圖層展示,和雲檢索list要分開寫。

//索引雲圖
function getType(iPrivance){
    if(iPrivance=="全國"){
        mapObj.setZoomAndCenter(4,new AMap.LngLat(114.433594,33.651208));
        myCloudList('');
        var op={
            query:{keywords:""}
        };
        cloudDataLayer.setOptions(op);
    }else{
        myCloudList(iPrivance);
        var op={
            query:{keywords:iPrivance}
        };
        cloudDataLayer.setOptions(op);
        placeSearch(iPrivance);
    }
}

 

地圖展示完畢之後,需要重新設定中心點。

//城市查詢
function placeSearch(id) {  
    var MSearch;  
    mapObj.plugin(["AMap.PlaceSearch"], function() {          
        MSearch = new AMap.PlaceSearch({ //構造地點查詢類  
            pageSize:1,  
            pageIndex:1,  
            city:"" //城市  
        });   
        AMap.event.addListener(MSearch, "complete", keywordSearch_CallBack);//返回地點查詢結果  
        MSearch.search(id); //關鍵字查詢  
    });  
}  
//城市查詢後定位  
function keywordSearch_CallBack(data) {  
    var iPoint = data.poiList.pois[0].location;
    mapObj.setZoomAndCenter(10,iPoint);
}

 

八、全部原始碼

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>雲圖+mo</title>
<link rel="stylesheet" type="text/css" href="yuntumo.css" />
<script language="javascript" src="http://webapi.amap.com/maps?v=1.2&key=【您的key】"></script>
</head>
<body onLoad="mapInit()">
    <div id="lnglats">&nbsp;</div>
    <div class="header clearfix">
        <select onchange="getType(this.options[this.selectedIndex].text)" >            
            <option>北京</option>
            <option>天津市</option>
            <option>上海市</option>
            <option>重慶市</option>
            <option>安徽省</option>
            <option>福建省</option>
            <option>廣東省</option>
            <option>浙江省</option>
            <option>黑龍江省</option>
            <option>遼寧省</option>
            <option>吉林省</option>
            <option>河北省</option>
            <option>河南省</option>
            <option>山西省</option>
            <option>陝西省</option>
            <option>湖北省</option>
            <option>湖南省</option>
            <option>江蘇省</option>
            <option>江西省</option>
            <option>四川省</option>
            <option>雲南省</option>
            <option>內蒙古自治區</option>
            <option>全國</option>
        </select>
        <div class="btnChange">
            <a onclick="display('list');" href="javascript:void(0);">列表模式</a>
            <a onclick="display('map');" href="javascript:void(0);">地圖模式</a>
        </div>
    </div>
    <div id="map"></div>
    <div id="list" style="display:none;">正在讀取資料……</div>
<!-- tongji begin-->
<script type="text/javascript">
var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Faeff88f19045b513af7681b011cea3bd' type='text/javascript'%3E%3C/script%3E"));
</script>
<!-- tongji end -->
</body>
<script language="javascript">
function display(id){
    document.getElementById('map').style.display = 'none';
    document.getElementById('list').style.display = 'none';
    document.getElementById(id).style.display = 'block';
}
var mapObj;
var cloudDataLayer;
var cloudSearch;
var pBeijing = new AMap.LngLat(116.388474,39.934486);
//初始化地圖物件,載入地圖
function mapInit(){
    mapObj = new AMap.Map("map",{
    center: pBeijing, //地圖中心點
    level:11  //地圖顯示的比例尺級別
    });
    myCloudMap();
    myCloudList("北京");
    AMap.event.addListener(mapObj,'click',getLnglat); //點選事件
}
//雲圖載入地圖
function myCloudMap(){
    //地圖-雲圖層
    mapObj.plugin('AMap.CloudDataLayer', function () {
        var layerOptions = {
            query:{keywords: '北京'},
            clickable:true
        };
        cloudDataLayer = new AMap.CloudDataLayer('538d71fee4b04192f1f4de77', layerOptions); //例項化雲圖層類
        cloudDataLayer.setMap(mapObj); //疊加雲圖層到地圖

        AMap.event.addListener(cloudDataLayer, 'click', function (result) {
            var clouddata = result.data;
            //雲圖麻點
            var infoWindow = new AMap.InfoWindow({
                content: "<a href='http://mo.amap.com/?q=" + clouddata._location.getLat() + "," + clouddata._location.getLng() + "&name=" + clouddata._name + "'><h3>" + clouddata._name + "</h3></a>" + "<p>地址:" + clouddata._address + "</p>" + "<p>電話:" + clouddata.tel + "</p>",
                size:new AMap.Size(300, 0),
                autoMove:true,
                offset:new AMap.Pixel(0,-5)
            });
            infoWindow.open(mapObj, clouddata._location);
        });
    });
}
//雲圖載入列表
function myCloudList(id){
    //列表
    mapObj.plugin(["AMap.CloudDataSearch"], function() {
        //繪製多邊形
        var arr = new Array();
        arr.push(new AMap.LngLat(75.585938,52.696361));
        arr.push(new AMap.LngLat(134.472656,53.956086));
        arr.push(new AMap.LngLat(129.726563,16.467695));
        arr.push(new AMap.LngLat(81.914063,20.13847));
        arr.push(new AMap.LngLat(75.585938,52.696361));
        var searchOptions = {
            keywords: id,
            pageSize:100
        };
        cloudSearch = new AMap.CloudDataSearch('538d71fee4b04192f1f4de77', searchOptions); //構造雲資料檢索類
        AMap.event.addListener(cloudSearch, "complete", cloudSearch_CallBack); //查詢成功時的回撥函式
        AMap.event.addListener(cloudSearch, "error", errorInfo); //查詢失敗時的回撥函式
        cloudSearch.searchInPolygon(arr); //多邊形檢索
    });
}
//回撥函式-成功
function cloudSearch_CallBack(data) {
    var resultStr="";
    var resultArr = data.datas;
    var resultNum = resultArr.length;
    for (var i = 0; i < resultNum; i++) {
        resultStr += "<div class=\"item\">";
        resultStr += "<a href='http://mo.amap.com/?q=" + resultArr[i]._location.getLat() + "," + resultArr[i]._location.getLng() + "&name=" + resultArr[i]._name + "'><h3>" + (i+1) + "" + resultArr[i]._name + "</h3></a>";
        resultStr += "<p>地址:" + resultArr[i]._address + "</p>";
        resultStr += "<p>電話:" + resultArr[i].tel + "</p>";
        resultStr += "</div>";
    }
    document.getElementById("list").innerHTML = resultStr;
}
//回撥函式-失敗
function errorInfo(data) {
    resultStr = data.info;
    document.getElementById("list").innerHTML = resultStr;
}
//滑鼠點選,獲取經緯度座標
function getLnglat(e){
    var x = e.lnglat.getLng();
    var y = e.lnglat.getLat();
    document.getElementById("lnglats").innerHTML = x + "," + y;
}
//清空地圖
function clearMap(){
    mapObj.clearMap();
    document.getElementById("list").innerHTML = '正在讀取資料……';
}
//索引雲圖
function getType(iPrivance){
    if(iPrivance=="全國"){
        mapObj.setZoomAndCenter(4,new AMap.LngLat(114.433594,33.651208));
        myCloudList('');
        var op={
            query:{keywords:""}
        };
        cloudDataLayer.setOptions(op);
    }else{
        myCloudList(iPrivance);
        var op={
            query:{keywords:iPrivance}
        };
        cloudDataLayer.setOptions(op);
        placeSearch(iPrivance);
    }
}
//城市查詢
function placeSearch(id) {  
    var MSearch;  
    mapObj.plugin(["AMap.PlaceSearch"], function() {          
        MSearch = new AMap.PlaceSearch({ //構造地點查詢類  
            pageSize:1,  
            pageIndex:1,  
            city:"" //城市  
        });   
        AMap.event.addListener(MSearch, "complete", keywordSearch_CallBack);//返回地點查詢結果  
        MSearch.search(id); //關鍵字查詢  
    });  
}  
//城市查詢後定位  
function keywordSearch_CallBack(data) {  
    var iPoint = data.poiList.pois[0].location;
    mapObj.setZoomAndCenter(10,iPoint);
}
</script>
</html>

 

示例demo:http://zhaoziang.com/amap/yuntumo.html

相關文章