高德地图 JS API 学习摘要6

地理编码

  • 地址 -> 坐标

Geocoder.getLocation,使用地理编码接口,根据地址转获取经纬度位置。

<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.12&key=您申请的key值&plugin=AMap.Geocoder"></script>

var map = new AMap.Map("container", {
    resizeEnable: true
});

var geocoder,marker;
function geoCode() {
    if(!geocoder){
        geocoder = new AMap.Geocoder({
            city: "010", //城市设为北京,默认:"全国"
        });
    }
    var address  = document.getElementById('address').value; // 即用户输入的地址值value
    geocoder.getLocation(address, function(status, result) {
        if (status === 'complete'&&result.geocodes.length) {
            var lnglat = result.geocodes[0].location
            document.getElementById('lnglat').value = lnglat;
            if(!marker){
                marker = new AMap.Marker();
                map.add(marker);
            }
            marker.setPosition(lnglat);
            map.setFitView(marker);
        }else{alert(JSON.stringify(result))}
    });
    //  addresses  Array 批量地理编码转换
    // geocoder.getLocation(addresses, function(status, result) {
    //     if (status === 'complete'&&result.geocodes.length) {
    //         for(var i=0;i<result.geocodes.length;i+=1){
    //             var  marker = new AMap.Marker({
    //                 position: result.geocodes[i].location
    //             });
    //             markers.push(marker);
    //         }
    //         map.add(markers);
    //         map.setFitView(markers);
    //     }
    // });
}
document.getElementById("geo").onclick = geoCode; // 点击切换
document.getElementById('address').onkeydown = function(e) { // 输入完成后按enter切换
    if (e.keyCode === 13) {
        geoCode();
        return false;
    }
    return true;
}
  • 坐标 -> 地址
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.12&key=您申请的key值&plugin=AMap.Geocoder"></script>

function regeoCode() {
    if(!geocoder){
        geocoder = new AMap.Geocoder({
            city: "010", //城市设为北京,默认:“全国”
            radius: 1000 //范围,默认:500
        });
    }
    var lnglat  = document.getElementById('lnglat').value.split(',');
        if(!marker){
        marker = new AMap.Marker();
        map.add(marker);
    }
    marker.setPosition(lnglat);
    
    geocoder.getAddress(lnglat, function(status, result) {
        if (status === 'complete'&&result.regeocode) {
            var address = result.regeocode.formattedAddress;
            document.getElementById('address').value = address;
        }else{alert(JSON.stringify(result))}
    });
}

map.on('click',function(e){ // 地图点击切换
    document.getElementById('lnglat').value = e.lnglat;
    regeoCode();
})
document.getElementById("regeo").onclick = regeoCode; // 按钮点击切换

一次查询多个经纬度的地址

var map = new AMap.Map("container", {
    resizeEnable: true
});
var posDiv = document.getElementById('postions');

var lnglats = [],markers = [];
map.on('click',function(e){
    if(lnglats.length < 10){
        lnglats.push(e.lnglat);
        var index = lnglats.length;
        var marker = new AMap.Marker({
            content:'<div class="mark">'+lnglats.length+'</div>',
            position: e.lnglat
        });
        markers.push(marker);
        map.add(marker);
        
        var newItem =
        '<div class="input-item">'+
            '<div class="input-item-prepend"><span class="input-item-text" >'+e.lnglat+'</span></div>'+
            '<input id="address'+index+'" disabled type="text">'+
        '</div>';
        document.getElementById('blank_item').insertAdjacentHTML('beforebegin',newItem)
    }
    
})
var geocoder;
function regeoCode() {
    if(!geocoder){
        geocoder = new AMap.Geocoder({
            city: "010", //城市设为北京,默认:“全国”
            radius: 1000 //范围,默认:500
        });
    }
    geocoder.getAddress(lnglats, function(status, result) {
        var address = []
        if (status === 'complete'&&result.regeocodes.length) {
            for(var i=0;i< result.regeocodes.length;i+=1){
                document.getElementById("address"+(i+1)).value = result.regeocodes[i].formattedAddress
            }
            
        }else{
            alert(JSON.stringify(result))
        }
    });
}

function clear(){
    map.remove(markers);
    markers = [];
    lnglats = []
    posDiv.innerHTML='<div id="blank_item" class="input-item"><div class="input-item-prepend"><span class="input-item-text">点击地图添加经纬度</span></div><input type="text"></div>';
}

document.getElementById("regeo").onclick = regeoCode;
document.getElementById("clear").onclick = clear;

行政区查询

  • 行政区边界查询

使用DistrictSearch.search获取某个行政区的边界信息,并绘制行政区划边界。

<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.12&key=您申请的key值&plugin=AMap.DistrictSearch"></script>

//初始化地图对象,加载地图
var map = new AMap.Map("container", {
    resizeEnable: true,
    center: [116.397428, 39.90923],//地图中心点
    zoom: 10 //地图显示的缩放级别
});

var district = null;
var polygons=[];
function drawBounds() {
    //加载行政区划插件
    if(!district){
        //实例化DistrictSearch
        var opts = {
            subdistrict: 0,   //获取边界不需要返回下级行政区
            extensions: 'all',  //返回行政区边界坐标组等具体信息
            level: 'district'  //查询行政级别为 市
        };
        district = new AMap.DistrictSearch(opts);
    }
    //行政区查询
    // 使用setLevel修改查询级别
    district.setLevel(document.getElementById('level').value) 
    district.search(document.getElementById('district').value, function(status, result) {
        map.remove(polygons)//清除上次结果
        polygons = [];
        var bounds = result.districtList[0].boundaries;
        if (bounds) {
            for (var i = 0, l = bounds.length; i < l; i++) {
                //生成行政区划polygon
                var polygon = new AMap.Polygon({
                    strokeWeight: 1,
                    path: bounds[i],
                    fillOpacity: 0.4,
                    fillColor: '#80d8ff',
                    strokeColor: '#0091ea'
                });
                polygons.push(polygon);
            }
        }
        map.add(polygons)
        map.setFitView(polygons);//视口自适应
    });
}
document.getElementById('draw').onclick = drawBounds;
  • 下属行政区查询

使用DistrictSearch逐级别依次搜索下级行政区的信息,并生成下拉列表。

<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.12&key=您申请的key值&plugin=AMap.DistrictSearch"></script>

var map, district, polygons = [], citycode;
var citySelect = document.getElementById('city');
var districtSelect = document.getElementById('district');
var areaSelect = document.getElementById('street');

map = new AMap.Map('container', {
    resizeEnable: true,
    center: [116.30946, 39.937629],
    zoom: 3
});
//行政区划查询
var opts = {
    subdistrict: 1,   //返回下一级行政区
    showbiz:false  //最后一级返回街道信息
};
district = new AMap.DistrictSearch(opts);//注意:需要使用插件同步下发功能才能这样直接使用
district.search('中国', function(status, result) {
    if(status=='complete'){
        getData(result.districtList[0]);
    }
});
function getData(data,level) {
    var bounds = data.boundaries;
    if (bounds) {
        for (var i = 0, l = bounds.length; i < l; i++) {
            var polygon = new AMap.Polygon({
                map: map,
                strokeWeight: 1,
                strokeColor: '#0091ea',
                fillColor: '#80d8ff',
                fillOpacity: 0.2,
                path: bounds[i]
            });
            polygons.push(polygon);
        }
        map.setFitView();//地图自适应
    }
    
    //清空下一级别的下拉列表
    if (level === 'province') {
        citySelect.innerHTML = '';
        districtSelect.innerHTML = '';
        areaSelect.innerHTML = '';
    } else if (level === 'city') {
        districtSelect.innerHTML = '';
        areaSelect.innerHTML = '';
    } else if (level === 'district') {
        areaSelect.innerHTML = '';
    }

    var subList = data.districtList;
    if (subList) {
        var contentSub = new Option('--请选择--');
        var curlevel = subList[0].level;
        var curList =  document.querySelector('#' + curlevel);
        curList.add(contentSub);
        for (var i = 0, l = subList.length; i < l; i++) {
            var name = subList[i].name;
            var levelSub = subList[i].level;
            var cityCode = subList[i].citycode;
            contentSub = new Option(name);
            contentSub.setAttribute("value", levelSub);
            contentSub.center = subList[i].center;
            contentSub.adcode = subList[i].adcode;
            curList.add(contentSub);
        }
    }
    
}
function search(obj) {
    //清除地图上所有覆盖物
    for (var i = 0, l = polygons.length; i < l; i++) {
        polygons[i].setMap(null);
    }
    var option = obj[obj.options.selectedIndex];// options是所有选项的element集合
    var keyword = option.text; //关键字
    var adcode = option.adcode;
    district.setLevel(option.value); //行政区级别
    district.setExtensions('all');
    //行政区查询
    //按照adcode进行查询可以保证数据返回的唯一性
    district.search(adcode, function(status, result) {
        if(status === 'complete'){
            getData(result.districtList[0],obj.id);
        }
    });
}
function setCenter(obj){
    map.setCenter(obj[obj.options.selectedIndex].center)
}

公交信息查询

  • 使用 AMap.StationSearch 和『站点关键字』进行公交站点查询

<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.12&key=您申请的key值&plugin=AMap.StationSearch"></script>

function stationSearch() {
    var stationKeyWord  = document.getElementById('stationKeyWord').value
    if(!stationKeyWord) return
    //实例化公交站点查询类
    var station = new AMap.StationSearch({
        pageIndex: 1, //页码
        pageSize: 60, //单页显示结果条数
        city: '010'   //确定搜索城市
    });
    station.search(stationKeyWord, function(status, result) {
        if (status === 'complete' && result.info === 'OK') {
            stationSearch_CallBack(result); //  处理获取到的信息 生成marker
        } else {
            document.getElementById('tip').innerHTML = JSON.stringify(result);
        }
    });
}
/*公交站点查询返回数据解析*/
function stationSearch_CallBack(searchResult) {
    var stationArr = searchResult.stationInfo;
    var searchNum = stationArr.length;
    if (searchNum > 0) {
        document.getElementById('tip').innerHTML = '查询结果:共' + searchNum + '个相关站点';
        map.clearMap(); // 清楚所有的marker
        for (var i = 0; i < searchNum; i++) {
            var marker = new AMap.Marker({
                icon:new AMap.Icon({
                    image:'https://a.amap.com/jsapi_demos/static/resource/img/pin.png',
                    size:new AMap.Size(32,32),
                    imageSize:new AMap.Size(32,32)
                }),
                offset:new AMap.Pixel(-16,-32),
                position: stationArr[i].location,
                map: map,
                title: stationArr[i].name // 鼠标移入的文字站名提示
            });
            //  也可以自定义信息窗体
            // marker.info = new AMap.InfoWindow({
            //     content: stationArr[i].name,
            //     offset: new AMap.Pixel(0, -30)
            // });
            // marker.on('mouseover', function(e) {
            //     e.target.info.open(map, e.target.getPosition())
            // })
        }
        map.setFitView();
    }
} 
document.getElementById('search').onclick = stationSearch;
  • 使用 AMap.LineSearch 进行公交线路查询
/*
* 该示例主要流程分为三个步骤
* 1. 首先调用公交路线查询服务(lineSearch)
* 2. 根据返回结果解析,输出解析结果(lineSearch_Callback)
* 3. 在地图上绘制公交线路()
*/
var map = new AMap.Map("container", {
    resizeEnable: true,
    center: [116.397428, 39.90923],//地图中心点
    zoom: 13 //地图显示的缩放级别
});
var linesearch;
/*公交线路查询*/
function lineSearch() {
    var busLineName = document.getElementById('BusLineName').value;
    if(!busLineName) return;
    //实例化公交线路查询类,只取回一条路线
    if(!linesearch){
        linesearch = new AMap.LineSearch({
            pageIndex: 1,
            city: '北京',
            pageSize: 1,
            extensions: 'all'
        });
    }
    //搜索“536”相关公交线路
    linesearch.search(busLineName, function(status, result) {
        map.clearMap()
        if (status === 'complete' && result.info === 'OK') {
            lineSearch_Callback(result);
        } else {
            alert(result);
        }
    });
}
/*公交路线查询服务返回数据解析概况*/
function lineSearch_Callback(data) {
    var lineArr = data.lineInfo;
    var lineNum = data.lineInfo.length;
    if (lineNum == 0) {
    } else {
        for (var i = 0; i < lineNum; i++) {
            var pathArr = lineArr[i].path;
            var stops = lineArr[i].via_stops;
            var startPot = stops[0].location;
            var endPot = stops[stops.length - 1].location;
            if (i == 0) //作为示例,只绘制一条线路
            drawbusLine(startPot, endPot, pathArr);
        }
    }
}
/*绘制路线*/
function drawbusLine(startPot, endPot, BusArr) {
    //绘制起点,终点
    new AMap.Marker({
        map: map,
        position: startPot, //基点位置
        icon: "https://webapi.amap.com/theme/v1.3/markers/n/start.png",
        zIndex: 10
    });
    new AMap.Marker({
        map: map,
        position: endPot, //基点位置
        icon: "https://webapi.amap.com/theme/v1.3/markers/n/end.png",
        zIndex: 10
    });
    //绘制乘车的路线
    busPolyline = new AMap.Polyline({
        map: map,
        path: BusArr,
        strokeColor: "#09f",//线颜色
        strokeOpacity: 0.8,//线透明度
        isOutline:true,
        outlineColor:'white',
        strokeWeight: 6//线宽
    });
    map.setFitView();
}
lineSearch();
document.getElementById('search').onclick = lineSearch;

定位

使用CitySearch.getLocalCity可根据IP进行城市级定位,获得用户当前所在城市信息,适用于PC端以及GPS信号不佳的场景。

<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.12&key=您申请的key值&plugin=AMap.CitySearch"></script>

var map = new AMap.Map("container", {
    resizeEnable: true,
    center: [116.397428, 39.90923],
    zoom: 13
});
//获取用户所在城市信息
function showCityInfo() {
    //实例化城市查询类
    var citysearch = new AMap.CitySearch();
    //自动获取用户IP,返回当前城市
    citysearch.getLocalCity(function(status, result) {
        if (status === 'complete' && result.info === 'OK') {
            if (result && result.city && result.bounds) {
                var cityinfo = result.city;
                var citybounds = result.bounds;
                document.getElementById('info').innerHTML = '您当前所在城市:'+cityinfo;
                //地图显示当前城市
                map.setBounds(citybounds); // 指定当前地图显示范围,参数bounds为指定的范围。
            }
        } else {
            document.getElementById('info').innerHTML = result.info;
        }
    });
}
showCityInfo();

Map实例初始化时,不设定center时,API 将根据用户 IP 自动匹配地图中心点到用户所在城市的中心。

// 初始化地图时,若center属性缺省,地图默认定位到用户所在城市的中心
var map = new AMap.Map('container', {
    resizeEnable: true
});
document.getElementById('adcode').innerHTML='当前城市adcode:'+map.getAdcode()+'<br>'+
'当前中心点:'+map.getCenter()

使用Geolocation.getCurrentPosition获取当前位置,可用于依赖于于用户定位的场景。

AMap.plugin('AMap.Geolocation', function() {
    var geolocation = new AMap.Geolocation({
        enableHighAccuracy: true,//是否使用高精度定位,默认:true
        timeout: 10000,          //超过10秒后停止定位,默认:5s
        buttonPosition:'RT',    //定位按钮的停靠位置
        buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
        zoomToAccuracy: true,   //定位成功后是否自动调整地图视野到定位点

    });
    map.addControl(geolocation);
    geolocation.getCurrentPosition(function(status,result){
        if(status=='complete'){
            onComplete(result)
        }else{
            onError(result)
        }
    });
});
//解析定位结果
function onComplete(data) {
    document.getElementById('status').innerHTML='定位成功'
    var str = [];
    str.push('定位结果:' + data.position);
    str.push('定位类别:' + data.location_type);
    if(data.accuracy){
            str.push('精度:' + data.accuracy + ' 米');
    }//如为IP精确定位结果则没有精度信息
    str.push('是否经过偏移:' + (data.isConverted ? '是' : '否'));
    document.getElementById('result').innerHTML = str.join('<br>');
}

通过给Geolocation设定相关属性,可以自定义定位按钮、定位点和精度圆的显示样式以及是否显示

var map = new AMap.Map('container', {
    resizeEnable: true
});
var options = {
    'showButton': true,//是否显示定位按钮
    'buttonPosition': 'LB',//定位按钮的位置
    /* LT LB RT RB */
    'buttonOffset': new AMap.Pixel(10, 20),//定位按钮距离对应角落的距离
    'showMarker': true,//是否显示定位点
    'markerOptions':{//自定义定位点样式,同Marker的Options
        'offset': new AMap.Pixel(-18, -36),
        'content':'<img src="https://a.amap.com/jsapi_demos/static/resource/img/user.png" style="width:36px;height:36px"/>'
    },
    'showCircle': true,//是否显示定位精度圈
    'circleOptions': {//定位精度圈的样式
        'strokeColor': '#0093FF',
        'noSelect': true,
        'strokeOpacity': 0.5,
        'strokeWeight': 1,
        'fillColor': '#02B0FF',
        'fillOpacity': 0.25
    }
}
AMap.plugin(["AMap.Geolocation"], function() {
    var geolocation = new AMap.Geolocation(options);
    map.addControl(geolocation);
    geolocation.getCurrentPosition()
});

天气预报

使用Weather插件,获取指定地区的天气信息,可用于天气查询等场景。

 AMap.plugin('AMap.Weather', function() {
    var weather = new AMap.Weather();
    //查询实时天气信息, 查询的城市到行政级别的城市,如朝阳区、杭州市
    weather.getLive('朝阳区', function(err, data) {
        if (!err) {
            var str = [];
            str.push('<h4 >实时天气' + '</h4><hr>');
            str.push('<p>城市/区:' + data.city + '</p>');
            str.push('<p>天气:' + data.weather + '</p>');
            str.push('<p>温度:' + data.temperature + '℃</p>');
            str.push('<p>风向:' + data.windDirection + '</p>');
            str.push('<p>风力:' + data.windPower + ' 级</p>');
            str.push('<p>空气湿度:' + data.humidity + '</p>');
            str.push('<p>发布时间:' + data.reportTime + '</p>');
            var marker = new AMap.Marker({map: map, position: map.getCenter()});
            // 可使用map.setCity(val);设置当前行政区
            // 可使用DistrictSearch.search 获取行政区的信息
            var infoWin = new AMap.InfoWindow({
                content: '<div class="info" style="position:inherit;margin-bottom:0;">'+str.join('')+'</div><div class="sharp"></div>',
                isCustom:true,
                offset: new AMap.Pixel(0, -37)
            });
            infoWin.open(map, marker.getPosition());
            marker.on('mouseover', function() {
                infoWin.open(map, marker.getPosition());
            });
        }
    });
    //未来4天天气预报
    weather.getForecast('朝阳区', function(err, data) {
        if (err) {return;}
        var str = [];
        for (var i = 0,dayWeather; i < data.forecasts.length; i++) {
            dayWeather = data.forecasts[i];
            str.push(dayWeather.date+' <span class="weather">'+dayWeather.dayWeather+'</span> '+ dayWeather.nightTemp + '~' + dayWeather.dayTemp + '℃');
        }
        document.getElementById('forecast').innerHTML = str.join('<br>');
    });
});
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容