wx地址和腾讯地图
如果只是要获取当前用户的经纬度和打开微信自带的地图
只需要
jsApiList: ["getLocation","openLocation"]
// 先获得
wx.getLocation({
type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
var speed = res.speed; // 速度,以米/每秒计
var accuracy = res.accuracy; // 位置精度
// 通过获得的经纬度打开地图
openMap(longitude,latitude)
}
});
function openMap(lng,lat){
wx.openLocation({
latitude: 0, // 纬度,浮点数,范围为90 ~ -90
longitude: 0, // 经度,浮点数,范围为180 ~ -180。
name: '', // 位置名
address: '', // 地址详情说明
scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大
infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转
});
}
如果还要详细地址或者地图可以操作,需要借助百度地图,腾讯地图,高德的帮助
但是因为是微信,当然选自家的产品了
使用腾讯地图
开发文档
需要申请腾讯API的使用权,就是Key,从上面的开发文档地址进去,找到常见问题,点击申请Key,如果看不懂就赶紧回去读初中吧
引入js,目前没有本地文件,只能用cdn
//YOUR_KE 就是申请到的Key
<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=YOUR_KEY"></script>
然后查看开发文档的示例,复制代码测试就行
常用的功能有【创建地图,改变地图中心,地址解析,逆地址解析,点击地图事件,点击地图时只添加一个标记,向地图上添加一个圆,给圆形覆盖物绑定单击事件】
将上面的功能融合成一个能搜索,能修改位置,能获取位置,能再次定位的插件
<div id="mapBox" style="display: none;"></div>
<div id="nowPlace">正在定位...</div>
<div id="getPlace">不准确? 重新定位</div>
#mapBox{
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 100;
background-color: white;
}
function wxGetLocation(cb,getSuccess) {
//alert('进入了wxGetLocation')
if(arguments.length==2){
//alert('arguments.length')
wx.getLocation({
type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02' | wgs84
success: function (res) {
//alert("185"+JSON.stringify(res))
// console.log('获得了wxGetLocation的res')
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
var speed = res.speed; // 速度,以米/每秒计
var accuracy = res.accuracy; // 位置精度
// 把经纬度传给腾讯地图获得准确地点,微信是没提供准确地点的api的
cb(res,getSuccess)
},
error:function (res) {
// console.log('wx.getLocation报错'+JSON.stringify(res));
}
});
}
}
function qqMapGetPlace(res,getSuccess) {
//alert('进入了qqMapGetPlace')
geocoder = new qq.maps.Geocoder({
complete : function(result){
//alert('获得了qqMapGetPlace的result')
getSuccess(result)
}
});
var latLng = new qq.maps.LatLng(res.latitude,res.longitude);
geocoder.getAddress(latLng);
}
function qqMapOpen(loc,opt) {
var newloc = "";
var marker = "";
var zoom = opt.zoom || 15;
var now = new Date().getTime();
var domId = 'map_'+ now;
var str = `<div id="${domId}" style="width:${opt.width};height:${opt.height};"></div><div id="btnGroup_${now}" style="position: fixed;width: 10%;bottom: 0;right: 0;"></div>`;
$('#'+opt.id).append(str);
map = new qq.maps.Map(document.getElementById(domId), {
center: new qq.maps.LatLng(loc.lat,loc.lng), // 地图的中心地理坐标。
zoom:zoom // 地图的中心地理坐标。
});
marker=new qq.maps.Marker({
position: loc,
map:map
});
// 添加返回页面的功能
var str = `<img id="close_${now}" src="img/close.svg" style="width:100%;background-color: white;border-radius: 50%;"/> `;
$('#btnGroup_'+now).append(str);
$('#close_'+now).click(function () {
if(opt.onClose){
opt.onClose($('#map_'+now)[0],newloc)
}
})
//添加可以修改位置的功能
if(opt.isChange){
if(opt.radius){
var changeScopeLat = opt.changeScopeLat || loc.lat;
var changeScopeLng = opt.changeScopeLng || loc.lng;
var circle=new qq.maps.Circle({
map:map,
center:new qq.maps.LatLng(changeScopeLat,changeScopeLng),
radius:opt.radius,
strokeWeight:1
});
qq.maps.event.addListener(circle,"click",function(event){
newloc = event;
if(marker){
marker.setMap(null);
}
marker=new qq.maps.Marker({
position:event.latLng,
map:map
});
});
}else{
//添加监听事件 获取鼠标单击事件
qq.maps.event.addListener(map, 'click', function(event) {
newloc = event;
if(marker){
marker.setMap(null);
}
marker=new qq.maps.Marker({
position:event.latLng,
map:map
});
});
}
// 添加回到原点的功能
var str = `<img id="return_${now}" src="img/local.svg" style="width:100%;background-color: white;border-radius: 50%;"/> `;
$('#btnGroup_'+now).prepend(str);
$('#return_'+now).click(function () {
map.setCenter(loc);
map.zoomTo(zoom);
if(marker){
marker.setMap(null);
marker=new qq.maps.Marker({
position:loc,
map:map
});
}
})
}
//添加搜索框
if(opt.isFind){
var str = `<div style="position: fixed;width: 100%;top: 0; left:0; background-color: #f0f0f0;display: flex;align-items: center;z-index: 1;padding: 0.5rem;">
<div style="flex: 1">
<input id="inp_${now}" type="text" style="width: 100%;padding:0.4rem;border:1px solid rgb(200,200,200);border-radius:0.2rem;" placeholder="输入详细地址">
</div>
<img id="find_${now}" src="img/find.png" alt="" style="width:1rem;margin-left: 0.5rem;">
</div> `;
$('#map_'+now).append(str);
findGeocoder = new qq.maps.Geocoder({
complete : function(result){
map.zoomTo(zoom);
map.setCenter(result.detail.location);
}
});
$('#find_'+now).click(function () {
var val = $('#inp_'+now).val().trim()
findGeocoder.getLocation(val);
})
}
}
如何使用
// 在最上面声明
var locat = {}
var firstPlace = {}
wx.ready(function(){
getPlace({first:1})
})
function getPlace(opt){
wxGetLocation(qqMapGetPlace,function (res) {
locat = res.detail.location; //根据点击会发生改变
firstPlace = {
latitude:locat.lat,
longitude:locat.lng
}; //不重新获取是不变的
var addressComponents = res.detail.addressComponents;
var str = addressComponents.province+addressComponents.city+addressComponents.district+addressComponents.street+addressComponents.streetNumber;
locat.address = str;
$('#nowPlace').html(str);
if(opt.first){
$('#nowPlace').click(function () {
qqMapOpen(locat,{
'id':'mapBox',
'width':'100%',
'height':'100%',
'isChange':true,
'isFind':true,
'radius':50,
'zoom':18,
'changeScopeLat':firstPlace.latitude,
'changeScopeLng':firstPlace.longitude,
onClose:function (p,newloc) {
$(p).remove();
$('#mapBox').hide()
if(newloc){
locat = newloc.latLng;
qqMapGetPlace({latitude:locat.lat,longitude:locat.lng},function (newPlace) {
locat.address = newPlace.detail.address;
$('#nowPlace').html(newPlace.detail.address);
})
}
}
})
$('#mapBox').show()
})
$('#getPlace').click(function () { getPlace({}) })
}
})
}
还需要一个img文件夹,有三个图标
一个是local.svg
一个是close.svg
一个是find.png
效果图如下