山东大学项目实训——地图圈系统——微信小程序(3)

一、关键词输入提示

options属性说明:

属性类型必填说明
keywordString用户输入的关键词(希望获取后续提示的关键词)
regionString设置城市名,限制关键词所示的地域范围,如,仅获取“广州市”范围内的提示内容,默认值全国
region_fixNumber取值: 0:[默认]当前城市无结果时,自动扩大范围到全国匹配 1:固定在当前城市
policyNumber检索策略,目前支持
policy=0:默认,常规策略;
policy=1:本策略主要用于收货地址、上门服务地址的填写,
locationString定位坐标,传入后,若用户搜索关键词为类别词(如酒店、餐馆时),与此坐标距离近的地点将靠前显示,格式: location=lat,lng (示例:location:39.11457,116.55332)
get_subpoisNumber是否返回子地点,如大厦停车场、出入口等取值:
0 [默认]不返回
1 返回
该参数适用于 jssdkv1.1 jssdkv1.2
filterString最多支持五个分类
搜索指定分类
category=公交站
搜索多个分类
category=大学,中学
(注意参数值要进行url编码)
该参数适用于 jssdkv1.1 jssdkv1.2
address_formatString短地址,缺省时返回长地址,可选值:'short’
该参数适用于 jssdkv1.1 jssdkv1.2
page_sizeNumber每页条目数,最大限制为20条,默认值10
该参数适用于 jssdkv1.1 jssdkv1.2
page_indexNumber第x页,默认第1页
该参数适用于 jssdkv1.1 jssdkv1.2
sigString签名校验
开启WebServiceAPI签名校验的必传参数,只需要传入生成的SK字符串即可,不需要进行MD5加密操作
该参数适用于 jssdkv1.2

调用结果:
1.通过属性success, fail, complete的回调参数来接收调用结果
2.success的回调参数可以有2个,第1个参数接收调用结果,第2个参数控制返回处理后的数据(非必须参数),示例:success:function(res,data)
3. 该属性适用于 jssdkv1.1 jssdkv1.2

二、示例

WXML 模板文件中添加组件:

<!--绑定输入事件-->
<input style="border:1px solid black;" bindinput="getsuggest" value="{{backfill}}"></input>
<!--关键词输入提示列表渲染-->
<view wx:for="{{suggestion}}" wx:key="index">
    <!--绑定回填事件-->
    <view>
    <!--根据需求渲染相应数据-->
    <!--渲染地址title-->
    <view style="text-align:center;" bindtap="backfill" id="{{index}}">{{item.title}}</view>
    <!--渲染详细地址-->
    <view style="font-size:12px;color:#666;text-align:center;">{{item.addr}}</view>
    </view>
</view>

Javascript 关键代码片段:

// 引入SDK核心类
var QQMapWX = require('xxx/qqmap-wx.js');
 
// 实例化API核心类
var qqmapsdk = new QQMapWX({
    key: '开发密钥(key)' // 必填
});
 
//在Page({})中使用下列代码
//数据回填方法
backfill: function (e) {
    var id = e.currentTarget.id;
    for (var i = 0; i < this.data.suggestion.length;i++){
      if(i == id){
        this.setData({
          backfill: this.data.suggestion[i].title
        });
      }  
    }
  },
 
//触发关键词输入提示事件
getsuggest: function(e) {
    var _this = this;
    //调用关键词提示接口
    qqmapsdk.getSuggestion({
      //获取输入框值并设置keyword参数
      keyword: e.detail.value, //用户输入的关键词,可设置固定值,如keyword:'KFC'
      //region:'北京', //设置城市名,限制关键词所示的地域范围,非必填参数
      success: function(res) {//搜索成功后的回调
        console.log(res);
        var sug = [];
        for (var i = 0; i < res.data.length; i++) {
          sug.push({ // 获取返回结果,放到sug数组中
            title: res.data[i].title,
            id: res.data[i].id,
            addr: res.data[i].address,
            city: res.data[i].city,
            district: res.data[i].district,
            latitude: res.data[i].location.lat,
            longitude: res.data[i].location.lng
          });
        }
        _this.setData({ //设置suggestion属性,将关键词搜索结果以列表形式展示
          suggestion: sug
        });
      },
      fail: function(error) {
        console.error(error);
      },
      complete: function(res) {
        console.log(res);
      }
    });
}

三、项目代码

1.regeo.wxml中加入如下代码:

<view wx:if="{{addListShow}}">
  <view class="top">
    <view class="back iconfont icon-fanhui" bindtap="back1"></view>
    <view class="search-box {{addListShow?'search-box1':''}}">
      <view class="region" bindtap="chooseCity">{{currentRegion.district}}</view>
      <view class="shu"></view>
      <input bindinput="getsuggest" placeholder="查找具体地点"></input>
    </view>
  </view>
  <!--关键词输入提示列表渲染-->
  <view class="add-list-box">
    <scroll-view class="add-list" scroll-y>
      <view class="add-item" wx:for="{{suggestion}}" wx:key="index">
        <!--绑定回填事件-->
        <view bindtap="backfill" id="{{index}}" data-name="{{item.title}}">
          <!--根据需求渲染相应数据-->
          <!--渲染地址title-->
          <view class="title">{{item.title}}</view>
          <!--渲染详细地址-->
          <view class="add">{{item.addr}}</view>
        </view>
        
      </view>
    </scroll-view>
  </view>
</view>

2.regeo.js中加入如下代码

 back1: function () {
    if (this.data.addListShow) {
      this.setData({
        addListShow: false
      })
    } else {
      wx.navigateBack({
        delta: 1
      })
    }
  },
  chooseCity: function () {
    let self = this;
    self.getRegionData();
    self.setData({
      chooseCity: true,
      regionShow: {
        province: false,
        city: false,
        district: true
      },
      currentProvince: self.data.currentRegion.province,
      currentCity: self.data.currentRegion.city,
      currentDistrict: self.data.currentRegion.district,
    })
  },
  getRegionData: function () {
    let self = this;
    //调用获取城市列表接口
    qqmapsdk.getCityList({
      success: function (res) {//成功后的回调
        console.log(res)
        let provinceArr = res.result[0];
        let cityArr = [];
        let districtArr = [];
        for (var i = 0; i < provinceArr.length; i++) {
          var name = provinceArr[i].fullname;
          if (self.data.currentRegion.province == name) {
            if (name == '北京市' || name == '天津市' || name == '上海市' || name == '重庆市') {
              cityArr.push(provinceArr[i])
            } else {
              qqmapsdk.getDistrictByCityId({
                // 传入对应省份ID获得城市数据,传入城市ID获得区县数据,依次类推
                id: provinceArr[i].id,
                success: function (res) {//成功后的回调
                  //console.log(res);
                  cityArr = res.result[0];
                  self.setData({
                    regionData: {
                      province: provinceArr,
                      city: cityArr,
                      district: districtArr
                    }
                  })
                },
                fail: function (error) {
                  //console.error(error);
                },
                complete: function (res) {
                  //console.log(res);
                }
              });
            }
          }
        }
        for (var i = 0; i < res.result[1].length; i++) {
          var name = res.result[1][i].fullname;
          if (self.data.currentRegion.city == name) {
            qqmapsdk.getDistrictByCityId({
              // 传入对应省份ID获得城市数据,传入城市ID获得区县数据,依次类推
              id: res.result[1][i].id,
              success: function (res) {//成功后的回调
                //console.log(res);
                districtArr = res.result[0];
                self.setData({
                  regionData: {
                    province: provinceArr,
                    city: cityArr,
                    district: districtArr
                  }
                })
              },
              fail: function (error) {
                //console.error(error);
              },
              complete: function (res) {
                //console.log(res);
              }
            });
          }
        }
      },
      fail: function (error) {
        //console.error(error);
      },
      complete: function (res) {
        //console.log(res);
      }
    });
  },
  //选择省
  showProvince: function () {
    this.setData({
      regionShow: {
        province: true,
        city: false,
        district: false
      }
    })
  },
  //选择城市
  showCity: function () {
    this.setData({
      regionShow: {
        province: false,
        city: true,
        district: false
      }
    })
  },
  //选择地区
  showDistrict: function () {
    this.setData({
      regionShow: {
        province: false,
        city: false,
        district: true
      }
    })
  },
  //选择省之后操作
  selectProvince: function (e) {
    //console.log(e)
    let self = this;
    let id = e.currentTarget.dataset.id;
    let name = e.currentTarget.dataset.name;
    self.setData({
      currentProvince: name,
      currentCity: '请选择城市',
    })
    if (name == '北京市' || name == '天津市' || name == '上海市' || name == '重庆市') {
      var provinceArr = self.data.regionData.province;
      var cityArr = [];
      for (var i = 0; i < provinceArr.length; i++) {
        if (provinceArr[i].fullname == name) {
          cityArr.push(provinceArr[i])
          self.setData({
            regionData: {
              province: self.data.regionData.province,
              city: cityArr,
              district: self.data.regionData.district
            }
          })
          self.showCity();
          return;
        }
      }
    } else {
      let bjj = self.data.regionShow;
      console.log(bjj)
      let bj = JSON.stringify(bjj)
      console.log(bj)
      self.getById(id, name, bj)
    }
  },
  //选择城市之后操作
  selectCity: function (e) {
    let self = this;
    let id = e.currentTarget.dataset.id;
    let name = e.currentTarget.dataset.name;
    self.setData({
      currentCity: name,
      currentDistrict: '请选择城市',
    })
    let bjj = self.data.regionShow;
    var bj = JSON.stringify(bjj)
    self.getById(id, name, bj)
  },

  //选择区县之后操作
  selectDistrict: function (e) {
    let self = this;
    let id = e.currentTarget.dataset.id;
    let name = e.currentTarget.dataset.name;
    let latitude = e.currentTarget.dataset.latitude;
    let longitude = e.currentTarget.dataset.longitude;
    var b = {
      id: 0,
      latitude: latitude,
      longitude: longitude,
      iconPath: "../../src/images/ding.png"
    }
    var markers = this.data.markers
    markers.push(b)
    self.setData({
      currentDistrict: name,
      latitude: latitude,
      longitude: longitude,
      currentRegion: {
        province: self.data.currentProvince,
        city: self.data.currentCity,
        district: name
      },
      markers,
      bottom: {
        title: self.data.currentProvince + "," + self.data.currentCity + "," + name,
        addr: self.data.currentProvince + "," + self.data.currentCity + "," + name,
        latitude: latitude,
        longitude: longitude,
      },

      showbottom: true,
      chooseCity: false,
      keyword: self.data.defaultKeyword
    })
    // self.nearby_search();
  },
  //根据选择省市加载市区列表
  getById: function (id, name, bj) {
    let self = this;
    // var bj=JSON.parse(bj)
    console.log(bj)
    qqmapsdk.getDistrictByCityId({
      // 传入对应省份ID获得城市数据,传入城市ID获得区县数据,依次类推
      id: id, //对应接口getCityList返回数据的Id,如:北京是'110000'
      success: function (res) {//成功后的回调
        console.log(res);
        console.log(bj)
        if (self.data.regionShow.province) {
          self.setData({
            regionData: {
              province: self.data.regionData.province,
              city: res.result[0],
              district: self.data.regionData.district
            }
          })
          self.showCity();
        } else if (self.data.regionShow.city) {
          self.setData({
            regionData: {
              province: self.data.regionData.province,
              city: self.data.regionData.city,
              district: res.result[0]
            }
          })
          self.showDistrict();
        } else {
          self.setData({
            chooseCity: false,
          })
        }
      },
      fail: function (error) {
        //console.error(error);
      },
      complete: function (res) {
        //console.log(res);
      }
    });
  },
  showAddList: function () {
    this.setData({
      addListShow: true
    })
  },
  getsuggest: function (e) {
    var _this = this;
    var keyword = e.detail.value;
    _this.setData({
      addListShow: true
    })
    //调用关键词提示接口
    qqmapsdk.getSuggestion({
      //获取输入框值并设置keyword参数
      keyword: keyword, //用户输入的关键词,可设置固定值,如keyword:'KFC'
      location: _this.data.latitude + ',' + _this.data.longitude,
      page_size: 20,
      page_index: 1,
      //region:'北京', //设置城市名,限制关键词所示的地域范围,非必填参数
      success: function (res) {//搜索成功后的回调
        //console.log(res);
        var sug = [];
        for (var i = 0; i < res.data.length; i++) {
          sug.push({ // 获取返回结果,放到sug数组中
            title: res.data[i].title,
            id: res.data[i].id,
            addr: res.data[i].address,
            province: res.data[i].province,
            city: res.data[i].city,
            district: res.data[i].district,
            latitude: res.data[i].location.lat,
            longitude: res.data[i].location.lng
          });
        }
        _this.setData({ //设置suggestion属性,将关键词搜索结果以列表形式展示
          suggestion: sug,
          nearList: sug,
          keyword: keyword
        });
      },
      fail: function (error) {
        //console.error(error);
      },
      complete: function (res) {
        //console.log(res);
      }
    });
  },

3.regeo.wxss中添加如下代码:

.top {
  width: 100%;
  height: 80rpx;
  line-height: 80rpx;
  position: fixed;
  top: 140rpx;
  left: 0;
  padding: 30rpx 20rpx;
  z-index: 999;
  overflow: hidden;
}
.back {
  width: 80rpx;
  height: 80rpx;
  line-height: 80rpx;
  color: #666;
  text-align: center;
  background: rgb(255,255,255);
  font-size: 50rpx;
  border-radius: 50%;
  float: left;
}
.back cover-image{
  width: 50rpx;
  height: 50rpx;
  display: inline-block;
  margin-top: 15rpx;
}
.search-box {
  width: 610rpx;
  height: 80rpx;
  line-height: 80rpx;
  border-radius: 40rpx;
  background: rgb(255,255,255);
  margin-left: 20rpx;
  float: left;
  overflow: hidden;
}
.search-box1 {
  border: 1px solid #ccc;
  border-radius: 10rpx;
  background: #eee;
}
.search-box .region {
  width: 199rpx;
  line-height: 80rpx;
  font-size: 30rpx;
  color: #282828;
  text-align: center;
  float: left;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.search-box .shu {
  width: 1rpx;
  height: 80rpx;
  background:#ccc;
  float: left;
}
.search-box input {
  width: 380rpx;
  height: 80rpx;
  line-height: 80rpx;
  font-size: 30rpx;
  color: #282828;
  padding: 10rpx 20rpx;
  box-sizing: border-box;
  float: left;
}
.search-box .placeholder{
  width: 380rpx;
  height: 80rpx;
  line-height: 80rpx;
  font-size: 30rpx;
  color: #ccc;
  padding: 0 20rpx;
  box-sizing: border-box;
  float: left;
}
.add-list-box {
  position: absolute;
  width: 100%;
  height: 100%;
  top: 140rpx;
  z-index: 998;
  padding-top: 150rpx;
  background: #fff;
  box-sizing: border-box;
  overflow: hidden;
}
.add-list {
  width: 100%;
  height: 1000rpx;
}
.add-item {
  line-height: 40rpx;
  padding: 30rpx 50rpx;
  text-align: left;
  border-top: 1px solid #eee;
}
.add-item .title {
  color: #282828;
  font-size: 32rpx;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.add-item .add {
  color: #707070;
  font-size: 24rpx;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

四、效果图展示

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值