高德地图定位并匹配距离最近经销商

对移动端H5定位,基于浏览器的定位,准确获取经纬度,计算最近距离

定位插件

image.png

选用多个定位插件,最终决定使用高德地图的插件,在页面中引用http://webapi.amap.com/maps?v=1.4.4&key=您申请的key值 即可,然后再根据需求调用对应的函数,我所开发的项目使用API的是AMap.Geolocation获取当前浏览器的定位,AMap.CitySearch获取当前的城市信息。

页面结构


表单结构

image.png
<li class="province-city">
            <select id="ddlProvince" name="ddlProvince" class="ddlProvince" title="省/00" >
                <option value="0">选择省份</option>
            </select>
            <em class="select-icon select-province"></em>
            <select id="ddlCity" name="ddlCity" class="ddlCity">
                <option value="0">选择城市</option>
            </select>
            <em class="select-icon"></em>
        </li>
        <li>
            <span>经销商</span>
<select id="agency" name="agency" >
   <option value="0">选择经销商</option>
</select>
            <em class="select-icon"></em>
  
       </li>

处理好的省市经销商数据


image.png

表单数据绑定逻辑


image.png

定位函数

获取当前浏览器的定位经纬度

var D_province, D_city, D_agency;//对应的省市经销商
var clat, clng;//当前浏览器的经纬度
var geolocation;//地理定位函数
//加载地图,调用浏览器定位服务
var map = new AMap.Map('container', {
    resizeEnable: true
});
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) {
    clat = data.position.getLat();
    clng = data.position.getLng();
    console.log(data);
    //alert("浏览器定位成功");
}
 
//解析定位错误信息
function onError(data) {
    clat = 39.95751;
    clng = 116.33762;
    //alert("浏览器定位失败");
}

获取到定位的经纬度后,获取当前定位的省份和城市,并且对于省份和城市进行对比,分别对省市select赋值,然后再查询当前省市下的经销商列表,计算每个经销商距当前位置的距离,通过两点坐标计算距离,添加经销商的距离属性,然后通过冒泡排序函数,对经销商列表基于距离由小及大排序,取第一个值,便是距离最近的经销商,然后再赋值到select,最后完场了省市定位及最近经销商的定位。

var citysearch = new AMap.CitySearch();
//自动获取用户IP,返回当前城市
citysearch.getLocalCity(function (status, result) {
    if (status === 'complete' && result.info === 'OK') {
        if (result && result.city && result.bounds) {
            console.log(result.city, result.province, result.bounds, result);
            //result.city = "武汉市";
            //result.province = "湖北省";
            if (result.city == result.province) {//北京市等四大直辖市
                D_province = result.city.substr(0, 2);
                D_city = result.city;
            } else {//其他的省市
                D_province = result.province.substring(0, result.province.length - 1);
                D_city = result.city.substring(0, result.province.length - 1);
            }
            //对应的省市自动获取
            $('#ddlProvince option:contains("' + D_province + '")').attr('selected', 'true');
            $('#ddlProvince').addClass('changed');
            ProvinceData.BindCity('ddlProvince', 'ddlCity');
            $('#ddlCity option:contains("' + D_city + '")').attr('selected', 'true');
            $('#ddlCity').addClass('changed');
            ProvinceData.BindAgency('ddlProvince', 'ddlCity', 'agency');
            //查询省市对应的经销商列表,并计算距离
            for (var i = 0; i < Dealer.length; i++) {
                if (Dealer[i].dealer_name == D_province) {
                    var cityList = Dealer[i].city;
                    //console.log(cityList)
                    for (var n = 0; n < cityList.length; n++) {
                        if (cityList[n].dealer_name == D_city) {
                            var dealerList = cityList[n].dealer;
                            //计算两个坐标点之间的距离
                            for (var m = 0; m < dealerList.length; m++) {
                                dealerList[m].distance = Math.sqrt(Math.pow(dealerList[m].dealer_lat - clat, 2) + Math.pow(dealerList[m].dealer_lng - clng, 2));
                            }
                            //根据距离对经销商排序由近及远
                            function compare(property) {
                                return function (a, b) {
                                    var value1 = a[property];
                                    var value2 = b[property];
                                    return value1 - value2;
                                }
                            }
                            console.log(dealerList.sort(compare('distance')), dealerList[0]);
                            //获取最近的经销商
                            D_agency = dealerList[0].dealer_name;
                            $('#agency option:contains("' + D_agency + '")').attr('selected', 'true');
                            $('#agency').addClass('changed');
                        }
 
                    }
                }
            }
        }
    } else {
        console.log('定位失败');
    }
 
})

源码 https://github.com/Aimee1608/dwDemo

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容