微信小程序(六)定位搜索

一、引言

        作者上一章讲了微信小程序的地图实现微信小程序(五)地图-CSDN博客,但是还有一个功能是和地图紧密结合的,那就是位置搜索定位,这里作者讲讲实现和原理,包括城市筛选。

二、定位搜索实现

1、位置搜索样式

        这个其实就是样式啦,不是固定要和作者一样的

        上面一个搜索框,下面展示搜索到的相关位置

<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 class="input-box" 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>

2、拖动地图

        随着地图拖拽,显示的附近位置也会改变

<cover-view class="top">
                    <cover-view class="back" bindtap="back1">
                        <cover-image src="/static/images/detail_back.png"></cover-image>
                    </cover-view>
                    <cover-view class="search-box">
                        <cover-view class="region" bindtap="chooseCity">{{currentRegion.district}}</cover-view>
                        <cover-view class="shu"></cover-view>
                        <cover-view class="placeholder" bindtap="showAddList">请输入地址</cover-view>
                    </cover-view>
                </cover-view>
                <cover-view class="map-prompt">您可拖动地图, 标记准确位置</cover-view>
                <cover-image class="current-site-icon" src="/static/images/my_marker.png"></cover-image>
                <cover-view class="reload" bindtap="reload">
                    <cover-view class="center1">
                        <cover-view class="center2"></cover-view>
                    </cover-view>
                </cover-view>

3、附近位置样式

        这里展示附近的位置,最终选定之后可以点击位置确认

<scroll-view class="near-list" scroll-y>
                <!--绑定回填事件-->
                <view class="near-item" wx:for="{{nearList}}" wx:key="index">
                    <view class="current-site iconfont icon-location" wx:if="{{index == selectedId }}"></view>
                    <!--根据需求渲染相应数据-->
                    <view bindtap="chooseCenter" id="{{index}}" data-name="{{item.title}}">
                        <!--渲染地址title-->
                        <view class="title {{ index == selectedId?'title1':'' }}">{{item.title}}</view>
                        <!--渲染详细地址-->
                        <view class="add {{ index == selectedId?'add1':'' }}">{{item.addr}}</view>
                    </view>
                </view>
            </scroll-view>
            <view class="bottom-box">
                <button bindtap="selectedOk">确认定位</button>
            </view>

4、搜索附近位置

        是根据选中的位置的经纬度进行搜索的,后端数据在腾讯地图

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);
            }
        });
    },
nearby_search: function () {
        var self = this;
        wx.hideLoading();
        wx.showLoading({
            title: '加载中'
        });
        // 调用接口
        qqmapsdk.search({
            keyword: self.data.keyword,
            location: self.data.latitude + ',' + self.data.longitude,
            page_size: 20,
            page_index: 1,
            success: function (res) { //搜索成功后的回调
                //console.log(res.data)
                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].ad_info.province,
                        city: res.data[i].ad_info.city,
                        district: res.data[i].ad_info.district,
                        latitude: res.data[i].location.lat,
                        longitude: res.data[i].location.lng
                    });
                }
                self.setData({
                    selectedId: 0,
                    centerData: sug[0],
                    nearList: sug,
                    suggestion: sug
                })
                self.addMarker(sug[0]);
            },
            fail: function (res) {
                //console.log(res);
            },
            complete: function (res) {
                //console.log(res);
            }
        });
    },

5、地图拖动

        根据拖动到的经纬度再次进行搜索

mapChange: function (e) {
        let self = this;
        if (e.type == 'end' && (e.causedBy == 'scale' || e.causedBy == 'drag')) {
            self.mapCtx.getCenterLocation({
                success: function (res) {
                    //console.log(res)
                    self.setData({
                        nearList: [],
                        latitude: res.latitude,
                        longitude: res.longitude,
                    })
                    self.nearby_search();
                }
            })
        }

    },

6、标记地图定位

addMarker: function (data) {
        //console.log(data)
        //console.log(data.title)
        var mks = [];
        mks.push({ // 获取返回结果,放到mks数组中
            title: data.title,
            id: data.id,
            addr: data.addr,
            province: data.province,
            city: data.city,
            district: data.district,
            latitude: data.latitude,
            longitude: data.longitude,
            iconPath: "/images/my_marker.png", //图标路径
            width: 25,
            height: 25
        })
        this.setData({ //设置markers属性,将搜索结果显示在地图中
            markers: mks,
            currentRegion: {
                province: data.province,
                city: data.city,
                district: data.district,
            }
        })
        wx.hideLoading({});
    },

7、效果

三、选择省市区实现

1、选择省市区样式

<view class="region-top">
                    <view class="region-back iconfont icon-fanhui" bindtap="back2"></view>
                    <view class="title">选择城市</view>
                </view>
                <view class="region-tabs">
                    <text class="tab" bindtap="showProvince">{{currentProvince}}</text>
                    <text class="tab" bindtap="showCity" >{{currentCity}}</text>
                    <text class="tab" bindtap="showDistrict" >{{currentDistrict}}</text>
                </view>
                <scroll-view scroll-y style="height:1050rpx;">
                    <view class="region-list" wx:if="{{regionShow.province}}">
                        <view class="region-item" wx:for="{{regionData.province}}" wx:key="index">
                            <view data-id="{{item.id}}" data-name="{{item.fullname}}" bindtap="selectProvince">
                                <text>{{item.fullname}}</text>
                            </view>
                        </view>
                    </view>
                    <view class="region-list" wx:if="{{regionShow.city}}">
                        <view class="region-item" wx:for="{{regionData.city}}" wx:key="index">
                            <view data-id="{{item.id}}" data-name="{{item.fullname}}" bindtap="selectCity">
                                <text>{{item.fullname}}</text>
                            </view>
                        </view>
                    </view>
                    <view class="region-list" wx:if="{{regionShow.district}}">
                        <view class="region-item" wx:for="{{regionData.district}}" wx:key="index">
                            <view data-id="{{item.id}}" data-name="{{item.fullname}}"
                                  data-latitude="{{item.location.lat}}" data-longitude="{{item.location.lng}}"
                                  bindtap="selectDistrict">
                                <text>{{item.fullname}}</text>
                            </view>
                        </view>
                    </view>

2、省市区缓存

        省市区相当于先是几个层级的筛选,所以得先从地图查一下进行级联缓存,不然每次调用地图卡死了,用户体验会很差

getRegionData: function () {
        let self = this;
        console.log('调用获取城市列表接口')
        //调用获取城市列表接口
        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];
                                console.log('setData');
                                self.setData({
                                    regionData: {
                                        province: provinceArr,
                                        city: cityArr,
                                        district: districtArr
                                    }
                                })
                            },
                            fail: function (error) {
                                console.error(error);
                            },
                            complete: function (res) {
                                console.log(res);
                            }
                        });
                    }
                    // }
                }
                console.log('now res:{}', res);
                console.log('self.data.currentRegion:{}', JSON.stringify(self.data.currentRegion));
                
            },
            fail: function (error) {
                console.error(error);
            },
            complete: function (res) {
                console.log(res);
            }
        });
    },

3、打开省市区页面

        

chooseCity: function () {
        let self = this;
        self.getRegionData();
        self.setData({
            chooseCity: true,
            regionShow: {
                province: true,
                city: false,
                district: false
            },
            currentProvince: self.data.currentRegion.province,
            currentCity: self.data.currentRegion.city,
            currentDistrict: self.data.currentRegion.district,
        })
    },

4、选择省市区

showProvince: function () {
        console.log('showProvince')
        console.log(this.data.regionData.province)
        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 bj = self.data.regionShow;
            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 bj = self.data.regionShow;
        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;
        self.setData({
            currentDistrict: name,
            latitude: latitude,
            longitude: longitude,
            currentRegion: {
                province: self.data.currentProvince,
                city: self.data.currentCity,
                district: name
            },
            chooseCity: false,
            keyword: self.data.defaultKeyword
        })
        self.nearby_search();
    },
    //根据选择省市加载市区列表
    getById: function (id, name, bj) {
        let self = this;
        qqmapsdk.getDistrictByCityId({
            // 传入对应省份ID获得城市数据,传入城市ID获得区县数据,依次类推
            id: id, //对应接口getCityList返回数据的Id,如:北京是'110000'
            success: function (res) {//成功后的回调
                //console.log(res);
                if (bj.province) {
                    self.setData({
                        regionData: {
                            province: self.data.regionData.province,
                            city: res.result[0],
                            district: self.data.regionData.district
                        }
                    })
                    self.showCity();
                } else if (bj.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);
            }
        });
    },

4、确认定位

        这个要看啦,作者是在同一个页面,只是把地图当成一个弹窗,所以只要关闭弹窗就行,变量设置到这个页面了

        如果地图是另外一个页面,还要跳转的时候把数据带过去

5、效果

 四、总结

        定位的搜索和省市区筛选基本就这样了,后端是依赖腾讯地图的,作者在之前的文章也写了怎么引用腾讯地图,有疑问的小伙伴欢迎评论区私聊。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/537030.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mongodb前后端整合篇

一、前端篇 1.1mongoose介绍 Mongoose 是一个对象文档模型库&#xff0c;官网 http://www.mongoosejs.net/ 方便使用代码操作 mongodb 数据库pnpm i mongoose5.13.15 1.2初步使用 import mongoose from mongoose; //设置 strictQuery 为 true mongoose.set(strictQuery, true…

【D3.js Tidy tree绘制树形图,单棵树,左右树,平移,拖拽,树形中的天花板实现,源码实现】

这里写自定义目录标题 D3.js Tidy tree绘制树形图,单棵树,左右树,平移,拖拽,树形中的天花板实现,源码实现D3 简介D3 官网有很多例子,这里说的是Tidy tree[树形图表svg][左侧关系->中间对象<-右侧关系 ] 树形实现 D3.js Tidy tree绘制树形图,单棵树,左右树,平移,拖拽,树形…

网易云信携手 DCloud,共同助力应用开发效率飞升

近日&#xff0c;持续数月的 DCloud 2023 插件开发大赛正式放榜&#xff0c;网易云信音视频呼叫组件获得了本次大赛二等奖。 作为大赛获奖的优秀插件&#xff0c;云信 RTC 呼叫组件已正式在 DCloud 官方插件市场上线&#xff0c;方便企业开发者快速下载和集成&#xff0c;以丰富…

如何快速写一份简历

文章目录 如何快速写一份简历一些写简历的技巧 最近一段时间一直在忙简历相关的事情&#xff0c;起初是有一个其他行业的朋友问我&#xff0c;说这些简历我写了好久真难写&#xff0c;我说你可以借助AI&#xff0c;现在这种工具多了去了&#xff0c;为什么不借助呢&#xff1f;…

最简单的ubuntu安装docker教程

本文参考自docker官方教程&#xff1a;ubuntu上安装docker 一、安装Docker 第一步&#xff1a;添加Docker官方的GPG密钥 直接复制所有代码&#xff0c;作为一行运行即可 sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/k…

Redis性能管理和集群的三种模式(二)

一、Redis集群模式 1.1 redis的定义 redis 集群 是一个提供高性能、高可用、数据分片、故障转移特性的分布式数据解决方案 1.2 redis的功能 数据分片&#xff1a;redis cluster 实现了数据自动分片&#xff0c;每个节点都会保存一份数据故障转移&#xff1a;若个某个节点发生故…

WordPress上建立电商平台

WordPress是一个功能强大的内容管理系统&#xff08;CMS&#xff09;&#xff0c;它可以被用来建立各种类型的网站&#xff0c;包括电商平台。要在WordPress上建立电商平台&#xff0c;你可以遵循以下步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#x…

.NET MAUI使用Visual Studio Android Emulator(安卓模拟器)运行

Android Emulator&#xff08;安卓模拟器&#xff09;运行&#xff1a; 安卓模拟器一直卡在不动&#xff1a; 在某些情况下&#xff0c;在“打开或关闭 Windows 功能”对话框中启用 Hyper-V 和 Windows 虚拟机监控程序平台后可能无法正确启用Hyper-V。 我就是开启Hyper-V才把安…

2024 MathorCupB 题 甲骨文智能识别中原始拓片单字自动分割与识别研究

一、问题重述 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值&#xff0c;不仅对中国文明的起源具有重要意义&#xff0c;也对世界文明的研究有着深远影响。在我国政府的大力推动下&#xff0c;甲骨…

DS数模-Mathorcup妈妈杯C题思路

2024Mathorcup数学建模挑战赛&#xff08;妈妈杯&#xff09;C题保姆级分析完整思路代码数据教学 C题题目&#xff1a;物流网络分拣中心货量预测及人员排班 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 总体分析&#xff1a;题目要求我们处理的是一个关于物流…

从“黑箱”到“透明”:云里物里电子标签助力汽车总装数字化转型

“汽车总装”指“汽车产品&#xff08;包括整车及总成等&#xff09;的装配”&#xff0c;是把经检验合格的数以百计、或数以千计的各种零部件按照一定的技术要求组装成整车及发动机、变速器等总成的工艺过程&#xff0c;是汽车产品制造过程中最重要的工艺环节之一。 其中&…

数据转换 | Matlab基于GADF格拉姆角差场一维数据转二维图像方法

目录 效果分析基本介绍程序设计参考资料获取方式 效果分析 基本介绍 GADF&#xff08;Gramian Angular Difference Field&#xff09;是一种将时间序列数据转换为二维图像的方法之一。它可以用于提取时间序列数据的特征&#xff0c;并可应用于各种领域&#xff0c;如时间序列分…

社交网络与Web3:数字社交的下一阶段

随着信息技术的飞速发展&#xff0c;人们的社交方式也发生了巨大的变化。从最初的互联网聊天室到如今的社交网络平台&#xff0c;我们已经见证了数字社交的不断演变和发展。而随着区块链技术的兴起&#xff0c;Web3时代的到来将为数字社交带来全新的可能性和挑战。本文将探讨社…

Redis7(二)数据类型及其用法

一、概述 命令不区分大小写&#xff0c;key区分大小写 数据类型针对value String List Set Hash ZSet bitmap GEO HyperLogLog Stream bitfield 二、String <K,V> 1、设值/取值 getrange key index1 index2 getrange key 0 -1//获取所有的值 SETRANGE KEY_N…

vue3前端加载动画 lottie-web 的简单使用案例

什么是 Lottie Lottie 是 Airbnb 发布的一款开源动画库&#xff0c;它适用于 Android、iOS、Web 和 Windows 的库。 它提供了一套从设计师使用 AE&#xff08;Adobe After Effects&#xff09;到各端开发者实现动画的工具流。 UED 提供动画 json 文件即可&#xff0c; 开发者就…

神经网络模型底层原理与实现9-可解释性

必要性&#xff1a;在金融、医药、自动驾驶方面&#xff0c;模型必须可解释&#xff0c;知道分类错在哪才可以更好的改进模型 解释的两类方法&#xff1a; 1.找出为什么模型认为图片是一只猫的原因 具体操作&#xff1a;a.把图片中的一部分删掉&#xff0c;如果分类错了很多&…

函数、指针和数组的相互运用(C语言)

1、函数指针数组 含义&#xff1a;数组的每个元素都是函数指针类型.eg&#xff1a; &#xff08;此代码链接&#xff1a;http://t.csdnimg.cn/ClJmb.也可以在我发布博客中找到&#xff09; 2、指向函数指针数组的指针 1、引入 3、回调函数 1、含义&#xff1a;就是一个通过…

模拟Android系统Zygote启动流程

版权声明&#xff1a;本文为梦想全栈程序猿原创文章&#xff0c;转载请附上原文出处链接和本声明 前言&#xff1a; 转眼时间过去了10年了&#xff0c;回顾整个10年的工作历程&#xff0c;做了3年的手机&#xff0c;4年左右的Android指纹相关的工作&#xff0c;3年左右的跟传感…

【数据库】GROUP BY 详解、示例、注意事项

一、基本介绍 GROUP BY 语句在 SQL 中用于将来自数据库表的记录分组&#xff0c;以便可以对每个组执行聚合函数&#xff08;如 COUNT(), MAX(), MIN(), SUM(), AVG() 等&#xff09;。使用 GROUP BY 时&#xff0c;数据库会根据一个或多个列的值将结果集分为多个分组&#xff…

BootStrap 5 保姆级教程(三):表格 图片

一、表格 1.1 基础表格 Bootstrap5 通过 .table 类来设置基础表格的样式&#xff0c;实例如下: <div class"container mt-3"><h2>基础表格</h2><p>.table 类来设置基础表格的样式:</p> <table class"table"…