当前位置: 代码网 > it编程>编程语言>Javascript > JQuery+HTML+JavaScript:实现地图位置选取和地址模糊查询

JQuery+HTML+JavaScript:实现地图位置选取和地址模糊查询

2024年07月28日 Javascript 我要评论
本文详细讲解了如何使用 `JQuery+HTML+JavaScript` 实现移动端页面中的地图位置选取功能。本文逐步展示了如何构建基本的地图页面,如何通过点击地图获取经纬度和地理信息,以及如何实现模糊查询地址并在地图上标注。最后,提供了完整的代码示例,并总结了基于地图API进行地图位置选点的开发过程,帮助开发者快速上手并应用到实际项目中。

本文详细讲解了如何使用 jquery+html+javascript 实现移动端页面中的地图位置选取功能。本文逐步展示了如何构建基本的地图页面,如何通过点击地图获取经纬度和地理信息,以及如何实现模糊查询地址并在地图上标注。最后,提供了完整的代码示例,并总结了基于地图api进行地图位置选点的开发过程,帮助开发者快速上手并应用到实际项目中。


一、百度地图api介绍

百度地图api为开发者提供了强大的地理信息服务,可以轻松实现地图显示、位置选取、路线规划等功能。这里主要介绍2.0版本和3.0版本的功能示例,以及路书的介绍。

2.0 api

2.0版本的api功能相对较少,主要用于简单的地图展示和位置标注,以下是一个基本的示例:

var map = new bmap.map("container");
var point = new bmap.point(116.404, 39.915);
map.centerandzoom(point, 15);

3.0 api

3.0版本增加了更多的功能和优化,提升了地图加载速度和交互体验,以下是一个展示地图和标注的示例:

var map = new bmap.map("container");
var point = new bmap.point(116.404, 39.915);
map.centerandzoom(point, 15);
var marker = new bmap.marker(point);
map.addoverlay(marker);

百度路书

路书是百度地图api提供的一种记录和展示路线的功能,可以用来展示旅游路线、出行规划等,以下是一个基本示例:

var driving = new bmap.drivingroute(map, {
  renderoptions: { map: map, autoviewport: true }
});
driving.search("起点", "终点");

本文将采用百度地图3.0 api来实现地图位置选点的功能,包括地图展示、点击地图选点、地理信息转经纬度、位置的模糊查询等。


二、初始化地图页面

首先,创建一个基本的html页面,并引入百度地图api:

<!doctype html>
<html>
<head>
  <title>点击地图获取地址和经纬度</title>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <script type="text/javascript" src="https://api.map.baidu.com/getscript?v=3.0&ak=你的ak&s=1"></script>
  <style>
    body, html {
      margin: 0;
      padding: 0;
      height: 100%;
      overflow: hidden;
    }
    .main-div {
      position: relative;
      height: 100%;
      display: flex;
      flex-direction: column;
    }
    form {
      background: #f8f8f8;
      padding: 5px;
    }
    .input-group {
      display: flex;
      align-items: center;
      margin-bottom: 5px;
    }
    label {
      flex: 0 0 60px;
      margin-right: 15px;
      white-space: nowrap;
    }
    input[type="text"] {
      flex: 1;
      padding: 10px;
      box-sizing: border-box;
    }
    #allmap {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 0px;
    }
  </style>
</head>
<body>
  <div class="main-div">
    <div id="allmap"></div>
  </div>
</body>
<script>
  var map = new bmap.map("allmap");
  var point = new bmap.point(116.404, 39.915);
  map.centerandzoom(point, 15);
</script>
</html>

实现效果:

在这里插入图片描述


三、增加地理信息模态框

在页面上方添加一个表单,用于显示和输入经纬度和地理信息:

<form>
  <div class="input-group">
    <label for="lng">经度</label>
    <input type="text" name="lng" id="lng" value="" readonly />
  </div>
  <div class="input-group">
    <label for="lat">纬度</label>
    <input type="text" name="lat" id="lat" value="" readonly />
  </div>
  <div class="input-group">
    <label for="address">地址</label>
    <input type="text" name="address" id="address" />
  </div>
</form>

将这段表单代码加入到 main-div 里。

同时,我们需要将地图向下移动240px,给模态框留出空间,字体修改为40px,适应手机端页面。

修改及新增的css如下(没有修改的样式继续保留):

  <style>
    label {
      flex: 0 0 60px;
      margin-right: 15px;
      white-space: nowrap;
      font-size: 40px;
    }

    input[type="text"] {
      flex: 1;
      padding: 10px;
      box-sizing: border-box;
      font-size: 40px;
    }

    #allmap {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 240px;
    }

    .tangram-suggestion table {
      width: 100% !important;
      font-size: 32px !important;
      line-height: 50px !important;
      cursor: default !important;
    }

    .tangram-suggestion table tr td{
      line-height: 40px !important;
      height: 60px !important;
    }
  </style>

实现效果如图:

在这里插入图片描述

目前我们的表单还只是一个静态的,下面我们来实现给表单的动态赋值。


四、实现地图点击事件

下面,我们为地图添加点击事件,获取点击位置的经纬度,并通过 geocoder 获取地理信息,将获取的经纬度填充到上方表单。

javascript 里添加如下代码:

map.addeventlistener("click", function(e) {
  document.getelementbyid('lng').value = e.point.lng;
  document.getelementbyid('lat').value = e.point.lat;
  var geoc = new bmap.geocoder();
  geoc.getlocation(e.point, function(rs) {
    var addcomp = rs.addresscomponents;
    document.getelementbyid('address').value = addcomp.province + addcomp.city + addcomp.district + addcomp.street + addcomp.streetnumber;
  });
});

实现效果如图:

在这里插入图片描述

点击地图上位置时,会触发点击事件,自动为上方表单动态赋值经纬度。

接着,我们优化代码,打开页面时自动定位到我们的位置,并实现点击事件时经纬度、地址的填充。

javascript 内容全部替换为:

  var map = new bmap.map("allmap");
  var geoc = new bmap.geocoder();  //地址解析对象
  var markersarray = [];
  var geolocation = new bmap.geolocation();
  var point = new bmap.point(116.331398, 39.897445);
  map.centerandzoom(point, 32); // 中心点
  
  geolocation.getcurrentposition(function (r) {
    if (this.getstatus() == bmap_status_success) {
      var mk = new bmap.marker(r.point);
      map.addoverlay(mk);
      map.panto(r.point);
      map.enablescrollwheelzoom(true);
    }
    else {
      alert('failed' + this.getstatus());
    }
  }, { enablehighaccuracy: true })
  
  map.addeventlistener("click", showinfo);
  
  //清除标识
  function clearoverlays() {
    if (markersarray) {
      for (i in markersarray) {
        map.removeoverlay(markersarray[i])
      }
    }
  }
  
  //地图上标注
  function addmarker(point) {
    var marker = new bmap.marker(point);
    markersarray.push(marker);
    clearoverlays();
    map.addoverlay(marker);
  }
  
  //点击地图事件处理
  function showinfo(e) {
    document.getelementbyid('lng').value = e.point.lng;
    document.getelementbyid('lat').value = e.point.lat;
    geoc.getlocation(e.point, function (rs) {
      var addcomp = rs.addresscomponents;
      var address = addcomp.province + addcomp.city + addcomp.district + addcomp.street + addcomp.streetnumber;
      document.getelementbyid('sever_add').value = address;
    });
    map.clearoverlays();
    addmarker(e.point);
  }

实现效果如下:

在这里插入图片描述

至此,地图选取位置获得经纬度和地址信息的功能已经完成。

下面,我们来实现输入模糊地址来反向定位地图中的坐标,并获得精确的位置经纬度。


五、输入模糊地址定位地图坐标

通过autocomplete实现地址模糊查询,并在选定地址后在地图上标注位置。

首先,我们给地址输入框的输入进行校验,增加javascript代码:

function validate() {
    var sever_add = document.getelementsbyname('sever_add')[0].value;
    if (isnull(sever_add)) {
      alert('请选择地址');
      return false;
    }
    return true;
  }
  //判断是否是空
  function isnull(a) {
    return (a == '' || typeof (a) == 'undefined' || a == null) ? true : false;
  }
}

接着,增加输入后的下列框事件和下拉框点击事件:


  var ac = new bmap.autocomplete(    //建立一个自动完成的对象
    {
      "input": "sever_add"
      , "location": map
    });

  ac.addeventlistener("onhighlight", function (e) {  //鼠标放在下拉列表上的事件
    var str = "";
    var _value = e.fromitem.value;
    var value = "";
    if (e.fromitem.index > -1) {
      value = _value.province + _value.city + _value.district + _value.street + _value.business;
    }
    str = "fromitem<br />index = " + e.fromitem.index + "<br />value = " + value;

    value = "";
    if (e.toitem.index > -1) {
      _value = e.toitem.value;
      value = _value.province + _value.city + _value.district + _value.street + _value.business;
    }
    str += "<br />toitem<br />index = " + e.toitem.index + "<br />value = " + value;
  });

  var myvalue;
  ac.addeventlistener("onconfirm", function (e) {    //鼠标点击下拉列表后的事件
    var _value = e.item.value;
    myvalue = _value.province + _value.city + _value.district + _value.street + _value.business;
    setplace();

  });

  function setplace() {
    map.clearoverlays();    //清除地图上所有覆盖物
    function myfun() {
      var pp = local.getresults().getpoi(0).point;    //获取第一个智能搜索的结果
      map.centerandzoom(pp, 32);
      map.addoverlay(new bmap.marker(pp));    //添加标注
      document.getelementbyid('lng').value = pp.lng;
      document.getelementbyid('lat').value = pp.lat;
    }
    var local = new bmap.localsearch(map, { //智能搜索
      onsearchcomplete: myfun
    });
    local.search(myvalue);
  }

实现效果如下:

输入 “云龙湖”,会显示模糊查询到的地点。
在这里插入图片描述

选择地点,地图自动跳转到目标地点为中心的界面,显示目标点标注,并返回经纬度、详细地址给上方表单。

在这里插入图片描述

至此,输入模糊地址定位地图坐标的功能已经实现。


六、页面全部源码

下面是本文页面的全部代码,为了方便测试,已经把 javascriptcsshtml 写在一个页面内。

完整的源码如下:

<!doctype html
  public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title>点击地图获取地址和经纬度map,address,lng,lat</title>
  <meta name="robots" content="noindex, nofollow">
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <script type="text/javascript"
    src="https://api.map.baidu.com/getscript?v=3.0&ak=你的ak&s=1"></script>
  <style>
    body,
    html {
      margin: 0;
      padding: 0;
      height: 100%;
      overflow: hidden;
    }

    .main-div {
      position: relative;
      height: 100%;
      display: flex;
      flex-direction: column;
    }

    form {
      background: #f8f8f8;
      padding: 5px;
    }

    .input-group {
      display: flex;
      align-items: center;
      margin-bottom: 5px;
    }

    label {
      flex: 0 0 60px;
      margin-right: 15px;
      white-space: nowrap;
      font-size: 40px;
    }

    input[type="text"] {
      flex: 1;
      padding: 10px;
      box-sizing: border-box;
      font-size: 40px;
    }

    #allmap {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 240px;
    }

    .tangram-suggestion table {
      width: 100% !important;
      font-size: 32px !important;
      line-height: 50px !important;
      cursor: default !important;
    }

    .tangram-suggestion table tr td{
      line-height: 40px !important;
      height: 60px !important;
    }

  </style>
</head>

<body>
  <div class="main-div">
    <form method="post" action="" name="theform" enctype="multipart/form-data" onsubmit="return validate()">
      <div class="input-group">
        <label for="lng">经度</label>
        <input type="text" name="lng" id="lng" value="" readonly/>
      </div>
      <div class="input-group">
        <label for="lat">纬度</label>
        <input type="text" name="lat" id="lat" value="" readonly/>
      </div>
      <div class="input-group">
        <label for="sever_add">地址</label>
        <input type="text" name="sever_add" id="sever_add" value="" />
      </div>
    </form>
    <div id='allmap'></div>
  </div>
</body>

<script type="text/javascript">

  function validate() {
    var sever_add = document.getelementsbyname('sever_add')[0].value;
    if (isnull(sever_add)) {
      alert('请选择地址');
      return false;
    }
    return true;
  }
  
  //判断是否是空
  function isnull(a) {
    return (a == '' || typeof (a) == 'undefined' || a == null) ? true : false;
  }
  
  var map = new bmap.map("allmap");
  var geoc = new bmap.geocoder();  //地址解析对象
  var markersarray = [];
  var geolocation = new bmap.geolocation();
  var point = new bmap.point(116.331398, 39.897445);
  map.centerandzoom(point, 32); // 中心点
  geolocation.getcurrentposition(function (r) {
    if (this.getstatus() == bmap_status_success) {
      var mk = new bmap.marker(r.point);
      map.addoverlay(mk);
      map.panto(r.point);
      map.enablescrollwheelzoom(true);
    }
    else {
      alert('failed' + this.getstatus());
    }
  }, { enablehighaccuracy: true })
  
  map.addeventlistener("click", showinfo);
  
  //清除标识
  function clearoverlays() {
    if (markersarray) {
      for (i in markersarray) {
        map.removeoverlay(markersarray[i])
      }
    }
  }
  
  //地图上标注
  function addmarker(point) {
    var marker = new bmap.marker(point);
    markersarray.push(marker);
    clearoverlays();
    map.addoverlay(marker);
  }
  
  //点击地图事件处理
  function showinfo(e) {
    document.getelementbyid('lng').value = e.point.lng;
    document.getelementbyid('lat').value = e.point.lat;
    geoc.getlocation(e.point, function (rs) {
      var addcomp = rs.addresscomponents;
      var address = addcomp.province + addcomp.city + addcomp.district + addcomp.street + addcomp.streetnumber;
      document.getelementbyid('sever_add').value = address;
    });
    map.clearoverlays();
    addmarker(e.point);
  }

  var ac = new bmap.autocomplete(    //建立一个自动完成的对象
    {
      "input": "sever_add"
      , "location": map
    });

  ac.addeventlistener("onhighlight", function (e) {  //鼠标放在下拉列表上的事件
    var str = "";
    var _value = e.fromitem.value;
    var value = "";
    if (e.fromitem.index > -1) {
      value = _value.province + _value.city + _value.district + _value.street + _value.business;
    }
    str = "fromitem<br />index = " + e.fromitem.index + "<br />value = " + value;

    value = "";
    if (e.toitem.index > -1) {
      _value = e.toitem.value;
      value = _value.province + _value.city + _value.district + _value.street + _value.business;
    }
    str += "<br />toitem<br />index = " + e.toitem.index + "<br />value = " + value;
  });

  var myvalue;
  ac.addeventlistener("onconfirm", function (e) {    //鼠标点击下拉列表后的事件
    var _value = e.item.value;
    myvalue = _value.province + _value.city + _value.district + _value.street + _value.business;
    setplace();

  });

  function setplace() {
    map.clearoverlays();    //清除地图上所有覆盖物
    function myfun() {
      var pp = local.getresults().getpoi(0).point;    //获取第一个智能搜索的结果
      map.centerandzoom(pp, 32);
      map.addoverlay(new bmap.marker(pp));    //添加标注
      document.getelementbyid('lng').value = pp.lng;
      document.getelementbyid('lat').value = pp.lat;
    }
    var local = new bmap.localsearch(map, { //智能搜索
      onsearchcomplete: myfun
    });
    local.search(myvalue);
  }
</script>

</html>

七、可视化地图上位置选取功能总结

通过百度地图api,我们可以方便地实现地图位置选点的功能,提升用户体验。在本文中,我们介绍了如何构建基本的地图页面,如何实现点击地图获取经纬度和地理信息,以及通过模糊查询来标注地图位置。希望这篇教程能够帮助你快速上手百度地图api,并应用到实际项目中。

当然,地图的api还有很多,下面整理了一份目前市面上常用地图api对比,希望对你有所帮助。

地图api提供商主要功能优点缺点
百度地图api百度地图展示、位置选取、路线规划、地理编码、逆地理编码、poi搜索覆盖中国范围广,中文支持好,提供详细的中国本地数据国际覆盖范围有限
谷歌地图apigoogle地图展示、位置选取、路线规划、地理编码、逆地理编码、街景服务国际覆盖范围广,数据更新及时,街景服务优秀国内使用受限
高德地图api阿里巴巴地图展示、位置选取、路线规划、地理编码、逆地理编码、poi搜索中国本地数据详细,支持多种出行方式国际覆盖范围有限
腾讯地图api腾讯地图展示、位置选取、路线规划、地理编码、逆地理编码、poi搜索提供丰富的中国本地数据,接口简单易用国际覆盖范围有限
openstreetmap apiopenstreetmap地图展示、位置选取、路线规划、地理编码、逆地理编码免费且开源,数据覆盖全球,社区支持强数据精度和更新频率可能不及商业地图api

这些api各有特点,开发者可以根据项目需求选择合适的地图api。百度地图、高德地图和腾讯地图在中国本地服务方面具有优势,而谷歌地图和openstreetmap在国际覆盖范围方面表现较好。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com