高德地图placesearch 搜索结果生成自定义marker

实现效果

业务需求:

高德地图,输入关键词输入提示(autocomplete),
按照选择的关键词执行地点搜索placesearch在地图上生成标记点marker,
点击标记点弹出自定义信息窗口infowindow 点击信息窗体确定按钮,根据经纬度+地址更新当前行数据.

踩坑

1.placesearch 在初次加载时,会生成默认的标记点marker,与自定义的marker 重叠,再次进入不会出现.
2.infowindow 自定义信息窗体的内容没有跟随marker变动,不管点击哪个marker内容都是一样.

代码

—封装高德引入 maploader.js 一并注册用到的插件

export default function mapLoader() {
  return new Promise((resolve, reject) => {
    if (window.AMap) {
      resolve(window.AMap);
    } else {
      var script = document.createElement("script");
      script.type = "text/javascript";
      script.async = true;
      script.src =
        "https://webapi.amap.com/maps?v=1.4.15&callback=initAMap&key=" +
        你的高德key +
        "&plugin=AMap.Autocomplete,AMap.PlaceSearch,AMap.ToolBar";
      script.onerror = reject;
      document.head.appendChild(script);
    }
    window.initAMap = () => {
      resolve(window.AMap);
    };
  });
}

—页面内生成高德地图 初始化地图与地图控件

import mapLoader from "@/utils/mapLoader.js";

.......
this.$nextTick(() => {
            mapLoader().then(
              (AMap) => {
                that.modalLoading = false;
                that.map = new AMap.Map("map-container", {
                  resizeEnable: true,
                  center: center, //中心点坐标
                  zoom: 13, //地图视图缩放级别
                });
                // 注册组件
                that.map.addControl(new AMap.ToolBar());
                //输入提示
                var autoOptions = {
                  input: "tipinput",
                };
                var auto = new AMap.Autocomplete(autoOptions);
                function select(e) {
                  // that.map.clearMap();
                  var placeSearch = new AMap.PlaceSearch({
                    // map: that.map,
                  }); //构造地点查询类
                  placeSearch.setCity(e.poi.adcode);
                  placeSearch.search(e.poi.name, function (status, result) {
                    //关键字查询查询
                    // 查询成功时,result即对应匹配的POI信息
                    console.log("搜索结果", result);
                    if (status == "complete" || result.info == "OK")
                      that.addMarker(AMap, result);
                  });
                }
                AMap.event.addListener(auto, "select", select); //注册监听,当选中某条记录时会触发
              },
              (e) => {
                this.modalLoading = false;
              }
            );
          });

注意此处,
踩坑1,此处尝试使用了placeSearch.render.markerList.clear() ,map.clear()等等,用于清除地点搜索默认生成的marker, 均无效,参照高德文档可知

高德placeSearch文档
那么,定义placeSearch实例对象时,不注册到当前地图,仅仅生成实例用于获取结果便是,这样就不会展示默认的marker到地图上

—生成自定义marker 点标记

addMarker(AMap, result) {
      // 根据返回placeSearch 返回的数据 生成地图 marker
      this.map.clearMap();
      const poiArr = result.poiList.pois; //搜索结果数组
      const icon = require("@/assets/yuanqu/loca.svg");
      const markerContent =
        "<div><img src=" + icon + " width='30px' height='30px'></div>";
      var markerList = [];
      for (let i = 0; i < poiArr.length; i++) {
        var marker = new AMap.Marker({
          position: poiArr[i].location,
          content: markerContent,
        }); //设定地图标记点
        const that = this;
        AMap.event.addListener(marker, "click", function (e) {
          var lngX = e.lnglat.lng;
          var latY = e.lnglat.lat;
          that.map.setCenter([lngX, latY]); //点击marker 动态改变中心点
          var infoWindow = new AMap.InfoWindow({
            content:
              "<h3>地址:" +
              poiArr[i].name +
              "</h3><p>详细地址:" +
              poiArr[i].address +
              "</p>经纬度:[" +
              poiArr[i].location.getLng() +
              "," +
              poiArr[i].location.getLat() +
              "]</p><button style='height:32px;width:100px;background-color:#469d75;border:none;' οnclick=\"saveCenter('" +
              i +
              "')\">确定</button>",

            size: new AMap.Size(300, 0),
            autoMove: true,
            offset: new AMap.Pixel(5, -40),
          });
          infoWindow.open(that.map, e.target.getPosition());
        });
        markerList.push(marker);
      }
      this.map.add(markerList);
      this.map.setFitView();
    },

执行方法前先清空地图覆盖物,clearmap(),生成marker后执行setFitView() 到合适的展示marker的视图. 此处踩坑2 ,infowindow 变量定义的作用域问题,放在marker的点击事件里边生成infowindow即可.

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义高德地图Marker,可以按照以下步骤操作: 1. 创建MarkerOptions对象,设置Marker的经纬度、图标等属性。 2. 通过AMap类的addMarker方法将Marker添加到地图上。 3. 通过AMap类的setInfoWindowAdapter方法设置Marker的信息窗口。 4. 通过AMap类的setOnMarkerClickListener方法设置Marker的点击事件。 具体实现代码如下: ``` // 创建MarkerOptions对象 MarkerOptions markerOptions = new MarkerOptions(); LatLng latLng = new LatLng(39.906901, 116.397972); markerOptions.position(latLng); markerOptions.title("Marker标题"); markerOptions.snippet("Marker描述"); markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_icon)); // 添加Marker地图Marker marker = aMap.addMarker(markerOptions); // 设置Marker的信息窗口 aMap.setInfoWindowAdapter(new AMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { View view = getLayoutInflater().inflate(R.layout.marker_info_window, null); TextView titleTextView = view.findViewById(R.id.title); TextView snippetTextView = view.findViewById(R.id.snippet); titleTextView.setText(marker.getTitle()); snippetTextView.setText(marker.getSnippet()); return view; } @Override public View getInfoContents(Marker marker) { return null; } }); // 设置Marker的点击事件 aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { marker.showInfoWindow(); return true; } }); ``` 其中,R.drawable.marker_icon是你自定义Marker图标。marker_info_window是你自定义Marker信息窗口布局。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值