带有点选和搜索功能的百度地图

项目中用到了一个地图功能,可以点选和搜索,我选用了百度地图,实现效果如下,参考百度地图官方api修改以适应自己的项目就可以,仅供参考,有问题请留言;

1.首先在utils里面新建一个js文件baiduMap 

export const importBMapGL = () =>
  new Promise((resolve, reject) => {
    // ak:8tBaZbQSqrpMVQPAnekCvXgUnqt7WHFr
 
    const style = document.createElement('link')
    style.rel = 'stylesheet'
    style.href = 'http://api.map.baidu.com/res/webgl/10/bmap.css'
    document.body.appendChild(style)
    const sc = document.createElement('script')
    sc.type = 'text/javascript'
    sc.src =
      'http://api.map.baidu.com/getscript?type=webgl&v=1.0&ak=申请的ak'
 
    sc.onload = () => resolve(true)
    sc.onerror = () => reject(false)
 
    document.body.appendChild(sc)
  })
2.在页面中引用,使用方法如下
/**
 * 使用方法
import { importBMapGL } from '@/utils/baiduMap'
let map // map实例
function initMap() {
  map = new BMapGL.Map('allmap') // 创建Map实例
  var point = new BMapGL.Point(116.404, 39.915) // 创建点坐标
  map.centerAndZoom(point, 15) // 初始化地图,设置中心点坐标和地图级别
}
onMounted(() => {
  importBMapGL().then(initMap)
})
 */
           <el-row>
                <el-col :span="10">
              <el-form-item label="当前地点">
                <el-input
                  id="suggestId"
                  v-model="form.address"
                  clearable
                  placeholder="请输入要搜索的地区"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <div
            id="searchResultPanel"
            style="
              border: 1px solid #c0c0c0;
              width: 150px;
              height: auto;
              display: none;
            "
          ></div>
const initMap = () => {
  map.value = new BMapGL.Map(baiduRef.value) //新建一个map地图实例
  // debugger
  console.log(form.value)
  const point = ref(new BMapGL.Point(form.value.latitude, form.value.longitude)) // 创建标注点的经纬度
  const marker = ref(new BMapGL.Marker(point.value)) // 创建标注点
  // debugger
  // console.log(myValue.value)
  map.value.centerAndZoom(point.value, 15)
  map.value.enableScrollWheelZoom(true) //滚轮缩放
  map.value.addOverlay(marker.value) //在地图上显示标记点
 
  let zoomCtrl = new BMapGL.ZoomControl() // 添加缩放控件
  map.value.addControl(zoomCtrl)
 
  const geoc = new BMapGL.Geocoder()
  // 监听地图点击事件
  map.value.addEventListener('click', function (e) {
    //清除地图上所有的覆盖物
    map.value.clearOverlays()
    let pt = e.latlng
    let marker = new BMapGL.Marker(new BMapGL.Point(pt.lng, pt.lat))
    map.value.addOverlay(marker)
    geoc.getLocation(pt, function (rs) {
      let addComp = rs.addressComponents
      form.value.address =
        addComp.province +
        ', ' +
        addComp.city +
        ', ' +
        addComp.district +
        ', ' +
        addComp.street +
        ', ' +
        addComp.streetNumber
    })
  })
  // 创建自动完成对象
   ac = new BMapGL.Autocomplete({
    input: 'suggestId',
    location: map.value
  })
 
  ac.addEventListener('onhighlight', function (e) {
    //鼠标放在下拉列表上的事件
    let str = ''
    let _value = e.fromitem.value
    let 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
    document.getElementById('searchResultPanel').innerHTML = str
  })
  ac.addEventListener('onconfirm', function (e) {
    //鼠标点击下拉列表后的事件
    let _value = e.item.value
    form.value.address =
      _value.province +
      _value.city +
      _value.district +
      _value.street +
      _value.business
    document.getElementById('searchResultPanel').innerHTML =
      'onconfirm<br />index = ' +
      e.item.index +
      '<br />form.value.address = ' +
      form.value.address
 
    setPlace()
  })
}
// 根据搜索关键字定位地图并显示标记
const setPlace = () => {
  // map.value = new BMapGL.Map(baiduRef.value) //新建一个map地图实例
  map.value.clearOverlays() //清除地图上所有覆盖物
  if (!form.value.address) return
  const local = new BMapGL.LocalSearch(map.value, {
    renderOptions: { map: map.value },
    onSearchComplete: results => {
      if (results) {
        const firstResult = results.keyword
        getAddress(firstResult)
        // map.value.centerAndZoom(point, 18)
        // map.value.addOverlay(new BMapGL.Marker(point)) //添加标注
      }
    }
  })
  local.search(form.value.address)
}
const getAddress = address => {
  const geoc = new BMapGL.Geocoder()
  geoc.getPoint(address, point => {
    if (point) {
      form.value.latitude = point.lat
      form.value.longitude = point.lng
      map.value.centerAndZoom(point, 18)
      map.value.addOverlay(new BMapGL.Marker(point)) //添加标注
      console.log(address)
      form.value.address = address
    }
  })
}
onMounted(() => {
  importBMapGL().then(initMap)
})

我这个项目是写在弹框中的,编辑的时候需要回显地址内容,刚开始写的会有偶尔不显示的问题,如有遇到类似的问题,请在数据回显的地方单独设置下ac.setInputValue('内容')就解决了;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ExtJS的combobox组件本身并不支持多搜索功能,但是可以通过扩展来实现这些功能。以下是一个基于ExtJS 6.5版本的下拉多搜索功能的示例代码: ```javascript Ext.define('MyApp.view.MultiSelectComboBox', { extend: 'Ext.form.field.ComboBox', xtype: 'multiselectcombo', multiSelect: true, delimiter: ',', triggerAction: 'all', queryMode: 'remote', queryParam: 'search', minChars: 1, createPicker: function() { var me = this, picker, menuCls = Ext.baseCSSPrefix + 'menu', opts = Ext.apply({ pickerField: me, selModel: { mode: 'SIMPLE' }, floating: true, hidden: true, ownerCt: me.ownerCt, cls: me.el.up('.' + menuCls) ? menuCls : '', store: me.store, displayField: me.displayField, focusOnToFront: false, pageSize: me.pageSize }, me.listConfig, me.defaultListConfig); picker = me.picker = Ext.create('Ext.view.BoundList', opts); me.mon(picker.getSelectionModel(), { 'beforeselect': me.onBeforeSelect, 'beforedeselect': me.onBeforeDeselect, scope: me }); me.mon(picker, { itemclick: me.onItemClick, refresh: me.onListRefresh, scope: me }); me.mon(picker.getSelectionModel(), 'selectionchange', me.onListSelectionChange, me); return picker; }, initComponent: function() { var me = this; me.callParent(arguments); me.on('change', me.onChange, me); }, onChange: function(combo, newValue, oldValue) { var me = this, delimiter = me.delimiter, values = newValue.split(delimiter), store = me.getStore(), valueField = me.valueField, displayField = me.displayField, rec, i, len, value; store.clearFilter(); store.filter(function(record) { return Ext.Array.contains(values, record.get(displayField)); }); me.setValue(values.join(delimiter)); }, onBeforeDeselect: function(list, record) { return !this.readOnly; }, onBeforeSelect: function(list, record) { return !this.readOnly; }, onItemClick: function(view, record, item, index, e) { var me = this, delimiter = me.delimiter, displayField = me.displayField, valueField = me.valueField, value = record.get(displayField), oldValue = me.getValue(), values, index; if (!Ext.isDefined(oldValue)) { oldValue = ''; } values = oldValue.split(delimiter); index = Ext.Array.indexOf(values, value); if (index > -1) { values.splice(index, 1); } else { values.push(value); } me.setValue(values.join(delimiter)); me.fireEvent('select', me, [record]); } }); ``` 这个组件继承自Ext.form.field.ComboBox,并添加了以下属性和方法: - multiSelect:是否启用多功能,缺省为false。 - delimiter:多时使用的分隔符,缺省为逗号。 - createPicker:重写父类的createPicker方法,用于创建下拉框的择器。这里使用了Ext.view.BoundList组件来实现多搜索功能。 - onChange:重写父类的onChange方法,在值改变时更新择器中中的项。 - onItemClick:处理择器中的项点击事件,实现多功能。 使用这个组件时,只需将xtype设置为'multiselectcombo'即可,例如: ```javascript Ext.create('Ext.form.Panel', { renderTo: Ext.getBody(), width: 400, items: [{ xtype: 'multiselectcombo', fieldLabel: 'Select', name: 'select', store: ['Option 1', 'Option 2', 'Option 3', 'Option 4', 'Option 5'] }] }); ``` 这个示例中,使用了一个简单的字符串数组作为数据源。实际应用中,可以使用Ext.data.Store来加载数据,并设置queryMode为'remote',通过AJAX请求服务器端进行搜索

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值