• vue+vant ui+高德地图的选址组件


    首先在index.html引入高德地图的js

    <script src="https://webapi.amap.com/maps?v=1.4.14&key=你的key"></script>

    然后写html部分

    <template>
      <div class="mymapM">
        <!--捜索-->
        <div v-if="loading" class="loading">
          <van-loading type="spinner" />
        </div>
    
        <div class="search-box">
          <div class="search-postion">
            <span class="buts">返回</span>
            <input type="text" placeholder="输入关键字搜索" v-model="search_key" />
            <span class="clear" v-if="search_key" @click="search_key ='' ">
              <van-icon color="#8f8f8f" name="clear" />
            </span>
            <span class="buts border_but" @click="keySearch()">捜索</span>
          </div>
        </div>
        <div class="con-box con-map" v-if="!search_key">
          <!--地图-->
          <div class="mapbox">
            <div class="map" id="container"></div>
            <div class="sign"></div>
          </div>
        </div>
        <div class="con-box" v-if="!search_key">
          <!--地址列表-->
          <div class="Hlist-box">
            <ul>
              <li v-for="(item, index) in lists" :key="index" @click="onAddressLi(item)">
                <b>
                  <van-icon color="#a6a6a6" name="clock" />
                </b>
                <div>
                  <span>{{item.name}}</span>
                  <p>{{item.address}}</p>
                </div>
              </li>
            </ul>
          </div>
        </div>
        <!--捜索列表-->
        <div class="search-list" v-if="search_key">
          <ul>
            <li v-for="(item, index) in search_list" :key="index" @click="onSearchLi(item.location)">
              <span>{{item.name}}</span>
              <p>{{item.address}}</p>
            </li>
            <li v-if="noSearchShow">
              <p>暂无搜索结果</p>
            </li>
          </ul>
        </div>
      </div>
    </template>

    css部分

    <style lang="scss" scoped>
    .con-map {
      height: 190px;
      width: 100%;
    }
    .con-box {
      .mapbox {
        margin-bottom: 10px;
        position: fixed;
        z-index: 111;
        width: 100%;
        height: 180px;
        padding: 10px 0;
        background: #eceeee;
    
        .map {
          width: 100%;
          height: 180px;
        }
      }
    
      .Hlist-box {
        width: 96%;
        margin: 0 auto;
    
        background: #fff;
        border-radius: 5px;
        li {
          height: 40px;
          padding: 14px 22px;
          border-bottom: 1px solid #d9d9d9;
          display: flex;
          b {
            display: inline-block;
    
            i {
              margin: 18px 18px 0 0;
            }
          }
          div {
            width: 100%;
          }
          span {
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
            font-size: 15px;
            display: inline-block;
            width: 90%;
          }
          p {
            margin-top: 10px;
            color: #a6a6a6;
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
            font-size: 13px;
            width: 90%;
          }
        }
      }
    }
    .mymapM {
      .search-box {
        height: 48px;
    
        line-height: 48px;
        background: #fff;
    
        border-bottom: 1px solid #bfbec4;
    
        .search-postion {
          height: 48px;
          line-height: 48px;
          background: #fff;
          border-bottom: 1px solid #bfbec4;
          width: 100%;
          position: fixed;
          z-index: 99999;
          display: flex;
          input {
            flex: 4;
            height: 14px;
            padding: 16px 0;
            border: none;
    
            text-indent: 10px;
          }
          .clear {
            margin: 2px 6px;
          }
          .buts {
            width: 15%;
            text-align: center;
            display: inline-block;
            flex: 1;
          }
          .border_but {
            border-left: 1px solid #8f8f8f;
            height: 14px;
            line-height: 14px;
            margin: 17px 0;
          }
        }
      }
      .search-list {
        width: 96%;
        margin: 0 auto;
        margin-top: 10px;
        border-radius: 5px;
        background: #fff;
        li {
          height: 40px;
          padding: 14px 22px;
          border-bottom: 1px solid #d9d9d9;
          span {
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
            font-size: 15px;
            display: inline-block;
            width: 90%;
          }
          p {
            margin-top: 10px;
            color: #a6a6a6;
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
            font-size: 13px;
            width: 90%;
          }
        }
      }
    }
    .loading {
      position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      z-index: 99999999;
    }
    </style>

    js部分

    <script>
    export default {
      data() {
        return {
          center: [116.42792, 39.902896], //经度+纬度
          search_key: "", //搜索值
          lists: [], //地点列表
          search_list: [], //搜索结果列表
          marker: "",
          loading: false,
          noSearchShow: false //无搜索结果提示,无搜索结果时会显示暂无搜索结果
        };
      },
      mounted() {
        setTimeout(() => {
          this.adMap();
        }, 1000);
      },
      methods: {
        adMap() {
          this.loading = true;
          //初始化地图
          var map = new AMap.Map("container", {
            zoom: 14, //缩放级别
            center: this.center //设置地图中心点
            //resizeEnable: true,  //地图初始化加载定位到当前城市
          });
          //获取初始中心点并赋值
          var currentCenter = map.getCenter(); //此方法是获取当前地图的中心点
          this.center = [currentCenter.lng, currentCenter.lat]; //将获取到的中心点的纬度经度赋值给data的center
          console.log(this.center);
    
          //创建标记
          this.marker = new AMap.Marker({
            position: new AMap.LngLat(currentCenter.lng, currentCenter.lat) // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
          });
          // 将创建的点标记添加到已有的地图实例:
          map.add(this.marker);
    
          //根据地图中心点查附近地点,此方法在下方
          this.centerSearch();
          //监听地图移动事件,并在移动结束后获取地图中心点并更新地点列表
          var moveendFun = e => {
            // 获取地图中心点
            currentCenter = map.getCenter();
            this.center = [currentCenter.lng, currentCenter.lat];
            this.marker.setPosition([currentCenter.lng, currentCenter.lat]); //更新标记的位置
            //根据地图中心点查附近地点
          };
          //更新数据
          var centerSearch = () => {
            this.loading = true;
            this.centerSearch();
          };
    
          // 绑定事件移动地图事件
          map.on("mapmove", moveendFun); //更新标记
          map.on("moveend", centerSearch); //更新数据
        },
        centerSearch() {
          AMap.service(["AMap.PlaceSearch"], () => {
            //构造地点查询类
            var placeSearch = new AMap.PlaceSearch({
              type:
                "汽车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|金融保险服务|公司企业|地名地址信息", // 兴趣点类别
              pageSize: 30, // 单页显示结果条数
              pageIndex: 1, // 页码
              city: "全国", // 兴趣点城市
              autoFitView: false // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
            });
            //根据地图中心点查附近地点
            placeSearch.searchNearBy(
              "",
              [this.center[0], this.center[1]],
              200,
              (status, result) => {
                if (status == "complete") {
                  this.lists = result.poiList.pois; //将查询到的地点赋值
                  this.loading = false;
                }
              }
            );
          });
        },
        keySearch() {
          this.loading = true;
          AMap.service(["AMap.PlaceSearch"], () => {
            //构造地点查询类
            var placeSearch = new AMap.PlaceSearch({
              type:
                "汽车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|金融保险服务|公司企业|地名地址信息", // 兴趣点类别
              pageSize: 30, // 单页显示结果条数
              pageIndex: 1, // 页码
              city: "全国", // 兴趣点城市
              citylimit: false, //是否强制限制在设置的城市内搜索
              autoFitView: false // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
            });
            //关键字查询
            placeSearch.search(this.search_key, (status, result) => {
              if (status == "complete") {
                if (result.poiList.count === 0) {
                  this.noSearchShow = true;
                } else {
                  this.search_list = result.poiList.pois; //将查询到的地点赋值
                  this.noSearchShow = false;
                  this.loading = false;
                }
              } else {
                this.search_list = [];
                this.noSearchShow = true;
              }
            });
          });
        },
        onAddressLi(e) {
          console.log(e);
          this.marker.setPosition([e.location.lng, e.location.lat]); //更新标记的位置
        },
        onSearchLi(e) {
          console.log(e.lng + "-" + e.lat);
          this.center = [e.lng, e.lat];
          console.log(this.center);
          this.search_key = "";
          // this.loading=true;
          setTimeout(() => {
            this.adMap();
          }, 1000);
        }
      },
      watch: {
        search_key(newv, oldv) {
          if (newv == "") {
            this.search_list = [];
            this.noSearchShow = false;
            setTimeout(() => {
              this.adMap();
            }, 1000);
          }
        }
      }
    };
    </script>

    效果图

  • 相关阅读:
    测试
    微商就该这么加粉丝,你造吗?
    下拉刷新ListView实现原理
    android studio出现 waiting for adb
    发现一个很好的android开发笔记库
    android studio 不能在线更新android SDK Manager问题解决办法
    asp.net中XmlDocument解析出现出错,处理特殊字符
    假如是你,你会怎么选择
    winrt 上的翻书特效组件 源码分享 转载请说明
    在Windows8 Winrt中 高性能处理多个条件语句 用于实现自定义手势
  • 原文地址:https://www.cnblogs.com/aSnow/p/11237694.html
Copyright © 2020-2023  润新知