"use script"; //开发环境建议开启严格模式 (function (window, mars3d) { //创建widget类,需要继承BaseWidget class MyWidget extends mars3d.widget.BaseWidget { //外部资源配置 get resources() { return ["view.css"]; } //弹窗配置 get view() { return { type: "append", url: "view.html", parent: "body", }; } //初始化[仅执行1次] create() { this.storageName = "mars3d_queryBaiduPOI"; this.pageSize = 6; this.allpage = 0; this.thispage = 0; //创建矢量数据图层 this.graphicLayer = new mars3d.layer.GraphicLayer({ name: this.config.name, pid: 99, //图层管理 中使用,父节点id }); //鼠标单击后的信息面板弹窗 this.graphicLayer.bindPopup(function (event) { let item = event.graphic?.attr; if (!item) { return; } var name; if (item.detailUrl) { name = '' + item.name + ""; } else { name = item.name; } var inHtml = '
' + name + '
'; var phone = $.trim(item.tel); if (phone != "") { inHtml += "
" + phone + "
"; } var dz = $.trim(item.address); if (dz != "") { inHtml += "
" + dz + "
"; } if (item.type) { var fl = $.trim(item.type); if (fl != "") { inHtml += "
" + fl + "
"; } } inHtml += "
"; return inHtml; }); //查询控制器 this._queryPoi = new mars3d.query.BaiduPOI({ // city: '合肥市', }); } //每个窗口创建完成后调用 winCreateOK(opt, result) { if (opt.type != "append") { return; } var that = this; var img = $("#map-querybar img"); img.each((index, item) => { $(item).attr("src", this.path + $(item).attr("src")); }); if (this.config.position) { $("#map-querybar").css(this.config.position); } if (this.config.style) { $("#map-querybar").css(this.config.style); } // 搜索框 $("#txt_querypoi").click(function () { // 文本框内容为空 if ($.trim($(this).val()).length === 0) { that.hideAllQueryBarView(); that.showHistoryList(); // 显示历史记录 } }); var timetik = 0; // 搜索框绑定文本框值发生变化,隐藏默认搜索信息栏,显示匹配结果列表 $("#txt_querypoi").bind("input propertychange", () => { clearTimeout(timetik); timetik = setTimeout(() => { this.hideAllQueryBarView(); this.clearLayers(); var queryVal = $.trim($("#txt_querypoi").val()); if (queryVal.length == 0) { // 文本框内容为空,显示历史记录 this.showHistoryList(); } else { this.autoTipList(queryVal, true); } }, 500); }); // 点击搜索查询按钮 $("#btn_querypoi").click(() => { clearTimeout(timetik); this.hideAllQueryBarView(); var queryVal = $.trim($("#txt_querypoi").val()); this.strartQueryPOI(queryVal, true); }); //绑定回车键 $("#txt_querypoi").bind("keydown", (event) => { if (event.keyCode == "13") { $("#btn_querypoi").click(); } }); // 返回查询结果面板界面 $("#querybar_detail_back").click(() => { this.hideAllQueryBarView(); $("#querybar_resultlist_view").show(); }); } //打开激活 activate() { this.map.addLayer(this.graphicLayer); $(".mars3d-locationbar").append('
'); //单击地图事件 this.map.on(mars3d.EventType.clickMap, this.onMapClick, this); this.map.on(mars3d.EventType.cameraChanged, this.onMapCameraChanged, this); } //关闭释放 disable() { this.map.removeLayer(this.graphicLayer); //释放单击地图事件 this.map.off(mars3d.EventType.clickMap, this.onMapClick, this); this.map.off(mars3d.EventType.cameraChanged, this.onMapCameraChanged, this); $("#queryAddress").remove(); this.hideAllQueryBarView(); this.clearLayers(); } onMapClick(event) { // 点击地图区域,隐藏所有弹出框 if ($.trim($("#txt_querypoi").val()).length == 0) { this.hideAllQueryBarView(); $("#txt_querypoi").blur(); } } onMapCameraChanged(event) { let radius = this.map.camera.positionCartographic.height; //单位:米 if (radius > 100000) { this.address = null; $("#queryAddress").html(""); return; } this._queryPoi.getAddress({ location: this.map.getCenter(), success: (result) => { // console.log("地址", result); this.address = result; $("#queryAddress").html("地址:" + result.address); }, }); } hideAllQueryBarView() { $("#querybar_histroy_view").hide(); $("#querybar_autotip_view").hide(); $("#querybar_resultlist_view").hide(); } // 点击面板条目,自动填充搜索框,并展示搜索结果面板 autoSearch(name) { $("#txt_querypoi").val(name); $("#btn_querypoi").trigger("click"); } //===================与后台交互======================== //显示智能提示搜索结果 autoTipList(text, queryEx) { //输入经纬度数字时 if (this.isLonLat(text)) { return; } //查询外部widget if (this.hasExWidget() && queryEx) { this.autoExTipList(text); return; } //查询外部widget //搜索提示 this._queryPoi.autoTip({ text: text, city: this.address?.city, location: this.map.getCenter(), success: (result) => { var inhtml = ""; var pois = result.list; for (var index = 0; index < pois.length; index++) { var name = pois[index].name; // var num = pois[index].num; // if (num > 0) continue; inhtml += "
  • " + name + "
  • "; } if (inhtml.length > 0) { $("#querybar_ul_autotip").html(inhtml); $("#querybar_autotip_view").show(); } }, }); } // 根据输入框内容,查询显示列表 strartQueryPOI(text, queryEx) { if (text.length == 0) { toastr.warning("请输入搜索关键字!"); return; } // TODO:根据文本框输入内容,从数据库模糊查询到所有匹配结果(分页显示) this.addHistory(text); this.hideAllQueryBarView(); //输入经纬度数字时 if (this.isLonLat(text)) { this.centerAtLonLat(text); return; } //查询外部widget if (this.hasExWidget() && queryEx) { var qylist = this.queryExPOI(text); return; } //查询外部widget this.thispage = 1; this.queryText = text; this.query_city = this.address?.city; // this.query_location = this.map.getCenter() // this.query_radius = this.map.camera.positionCartographic.height //单位:米 this.queryTextByServer(); } queryTextByServer() { //查询获取数据 this._queryPoi.queryText({ text: this.queryText, count: this.pageSize, page: this.thispage - 1, city: this.query_city, // location: this.query_location, // radius: this.query_radius, success: (result) => { if (!this.isActivate) { return; } this.showPOIPage(result.list, result.allcount); }, }); } //===================显示查询结果处理======================== showPOIPage(data, counts) { // count -- 显示搜索结果的数量;data -- 结果的属性,如地址电话等 if (counts < data.length) { counts = data.length; } this.allpage = Math.ceil(counts / this.pageSize); var inhtml = ""; if (counts == 0) { inhtml += '
    没有找到"' + this.queryText + '"相关结果
    '; } else { this.objResultData = this.objResultData || {}; for (var index = 0; index < data.length; index++) { var item = data[index]; var startIdx = (this.thispage - 1) * this.pageSize; item.index = startIdx + (index + 1); var _id = index; inhtml += `

    ${item.index}、${item.name} 更多>

    ${item.address || ""}

    `; this.objResultData[_id] = item; } //分页信息 var _fyhtml; if (this.allpage > 1) { _fyhtml = '
    ' + this.thispage + "/" + this.allpage + '页 首页 < >
    '; } else { _fyhtml = ""; } //底部信息 inhtml += '
    找到' + counts + "条结果
    " + _fyhtml + "
    "; } $("#querybar_resultlist_view").html(inhtml); $("#querybar_resultlist_view").show(); this.showPOIArr(data); if (counts == 1) { this.showDetail("0"); } } showFirstPage() { this.thispage = 1; this.queryTextByServer(); } showNextPage() { this.thispage = this.thispage + 1; if (this.thispage > this.allpage) { this.thispage = this.allpage; toastr.warning("当前已是最后一页了"); return; } this.queryTextByServer(); } showPretPage() { this.thispage = this.thispage - 1; if (this.thispage < 1) { this.thispage = 1; toastr.warning("当前已是第一页了"); return; } this.queryTextByServer(); } //点击单个结果,显示详细 showDetail(id) { var item = this.objResultData[id]; this.flyTo(item); } clearLayers() { this.graphicLayer.closePopup(); this.graphicLayer.clear(); } showPOIArr(arr) { this.clearLayers(); arr.forEach((item) => { var jd = Number(item.lng); var wd = Number(item.lat); if (isNaN(jd) || isNaN(wd)) { return; } item.lng = jd; item.lat = wd; //添加实体 var graphic = new mars3d.graphic.PointEntity({ position: Cesium.Cartesian3.fromDegrees(jd, wd), style: { pixelSize: 10, color: "#3388ff", outline: true, outlineColor: "#ffffff", outlineWidth: 2, scaleByDistance: new Cesium.NearFarScalar(1000, 1, 1000000, 0.1), clampToGround: true, //贴地 visibleDepth: false, //是否被遮挡 label: { text: item.name, font_size: 20, color: "rgb(240,255,255)", outline: true, outlineWidth: 2, outlineColor: Cesium.Color.BLACK, horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, pixelOffsetY: -10, //偏移量 distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.0, 200000), clampToGround: true, //贴地 visibleDepth: false, //是否被遮挡 }, }, attr: item, }); this.graphicLayer.addGraphic(graphic); item._graphic = graphic; }); if (arr.length > 1) { this.graphicLayer.flyTo(); } } flyTo(item) { var graphic = item._graphic; if (graphic == null) { window.toastr.warning(item.name + " 无经纬度坐标信息!"); return; } this.map.flyToGraphic(graphic, { radius: 2000 }); setTimeout(() => { this.graphicLayer.openPopup(graphic); }, 3000); } //===================坐标定位处理======================== isLonLat(text) { var reg = /^-?((0|1?[0-7]?[0-9]?)(([.][0-9]*)?)|180(([.][0]*)?)),-?((0|[1-8]?[0-9]?)(([.][0-9]*)?)|90(([.][0]*)?))$/; /*定义验证表达式*/ return reg.test(text); /*进行验证*/ } centerAtLonLat(text) { var arr = text.split(","); if (arr.length != 2) { return; } var jd = Number(arr[0]); var wd = Number(arr[1]); if (isNaN(jd) || isNaN(wd)) { return; } //添加实体 var graphic = new mars3d.graphic.PointEntity({ position: Cesium.Cartesian3.fromDegrees(jd, wd), style: { color: "#3388ff", pixelSize: 10, outline: true, outlineColor: "#ffffff", outlineWidth: 2, scaleByDistance: new Cesium.NearFarScalar(1000, 1, 1000000, 0.1), clampToGround: true, //贴地 visibleDepth: false, //是否被遮挡 }, }); this.graphicLayer.addGraphic(graphic); graphic.bindPopup(`
    坐标定位
    ${jd}
    ${wd}
    `); graphic.openHighlight(); graphic.flyTo({ radius: 1000, //点数据:radius控制视距距离 scale: 1.5, //线面数据:scale控制边界的放大比例 complete: () => { graphic.openPopup(); }, }); } //===================历史记录相关======================== showHistoryList() { $("#querybar_histroy_view").hide(); localforage.getItem(this.storageName).then((laststorage) => { if (laststorage == null) { return; } this.arrHistory = eval(laststorage); if (this.arrHistory == null || this.arrHistory.length == 0) { return; } var inhtml = ""; for (var index = this.arrHistory.length - 1; index >= 0; index--) { var item = this.arrHistory[index]; inhtml += "
  • " + item + "
  • "; } $("#querybar_ul_history").html(inhtml); $("#querybar_histroy_view").show(); }); } clearHistory() { this.arrHistory = []; localforage.removeItem(this.storageName); $("#querybar_ul_history").html(""); $("#querybar_histroy_view").hide(); } //记录历史值 addHistory(data) { this.arrHistory = []; localforage.getItem(this.storageName).then((laststorage) => { if (laststorage != null) { this.arrHistory = eval(laststorage); } //先删除之前相同记录 haoutil.array.remove(this.arrHistory, data); this.arrHistory.push(data); if (this.arrHistory.length > 10) { this.arrHistory.splice(0, 1); } localforage.setItem(this.storageName, this.arrHistory); }); } //======================查询非百度poi,联合查询处理================= //外部widget是否存在或启用 hasExWidget() { if (window["queryBarWidget"] == null) { return false; } else { this.exWidget = window.queryBarWidget; return true; } } autoExTipList(text) { this.exWidget.autoTipList(text, () => { this.autoTipList(text, false); }); } //调用外部widget进行查询 queryExPOI(text) { var layer = this.graphicLayer; this.exWidget.strartQueryPOI(text, layer, () => { this.strartQueryPOI(text, false); }); } } //注册到widget管理器中。 window.queryBaiduPOIWidget = mars3d.widget.bindClass(MyWidget); //每个widet之间都是直接引入到index.html中,会存在彼此命名冲突,所以闭包处理下。 })(window, mars3d);