前言:
肯定有很多人问了,为什么选择高德地图,不去选择使用人数较多的的百度地图呢,博主主要做的是h5混合开发app,刚开始用的就是百度地图,但是定位极其不准,相差很远,后来辗转反侧找到了高德地图,发现这家伙挺靠谱定位挺准的!!
第一章:显示地图
首先你需要引入,高德的js
<scrip type="text/javascript" src="http://webapi.amap.com/mapsv=1.4.3&key=a183eb8bdb7770ee13e e24a32b00ebc"></script>
<script src="//webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
这里面的key在实际开发中需要换成你自己的,这里是我的一个小例子
然后准备一个容器
<div id="container" style="width:100%; height:800px"></div>
注意:容器需要有具体的,宽和高,如果没有设置的话,是看不见的,我刚开始在这里卡了好久,其他的都是正确的,地图就是不出来,后来发现是没设置宽高,
初始化地图
var map = new AMap.Map('container', {
zoom: 20,
center: [116.39, 39.9]
});
到这里一个地图就可以显示出来了
第二章:精确定位
地图显示出来了,下一步肯定是需要精确定位了
var map, geolocation;
//加载地图,调用浏览器定位服务
map = new AMap.Map('container', {
resizeEnable: true,
zoom: 15
});
map.plugin('AMap.Geolocation', function() {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true,//是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
zoomToAccuracy: true, //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,
buttonPosition:'RB'
});
map.addControl(geolocation);
geolocation.getCurrentPosition();
AMap.event.addListener(geolocation, 'complete', onComplete);//返回定位信息
AMap.event.addListener(geolocation, 'error', onError); //返回定位出错信息
});
//解析定位结果
function onComplete(data) {
console.log(data)
}
//解析定位错误信息
function onError(data) {
console.log(data)
}
定位成功后或获取到当前位置信息,但是好像谷歌浏览器会报错,好像是因为服务器在国外,
这里有篇帖子详细介绍高精度定位报错原因:
第三章:创建信息窗体
var infoWindow = new AMap.InfoWindow({
content: info.join("<br>") //使用默认信息窗体框样式,显示信息内容
});
infoWindow.open(map, [116.39, 39.9]);
这个没什么好说的,一般使用默认信息窗体就ok,一般也不会单独使用,都是结合定位和事件使用
第四章:逆地理编码
这个也是比较常用的功能,所谓逆地理编码,就是根据经纬度查地名,或者根据地名查询经纬度
AMap.service('AMap.Geocoder', function() {
实例化Geocoder
geocoder = new AMap.Geocoder({
city: "" //城市,默认:“全国”
});
// 根据经纬度查地址
var lnglatXY = [116.396574, 39.992706]; //地图上所标点的坐标
geocoder.getAddress(lnglatXY, function(status, result) {
if(status === 'complete' && result.info === 'OK') {
info.push(result.regeocode.formattedAddress)
var infoWindow = new AMap.InfoWindow({
content: info.join("<br>") //使用默认信息窗体框样式,显示信息内容
});
infoWindow.open(map, [116.39, 39.9]);
} else {
//获取地址失败
}
});
根据地址查经纬度
geocoder.getLocation("北京市海淀区苏州街", function(status, result) {
if(status === 'complete' && result.info === 'OK') {
console.log(result.geocodes[0].location)
} else {
//获取经纬度失败
}
});
})
第五章:路线规划
AMap.service('AMap.Driving', function() { //回调函数
//实例化Driving
driving = new AMap.Driving({
city: '北京市'
});
var driving = new AMap.Driving({
map: map,
panel: "panel"
});
driving.search([116.379028, 39.865042], [116.427281, 39.903719], function(status, result) {
//TODO 解析返回结果,自己生成操作界面和地图展示界面
});
传名称
driving.search([{keyword:'方恒国际',city:'北京'},{keyword:'壶口瀑布'}], function(status, result){
console.log(result.routes[0])
});
})
第六章:事件系统
var _onClick = function(e) {
AMap.service('AMap.Geocoder', function() {
geocoder = new AMap.Geocoder({
city: ""
});
geocoder.getAddress(e.lnglat, function(status, result) {
if(status === 'complete' && result.info === 'OK') {
var info = [];
info.push(result.regeocode.formattedAddress)
new AMap.InfoWindow({
content: info.join("<br>") //使用默认信息窗体框样式,显示信息内容
}).open(map, e.lnglat);
console.log(result.regeocode.formattedAddress)
}
});
})
}
AMap.event.addListener(map, "click", _onClick);
第七章:搜索加搜索提示
AMapUI.loadUI(['misc/PoiPicker'], function(PoiPicker) {
var poiPicker = new PoiPicker({
//city:'北京',
input: 'pickerInput'
});
//初始化poiPicker
poiPickerReady(poiPicker);
});
function poiPickerReady(poiPicker) {
window.poiPicker = poiPicker;
var marker = new AMap.Marker();
var infoWindow = new AMap.InfoWindow({
offset: new AMap.Pixel(0, 0)
});
//选取了某个POI
poiPicker.on('poiPicked', function(poiResult) {
console.log(poiResult)
var source = poiResult.source,
poi = poiResult.item,
info = {
source: source,
id: poi.id,
name: poi.name,
location: poi.location.toString(),
address: poi.address
};
AMap.service('AMap.Geocoder', function() { //回调函数
//实例化Geocoder
geocoder = new AMap.Geocoder({
city: "" //城市,默认:“全国”
});
geocoder.getAddress(poiResult.item.location, function(status, result) {
if(status === 'complete' && result.info === 'OK') {
console.log(result.regeocode.formattedAddress)
infoWindow.setContent('搜索结果: <pre>' + result.regeocode.formattedAddress + '</pre>');
infoWindow.open(map, marker.getPosition());
} else {
//获取地址失败
}
});
})
// marker.setMap(map);
infoWindow.setMap(map);
// marker.setPosition(poi.location);
infoWindow.setPosition(poi.location);
map.setCenter(infoWindow.getPosition());
});
}
第八章:总结
有些人会说我,都是贴代码,也没有讲解,但是我觉得吧,没什么需要讲的,把代码复制过去浏览器打开看一下效果,基本都能理解,复用
第九章:完整代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<title></title>
<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.3&key=a183eb8bdb7770ee13ee24a32b00ebec"></script>
<script src="//webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
</head>
<style type="text/css">
#pickerBox {
position: absolute;
z-index: 9999;
top: 50px;
right: 30px;
width: 300px;
}
#panel {
height: 500px;
}
</style>
<body>
<div id="container" style="width:100%; height:800px"></div>
<div id="pickerBox">
<input id="pickerInput" placeholder="输入关键字选取地点" />
<div id="poiInfo"></div>
</div>
<div id="panel">
</div>
</body>
<script type="text/javascript">
//
-------------------------------------------------------------初始化地图----------------------------------------------
var map = new AMap.Map('container', {
zoom: 15,
center: [116.39, 39.9]
});
var info = [];
//
-------------------------------------------------------------高精度定位---------------------------------------------
var map, geolocation;
//加载地图,调用浏览器定位服务
map = new AMap.Map('container', {
resizeEnable: true,
zoom: 15
});
map.plugin('AMap.Geolocation', function() {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true, //是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
buttonOffset: new AMap.Pixel(10, 20), //定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
zoomToAccuracy: true, //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
buttonPosition: 'RB'
});
map.addControl(geolocation);
geolocation.getCurrentPosition();
AMap.event.addListener(geolocation, 'complete', onComplete); //返回定位信息
AMap.event.addListener(geolocation, 'error', onError); //返回定位出错信息
});
//解析定位结果
function onComplete(data) {
console.log(data)
}
//解析定位错误信息
function onError(data) {
console.log(data)
}
//
-------------------------------------------------------------创建信息窗体--------------------------------
//
var infoWindow = new AMap.InfoWindow({
//
content: info.join("<br>") //使用默认信息窗体框样式,显示信息内容
//
});
//
infoWindow.open(map, [116.39, 39.9]);
//
-------------------------------------------------------------搜索提示加地名搜索--------------------------------------------
AMapUI.loadUI(['misc/PoiPicker'], function(PoiPicker) {
var poiPicker = new PoiPicker({
//city:'北京',
input: 'pickerInput'
});
//初始化poiPicker
poiPickerReady(poiPicker);
});
function poiPickerReady(poiPicker) {
window.poiPicker = poiPicker;
var marker = new AMap.Marker();
var infoWindow = new AMap.InfoWindow({
offset: new AMap.Pixel(0, 0)
});
//选取了某个POI
poiPicker.on('poiPicked', function(poiResult) {
console.log(poiResult)
var source = poiResult.source,
poi = poiResult.item,
info = {
source: source,
id: poi.id,
name: poi.name,
location: poi.location.toString(),
address: poi.address
};
AMap.service('AMap.Geocoder', function() { //回调函数
//实例化Geocoder
geocoder = new AMap.Geocoder({
city: "" //城市,默认:“全国”
});
geocoder.getAddress(poiResult.item.location, function(status, result) {
if(status === 'complete' && result.info === 'OK') {
console.log(result.regeocode.formattedAddress)
infoWindow.setContent('搜索结果: <pre>' + result.regeocode.formattedAddress + '</pre>');
infoWindow.open(map, marker.getPosition());
} else {
//获取地址失败
}
});
})
//
marker.setMap(map);
infoWindow.setMap(map);
//
marker.setPosition(poi.location);
infoWindow.setPosition(poi.location);
map.setCenter(infoWindow.getPosition());
});
}
//
--------------------------------------------------------------逆地理编码----------------------------------------------------------------------
AMap.service('AMap.Geocoder', function() {
实例化Geocoder
geocoder = new AMap.Geocoder({
city: "" //城市,默认:“全国”
});
//
根据经纬度查地址
var lnglatXY = [116.396574, 39.992706]; //地图上所标点的坐标
geocoder.getAddress(lnglatXY, function(status, result) {
if(status === 'complete' && result.info === 'OK') {
info.push(result.regeocode.formattedAddress)
var infoWindow = new AMap.InfoWindow({
content: info.join("<br>") //使用默认信息窗体框样式,显示信息内容
});
infoWindow.open(map, [116.39, 39.9]);
} else {
//获取地址失败
}
});
根据地址查经纬度
geocoder.getLocation("北京市海淀区苏州街", function(status, result) {
if(status === 'complete' && result.info === 'OK') {
console.log(result.geocodes[0].location)
} else {
//获取经纬度失败
}
});
})
//
-------------------------------------------------------------路线规划--------------------------------------------------------------------------
AMap.service('AMap.Driving', function() { //回调函数
//实例化Driving
driving = new AMap.Driving({
city: '北京市'
});
var driving = new AMap.Driving({
map: map,
panel: "panel"
});
driving.search([116.379028, 39.865042], [116.427281, 39.903719], function(status, result) {
//TODO 解析返回结果,自己生成操作界面和地图展示界面
});
传名称
driving.search([{keyword:'方恒国际',city:'北京'},{keyword:'壶口瀑布'}], function(status, result){
console.log(result.routes[0])
});
})
//
------------------------------------------------------------事件系统----------------------------------------------
var _onClick = function(e) {
AMap.service('AMap.Geocoder', function() {
geocoder = new AMap.Geocoder({
city: ""
});
geocoder.getAddress(e.lnglat, function(status, result) {
if(status === 'complete' && result.info === 'OK') {
var info = [];
info.push(result.regeocode.formattedAddress)
new AMap.InfoWindow({
content: info.join("<br>") //使用默认信息窗体框样式,显示信息内容
}).open(map, e.lnglat);
console.log(result.regeocode.formattedAddress)
}
});
})
}
AMap.event.addListener(map, "click", _onClick);
</script>
</html>