|
|
@@ -45,7 +45,7 @@
|
|
|
<div class="slide-tab">
|
|
|
<div class="btn" @click="slideToView('/food')"></div>
|
|
|
<div class="btn" @click="slideToView('/video')"></div>
|
|
|
- <div class="td-btn"></div>
|
|
|
+ <div class="td-btn" :class="{ active: tabType == '3d' }" @click="goTd"></div>
|
|
|
</div>
|
|
|
<div class="chat-box" :class="{ show: showChat }">
|
|
|
<!-- <div class="icon" @click="switchChat()"></div> -->
|
|
|
@@ -101,7 +101,12 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <Dialog v-if="dialogData" :dialogData="dialogData" @close="dialogData = null" />
|
|
|
+ <Dialog v-if="dialogData" :tabType="tabType" :dialogData="dialogData" @close="dialogData = null" />
|
|
|
+
|
|
|
+ <div class="vr-content" v-if="vrLink">
|
|
|
+ <div class="vr-back" :class="{ pd: tabType == '3d' }" @click="vrLink = ''"><img src="@/assets/images/vr-back.png" alt="" /></div>
|
|
|
+ <iframe :src="vrLink" frameborder="0"></iframe>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
@@ -129,7 +134,7 @@ import axios from "axios";
|
|
|
// import jsonp from "jsonp";
|
|
|
|
|
|
import { useLineStore } from "@/stores/line";
|
|
|
-
|
|
|
+// import { throttle } from "lodash";
|
|
|
const lineStore = useLineStore();
|
|
|
const mapData = ref(null);
|
|
|
const typeData = ref(null);
|
|
|
@@ -143,6 +148,25 @@ const getData = async () => {
|
|
|
.catch((error) => {
|
|
|
console.log(error);
|
|
|
});
|
|
|
+ axios
|
|
|
+ .get("./static/data/quests.json")
|
|
|
+ .then((res) => {
|
|
|
+ questList.value = res.data;
|
|
|
+ nextTick(() => {
|
|
|
+ setTimeout(() => {
|
|
|
+ let questItems = document.querySelectorAll(".quest-item");
|
|
|
+ let w = 0;
|
|
|
+ questItems.forEach((item, index) => {
|
|
|
+ // console.error(item.getBoundingClientRect().width);
|
|
|
+ w += item.getBoundingClientRect().width + 10;
|
|
|
+ });
|
|
|
+ questW.value = w;
|
|
|
+ }, 0);
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .catch((error) => {
|
|
|
+ console.log(error);
|
|
|
+ });
|
|
|
await axios
|
|
|
.get("./static/data/weight.json")
|
|
|
.then((res) => {
|
|
|
@@ -227,13 +251,22 @@ const initTrvel = () => {
|
|
|
});
|
|
|
});
|
|
|
};
|
|
|
+const goTd = () => {
|
|
|
+ // let data =
|
|
|
+ // tabType.value = "3d";
|
|
|
+ chooseItem({ type: "3d" });
|
|
|
+};
|
|
|
|
|
|
const getHtml = (data) => {
|
|
|
activeTagData.value = data;
|
|
|
+ let calssName = "vr-btn";
|
|
|
+ if (tabType.value == "3d" && data.modelLink) {
|
|
|
+ calssName = "vr-btn model-btn";
|
|
|
+ }
|
|
|
let html = `<div class="map-window" id="mapWindow">
|
|
|
- <div class="img-box">
|
|
|
+ <div class="img-box" id="vrBtn">
|
|
|
<img src="./static/image/全部/${data.images[0]}">
|
|
|
- <div style="${data.vrLink ? "" : "display:none"}" class="vr-btn" id="vrBtn"></div>
|
|
|
+ <div style="${data.vrLink || (tabType.value == "3d" && data.modelLink) ? "" : "display:none"}" class="${calssName}" ></div>
|
|
|
<div class="close-btn" id="closeBtn"></div>
|
|
|
</div>
|
|
|
<div class="map-window-controls">
|
|
|
@@ -251,20 +284,39 @@ const openDetails = (data) => {
|
|
|
};
|
|
|
const openVrLink = () => {
|
|
|
// vrLink.value = activeTagData.value.vrLink;
|
|
|
- vrLink.value = activeTagData.value.vrLink;
|
|
|
- if (activeTagData.value.vrLink) {
|
|
|
- // vrLink.value = activeTagData.value.vrLink;
|
|
|
+
|
|
|
+ if (tabType.value == "3d") {
|
|
|
+ vrLink.value = activeTagData.value.modelLink;
|
|
|
+ if (activeTagData.value.modelLink) {
|
|
|
+ // vrLink.value = activeTagData.value.vrLink;
|
|
|
+ vrLink.value = activeTagData.value.modelLink;
|
|
|
+ } else {
|
|
|
+ openDetails();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
vrLink.value = activeTagData.value.vrLink;
|
|
|
+ if (activeTagData.value.vrLink) {
|
|
|
+ // vrLink.value = activeTagData.value.vrLink;
|
|
|
+ vrLink.value = activeTagData.value.vrLink;
|
|
|
+ } else {
|
|
|
+ openDetails();
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
-const isClose = ref(false);
|
|
|
const closeTag = (e) => {
|
|
|
+ if (e) {
|
|
|
+ e.stopPropagation();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!infoWindow) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
activeTagData.value = null;
|
|
|
infoWindow.close();
|
|
|
infoWindow = null;
|
|
|
};
|
|
|
const getDeg = () => {
|
|
|
- let deg = 0;
|
|
|
+ let deg = 180;
|
|
|
switch (tabType.value) {
|
|
|
case 1:
|
|
|
deg = -90;
|
|
|
@@ -324,17 +376,7 @@ let imageLayer = null;
|
|
|
|
|
|
const tabType = ref(6);
|
|
|
let openaiA = new OpenAI(deepseekConfig);
|
|
|
-const questList = ref([
|
|
|
- "我安排岳阳一日游行程?",
|
|
|
- "岳阳好吃的地方在哪?",
|
|
|
- "岳阳哪里最好玩?",
|
|
|
- "岳阳适合周末带小朋友亲子休闲推荐?",
|
|
|
- "预算1500,帮我制定去岳阳一家三口亲子游2天的旅游计划",
|
|
|
- "岳阳最好吃的烧烤在哪?",
|
|
|
- "岳阳网红打卡点",
|
|
|
- "岳阳最美日落观赏点在哪?",
|
|
|
- "岳阳观候鸟最佳的地方在哪?",
|
|
|
-]);
|
|
|
+const questList = ref([]);
|
|
|
|
|
|
let dataAll = {
|
|
|
model: "deepseek-chat",
|
|
|
@@ -418,6 +460,7 @@ const chooseItem = (i, index) => {
|
|
|
// marker.clearEvents("mousedown");
|
|
|
// marker.off("mousedown", hanlderMakerEvent);
|
|
|
tabType.value = i.type;
|
|
|
+ closeTag();
|
|
|
switchView(false);
|
|
|
if (markers.length) {
|
|
|
markers.forEach((item) => {
|
|
|
@@ -560,25 +603,42 @@ const setMarker = () => {
|
|
|
const setMarkerCluster = () => {
|
|
|
let pointers = [];
|
|
|
let weights = weightData.value[tabType.value];
|
|
|
-
|
|
|
- let data = mapData.value.filter((item) => {
|
|
|
-
|
|
|
+ mapData.value.forEach((item, j_index) => {
|
|
|
let weight = 1;
|
|
|
- if (item.type == tabType.value) {
|
|
|
- let pos = item.location.split(",");
|
|
|
- if (weights) {
|
|
|
- let index = weights.findIndex((w) => w == item.id);
|
|
|
- if (index >= 0) {
|
|
|
- // console.error(item.name, index, weights.length);
|
|
|
- weight = weights.length - index + 1;
|
|
|
+ if (tabType.value == "3d") {
|
|
|
+ if (item.modelLink) {
|
|
|
+ let pos = item.location.split(",");
|
|
|
+ if (weights) {
|
|
|
+ let index = weights.findIndex((w) => w == item.id);
|
|
|
+ if (index >= 0) {
|
|
|
+ // console.error(item.name, index, weights.length);
|
|
|
+ weight = weights.length - index + 1;
|
|
|
+ }
|
|
|
}
|
|
|
+ pointers.push({ weight, lnglat: [pos[0], pos[1]], info: item });
|
|
|
+
|
|
|
+ // return true;
|
|
|
}
|
|
|
- pointers.push({ weight, lnglat: [pos[0], pos[1]], info: item });
|
|
|
+ } else {
|
|
|
+ if (item.type == tabType.value) {
|
|
|
+ let pos = item.location.split(",");
|
|
|
+ if (weights) {
|
|
|
+ let index = weights.findIndex((w) => w == item.id);
|
|
|
+ if (index >= 0) {
|
|
|
+ // console.error(item.name, index, weights.length);
|
|
|
+ weight = weights.length - index + 1 + mapData.value.length;
|
|
|
+ } else {
|
|
|
+ weight = j_index;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ weight = j_index;
|
|
|
+ }
|
|
|
+ pointers.push({ weight, lnglat: [pos[0], pos[1]], info: item });
|
|
|
|
|
|
- // return true;
|
|
|
+ // return true;
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
- console.error(mapData.value.filter(item=>item.type==6));
|
|
|
clusters = new AMap.MarkerCluster(
|
|
|
map, // 地图实例
|
|
|
pointers, // 海量点数据,数据中需包含经纬度信息字段 lnglat
|
|
|
@@ -590,14 +650,14 @@ const setMarkerCluster = () => {
|
|
|
// url: `//a.amap.com/jsapi_demos/static/demo-center/icons/dir-via-marker.png`,
|
|
|
// size: new AMap.Size(50, 50),
|
|
|
// },
|
|
|
- renderClusterMarker: function (cluster) {
|
|
|
+ renderClusterMarker: (cluster) => {
|
|
|
let iconW = 115 * 0.5,
|
|
|
iconH = 115 * 0.5;
|
|
|
// let offset = new AMap.Pixel(-(iconW / 2), -(iconH / 2));
|
|
|
let offset = new AMap.Pixel(-(iconW / 2), -(iconH / 2));
|
|
|
const { marker } = cluster;
|
|
|
let extData = cluster.clusterData[0].info;
|
|
|
- console.error(extData);
|
|
|
+ // console.error(extData);
|
|
|
// marker.setContent(`<div class="custom-marker"><p>${extData.name}</p><img src="${iconList[`tagIcon${extData.type}`]}" /></div>`);
|
|
|
// marker.setContent(`<div class="custom-marker">${extData.length}</div>`);
|
|
|
marker.setContent(
|
|
|
@@ -605,7 +665,7 @@ const setMarkerCluster = () => {
|
|
|
);
|
|
|
marker.setOffset(offset);
|
|
|
},
|
|
|
- renderMarker: function (cluster) {
|
|
|
+ renderMarker: (cluster) => {
|
|
|
let extData = cluster.data[0].info;
|
|
|
const { marker } = cluster;
|
|
|
// if (data.iconSize) {
|
|
|
@@ -644,8 +704,12 @@ const setMarkerCluster = () => {
|
|
|
// content: extData.name, // 标签内容
|
|
|
// offset: new AMap.Pixel(0, -5), // 标签偏移量,可根据需要调整
|
|
|
// });
|
|
|
+ let tagType = extData.type;
|
|
|
|
|
|
- marker.setContent(`<div class="custom-marker"><p>${extData.name}</p><img style="width:${iconW}px;height:${iconH}px;" src="${iconList[`tagIcon${extData.type}`]}" /></div>`);
|
|
|
+ if (tabType.value == "3d") {
|
|
|
+ tagType = "3d";
|
|
|
+ }
|
|
|
+ marker.setContent(`<div class="custom-marker"><p>${extData.name}</p><img style="width:${iconW}px;height:${iconH}px;" src="${iconList[`tagIcon${tagType}`]}" /></div>`);
|
|
|
marker.setOffset(offset);
|
|
|
},
|
|
|
style: {
|
|
|
@@ -681,12 +745,18 @@ const hanlderClusterEvent = (e) => {
|
|
|
// mapWindow.addEventListener("click", (e) => {
|
|
|
// e.stopPropagation();
|
|
|
// });
|
|
|
- button.addEventListener("click", openDetails);
|
|
|
- vrBtn.addEventListener("click", openVrLink);
|
|
|
- closeBtn.addEventListener("click", closeTag);
|
|
|
- // button.addEventListener("touchstart", openDetails);
|
|
|
- // vrBtn.addEventListener("touchstart", openVrLink);
|
|
|
- // closeBtn.addEventListener("touchstart", closeTag);
|
|
|
+
|
|
|
+ if ("touchend" in window) {
|
|
|
+ console.log("支持 touchend");
|
|
|
+ button.addEventListener("touchend", openDetails);
|
|
|
+ vrBtn.addEventListener("touchend", openVrLink);
|
|
|
+ closeBtn.addEventListener("touchend", closeTag);
|
|
|
+ } else {
|
|
|
+ console.log("不支持 touchend")
|
|
|
+ button.addEventListener("click", openDetails);
|
|
|
+ vrBtn.addEventListener("click", openVrLink);
|
|
|
+ closeBtn.addEventListener("click", closeTag);
|
|
|
+ }
|
|
|
}, 100);
|
|
|
} else {
|
|
|
// console.error(map.getZoom());
|
|
|
@@ -821,8 +891,13 @@ const switchView = (effect = true) => {
|
|
|
// scale = 10;
|
|
|
break;
|
|
|
case 4:
|
|
|
- // scale = 12.4;
|
|
|
- // center = [113.129162, 29.369332];
|
|
|
+ scale = 12.4;
|
|
|
+ center = [113.129162, 29.369332];
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ scale = 10.6;
|
|
|
+ center = [113.207352, 29.366234];
|
|
|
+ break;
|
|
|
case 3:
|
|
|
// scale = 12;
|
|
|
break;
|
|
|
@@ -940,15 +1015,6 @@ onMounted(() => {
|
|
|
// initHammer();
|
|
|
// initTab();
|
|
|
initKeyFrames();
|
|
|
- setTimeout(() => {
|
|
|
- let questItems = document.querySelectorAll(".quest-item");
|
|
|
- let w = 0;
|
|
|
- questItems.forEach((item, index) => {
|
|
|
- // console.error(item.getBoundingClientRect().width);
|
|
|
- w += item.getBoundingClientRect().width + 10;
|
|
|
- });
|
|
|
- questW.value = w;
|
|
|
- }, 0);
|
|
|
});
|
|
|
});
|
|
|
</script>
|
|
|
@@ -990,14 +1056,14 @@ onMounted(() => {
|
|
|
background-size: 100% 100%;
|
|
|
position: absolute;
|
|
|
left: 50%;
|
|
|
- top: 50%;
|
|
|
+ top: 48%;
|
|
|
transform: translate(-50%, -50%);
|
|
|
pointer-events: auto;
|
|
|
}
|
|
|
.circle-box {
|
|
|
display: flex;
|
|
|
position: absolute;
|
|
|
- bottom: 0;
|
|
|
+ bottom: -10px;
|
|
|
left: 50%;
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
@@ -1176,14 +1242,18 @@ onMounted(() => {
|
|
|
}
|
|
|
}
|
|
|
.td-btn {
|
|
|
- width: 0.76rem;
|
|
|
- height: 0.76rem;
|
|
|
- background: url("@/assets/images/map-3d.png") no-repeat;
|
|
|
+ width: 1.0267rem;
|
|
|
+ height: 1.0267rem;
|
|
|
+ background: url("@/assets/images/map-3d-normal.png") no-repeat;
|
|
|
background-size: 100% 100%;
|
|
|
position: absolute;
|
|
|
bottom: -1.0667rem;
|
|
|
left: 50%;
|
|
|
transform: translateX(-50%);
|
|
|
+ &.active {
|
|
|
+ background: url("@/assets/images/map-3d.png") no-repeat;
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
.tab-bar {
|
|
|
@@ -1626,6 +1696,7 @@ onMounted(() => {
|
|
|
.img-box {
|
|
|
width: 100%;
|
|
|
height: 3.7333rem;
|
|
|
+ position: relative;
|
|
|
.vr-btn {
|
|
|
width: 1.4rem;
|
|
|
height: 1.4rem;
|
|
|
@@ -1636,9 +1707,19 @@ onMounted(() => {
|
|
|
left: 50%;
|
|
|
transform: translate(-50%, -50%);
|
|
|
}
|
|
|
+ .model-btn {
|
|
|
+ width: 1.4rem;
|
|
|
+ height: 1.4rem;
|
|
|
+ background: url("@/assets/images/model720.png") no-repeat;
|
|
|
+ background-size: 100% 100%;
|
|
|
+ position: absolute;
|
|
|
+ top: 50%;
|
|
|
+ left: 50%;
|
|
|
+ transform: translate(-50%, -50%);
|
|
|
+ }
|
|
|
.close-btn {
|
|
|
- width: 0.4rem;
|
|
|
- height: 0.4rem;
|
|
|
+ width: 0.5333rem;
|
|
|
+ height: 0.5333rem;
|
|
|
background: url("@/assets/images/lineClose.png") no-repeat;
|
|
|
background-size: 100% 100%;
|
|
|
position: absolute;
|
|
|
@@ -1677,4 +1758,39 @@ onMounted(() => {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+.vr-content {
|
|
|
+ position: absolute;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ z-index: 10000;
|
|
|
+ background-color: #232323;
|
|
|
+ .vr-back {
|
|
|
+ width: 0.8rem;
|
|
|
+ height: 0.8rem;
|
|
|
+ // background: url("@/assets/images/vr-back.png") no-repeat;
|
|
|
+ // background-size: 100% 100%;
|
|
|
+ position: absolute;
|
|
|
+ left: 15px;
|
|
|
+ top: 16px;
|
|
|
+ border-radius: 50%;
|
|
|
+ background: rgba(0, 0, 0, 0.5);
|
|
|
+ border-radius: 50%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ &.pd {
|
|
|
+ top: 80px;
|
|
|
+ }
|
|
|
+ img {
|
|
|
+ width: 0.5333rem;
|
|
|
+ height: 0.5333rem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ iframe {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|