//poi查询按钮 控件
class PoiQueryButton extends mars3d.control.BaseControl {
get parentContainer() {
return document.getElementsByClassName("cesium-viewer-toolbar")[0];
}
/**
* 创建_container控件容器对象的方法,
* 只会调用一次
* @return {void} 无
* @private
*/
_mountedHook() {
// 初始化页面
this.initQueryUI();
//查询控制器
this.queryPoi = new mars3d.query.GaodePOI();
//创建矢量数据图层
this.graphicLayer = new mars3d.layer.GraphicLayer();
this._map.addLayer(this.graphicLayer);
//鼠标单击后的信息面板弹窗
this.graphicLayer.bindPopup(function (event) {
let item = event.graphic.attr;
if (!item) {
return;
}
var inHtml = `
";
return inHtml;
});
}
clear() {
var ulList = this.poiButtonResult.querySelector(".searchResults");
var gaodesousuo = this.poiButtonResult.querySelector(".gaodesousuo");
if (ulList) {
ulList.remove();
}
if (this.resultNextPages) {
this.resultNextPages.remove();
}
if (gaodesousuo) {
gaodesousuo.remove();
}
if (this.graphicLayer) {
this.graphicLayer.clear();
}
}
//初始化所有相关UI
initQueryUI() {
//高度值获取
this._container = mars3d.DomUtil.create("div", "cesium-button cesium-toolbar-button");
this._container.style.display = "inline-block";
this._container.setAttribute("title", this.options.title || "POI查询");
mars3d.DomUtil.createSvg(
33,
33,
"M29.772,26.433l-7.126-7.126c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127L29.772,26.433zM7.203,13.885c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486c-0.007,3.58-2.905,6.476-6.484,6.484C10.106,20.361,7.209,17.465,7.203,13.885z",
this._container
);
//鼠标移入移出
let cacheTarget;
this._container.addEventListener("mouseover", (e) => {
//缓存,提高效率
if (cacheTarget == this.uuid) {
return;
}
cacheTarget = this.uuid;
// console.log("mouseover");
if (this.toolSearch.style.display !== "block") {
this.toolSearchNoShow("block");
this.toolActive();
mars3d.DomUtil.addClass(this._container, "queryPoiButton");
this._container.style.height = this.parentContainer.offsetHeight + 40 + "px";
this.poiButtonResult.style.height = this.parentContainer.offsetHeight - 10 + "px";
}
});
this._container.addEventListener("mouseout", (e) => {
cacheTarget = null;
// console.log("mouseout");
var queryVal = this.toolSearch.querySelector(".searchInput").value;
if (queryVal.length == 0) {
this.clear();
this.toolSearchNoShow("none");
mars3d.DomUtil.removeClass(this._container, "queryPoiButton");
this._container.style.height = "";
}
});
// input面板,在queryPoiButton下面
this.toolSearch = mars3d.DomUtil.create("div", "toolSearch");
this._container.appendChild(this.toolSearch);
// 搜寻结果,在mars3dContainer面板下面
this.poiButtonResult = mars3d.DomUtil.create("div", "poiButtonResult");
this._container.appendChild(this.poiButtonResult);
this.toolSearchNoShow("none");
// 创建input输入框
var textInput = mars3d.DomUtil.create("input", "searchInput");
textInput.type = "search";
textInput.setAttribute("placeholder", "请输入地址...");
this.toolSearch.appendChild(textInput);
// input的单击事件
var deleteInput = mars3d.DomUtil.create("div", "deleteInput");
this.toolSearch.appendChild(deleteInput);
this.addElementP(deleteInput, "×", () => {
this.toolSearch.querySelector(".searchInput").value = "";
this.clear();
this.toolSearchNoShow("none");
mars3d.DomUtil.removeClass(this._container, "queryPoiButton");
this._container.style.height = "";
cacheTarget = null;
});
// 绑定change事件
var timetik;
textInput.addEventListener("input", () => {
this.clear();
clearTimeout(timetik);
timetik = setTimeout(() => {
var queryVal = this.toolSearch.querySelector(".searchInput").value;
if (queryVal.length !== 0) {
deleteInput.style.display = "block";
this.autoTip(queryVal);
}
}, 250);
});
//绑定回车键
textInput.addEventListener("keydown", (event) => {
if (event.keyCode == "13") {
clearTimeout(timetik);
// 让change事件执行完成之后,在执行以下操作
timetik = setTimeout(() => {
this.clear();
this.showPages = 1;
this.strartQueryPOI();
}, 250);
}
});
}
toolActive() {
this.toolSearch.style.display = "block";
let searchInput = this.toolSearch.querySelector(".searchInput");
searchInput.focus();
if (document.activeElement.tagName == "INPUT" && searchInput.value == "") {
return;
}
this.clear();
this.showPages = 1;
this.strartQueryPOI();
}
// 根据输入框内容,查询显示列表
strartQueryPOI() {
var text = this.toolSearch.querySelector(".searchInput").value;
if (text.trim().length == 0) {
haoutil.msg("请输入搜索关键字!");
return;
}
//输入经纬度数字时
if (this.isLonLat(text)) {
this.centerAtLonLat(text);
return;
}
this.queryTextByServer(text);
}
queryTextByServer(text) {
this.queryPoi.queryText({
text: text,
count: 10,
page: this.showPages - 1,
success: (result) => {
// console.log("文字搜索", result);
var pois = result.list;
if (pois.length > 0) {
result.list.forEach((item, index) => {
if (!item.x || !item.y) {
return;
}
// 在地图上将搜寻的结果展现为矢量数据
var graphic = new mars3d.graphic.PointEntity({
id: item.id,
position: [item.x, item.y],
style: {
name: item.name,
pixelSize: 10,
color: "#3388ff",
outline: true,
outlineColor: "#ffffff",
outlineWidth: 2,
scaleByDistance: new Cesium.NearFarScalar(1000, 1, 1000000, 0.1),
clampToGround: true, //贴地
visibleDepth: false, //是否被遮挡
highlight: {
type: mars3d.EventType.click,
color: "#ff0000",
},
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);
});
this.graphicLayer.flyTo();
console.log(result);
this.showDifferentPagesResult(result);
}
},
});
}
flyTo(item) {
var graphic = this.graphicLayer.getGraphicById(item.id);
if (graphic == null) {
window.toastr.warning(item.name + " 无经纬度坐标信息!");
return;
}
graphic.openHighlight();
graphic.flyTo({
radius: 2000,
complete: () => {
graphic.openPopup();
},
});
}
//构造查询结果的面板Html
showDifferentPagesResult(result) {
this.poiButtonResult.innerHTML = "";
// 页面上显示结果li列表
var resultDiv = document.createElement("div");
resultDiv.className = "searchResults";
var suggestionsList = document.createElement("ul");
resultDiv.appendChild(suggestionsList);
this.poiButtonResult.appendChild(resultDiv);
result.list.forEach((item, index) => {
var name = item.name;
if (!item.x || !item.y) {
return;
}
var number;
if (this.showPages > 1) {
number = (this.showPages - 1) * 10 + index + 1;
} else {
number = index + 1;
}
var suggestions = document.createElement("li");
var resultList = document.createTextNode(number + ". " + name);
suggestionsList.appendChild(suggestions);
suggestions.appendChild(resultList);
suggestions.addEventListener("click", () => {
this.flyTo(item);
});
});
var allPages = Math.ceil(result.allcount / 10); // 全部的页数 10 = result.count
this.resultNextPages = document.createElement("div");
this.resultNextPages.className = "resultNextPages";
this.poiButtonResult.appendChild(this.resultNextPages);
// 共加载条数
this.addElementP(this.resultNextPages, "共加载了" + result.allcount + "条", null);
// 展示的页数
this.addElementP(this.resultNextPages, this.showPages + "/" + allPages + "页", null);
// 首页
this.addElementP(this.resultNextPages, "首页", () => {
this.showPages = 1;
this.pagesClickToPages(this.resultNextPages);
});
// 上一页
this.addElementP(this.resultNextPages, "<", () => {
if (this.showPages == 1) {
haoutil.msg("当前已是第一页!");
return;
}
this.showPages--;
this.pagesClickToPages(this.resultNextPages);
});
// 下一页
this.addElementP(this.resultNextPages, ">", () => {
if (this.showPages >= allPages) {
haoutil.msg("当前已是最后一页!");
return;
}
this.showPages++;
this.pagesClickToPages(this.resultNextPages); //查询结果
});
}
// 添加p元素
addElementP(parentElement, chilidWord, callback) {
var allResult = document.createElement("p");
var allResultWord = document.createTextNode(chilidWord);
parentElement.appendChild(allResult); //添加p元素
allResult.appendChild(allResultWord); // 给p元素添加内容
allResult.addEventListener("click", callback);
}
// 点击上、下一页,清空当前页
pagesClickToPages(allPages) {
if (allPages) {
this.addElementP(this.poiButtonResult, this.showPages + "/" + allPages + "页");
}
if (this.graphicLayer) {
this.graphicLayer.clear();
}
this.strartQueryPOI();
}
autoTip(text) {
this.queryPoi.autoTip({
text: text,
success: (result) => {
var pois = result.list;
let gaodesousuo = this.poiButtonResult.querySelector(".gaodesousuo");
if (gaodesousuo) {
gaodesousuo.remove();
}
var resultDiv = document.createElement("div");
resultDiv.className = "searchResults gaodesousuo";
var suggestionsList = document.createElement("ul");
resultDiv.appendChild(suggestionsList);
this.poiButtonResult.appendChild(resultDiv);
if (pois.length > 0) {
result.list.forEach((item) => {
var name = item.name;
var suggestions = document.createElement("li");
var resultList = document.createTextNode(name);
var fa_search = document.createElement("span");
fa_search.className = "fa fa-search";
suggestions.appendChild(fa_search);
suggestionsList.appendChild(suggestions);
suggestions.appendChild(resultList);
suggestions.addEventListener("click", () => {
this.toolSearch.querySelector(".searchInput").value = name;
this.showPages = 1;
this.queryTextByServer(name);
});
});
} else {
resultDiv.style.display = "none";
}
},
});
}
toolSearchNoShow(val) {
this.toolSearch.style.display = val;
this.poiButtonResult.style.display = val;
}
//===================坐标定位处理========================
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;
}
this.map.setCameraView({ x: jd, y: wd, minz: 2500 });
//添加实体
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(`
`);
setTimeout(() => {
graphic.openPopup();
}, 3000);
}
}