123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567 |
- "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_queryGaodePOI";
- 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 inHtml = `<div class="mars-popup-titile"><a href="https://www.amap.com/detail/${item.id}" target="_black" style="color: #ffffff; ">${item.name}</a></div><div class="mars-popup-content" >`;
- var phone = $.trim(item.tel);
- if (phone != "") {
- inHtml += "<div><label>电话</label>" + phone + "</div>";
- }
- var dz = $.trim(item.address);
- if (dz != "") {
- inHtml += "<div><label>地址</label>" + dz + "</div>";
- }
- if (item.type) {
- var fl = $.trim(item.type);
- if (fl != "") {
- inHtml += "<div><label>类别</label>" + fl + "</div>";
- }
- }
- inHtml += "</div>";
- return inHtml;
- });
- //查询控制器
- this._queryPoi = new mars3d.query.GaodePOI({
- // 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('<div id="queryAddress" class="mars3d-locationbar-content" style="margin-right: 50px;"></div>');
- //单击地图事件
- 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 += "<li><i class='fa fa-search'></i><a href=\"javascript:queryGaodePOIWidget.autoSearch('" + name + "');\">" + name + "</a></li>";
- }
- 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 += '<div class="querybar-page"><div class="querybar-fl">没有找到"<strong>' + this.queryText + '</strong>"相关结果</div></div>';
- } 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 += `<div class="querybar-site" onclick="queryGaodePOIWidget.showDetail('${_id}')">
- <div class="querybar-sitejj">
- <h3>${item.index}、${item.name}
- <a id="btnShowDetail" href="https://www.amap.com/detail/${item.id}" target="_blank" class="querybar-more">更多></a> </h3>
- <p> ${item.address || ""}</p>
- </div>
- </div> `;
- this.objResultData[_id] = item;
- }
- //分页信息
- var _fyhtml;
- if (this.allpage > 1) {
- _fyhtml =
- '<div class="querybar-ye querybar-fr">' +
- this.thispage +
- "/" +
- this.allpage +
- '页 <a href="javascript:queryGaodePOIWidget.showFirstPage()">首页</a> <a href="javascript:queryGaodePOIWidget.showPretPage()"><</a> <a href="javascript:queryGaodePOIWidget.showNextPage()">></a> </div>';
- } else {
- _fyhtml = "";
- }
- //底部信息
- inhtml += '<div class="querybar-page"><div class="querybar-fl">找到<strong>' + counts + "</strong>条结果</div>" + _fyhtml + "</div>";
- }
- $("#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(`<div class="mars-popup-titile">坐标定位</div>
- <div class="mars-popup-content" >
- <div><label>经度</label> ${jd}</div>
- <div><label>纬度</label>${wd}</div>
- </div>`);
- 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 += "<li><i class='fa fa-history'/><a href=\"javascript:queryGaodePOIWidget.autoSearch('" + item + "');\">" + item + "</a></li>";
- }
- $("#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.queryGaodePOIWidget = mars3d.widget.bindClass(MyWidget);
- //每个widet之间都是直接引入到index.html中,会存在彼此命名冲突,所以闭包处理下。
- })(window, mars3d);
|