<template>
<div id="cesiumContainer"></div>
<div ref="miniMapContainer" class="mini-map" @click="handleMiniMapClick">
<div class="view-indicator" :style="indicatorStyle"></div>
</div>
<Search />
<LocationBar
v-if="loaded"
:update-interval="100"
:use-dms-format="useDmsFormat"
/>
</template>
<style>
/* @import "/temp/css/divGraphic.css"; */
</style>
<script setup lang="ts">
import { computed, onUnmounted, onMounted } from "vue";
import LocationBar from "./location-bar.vue";
import Search from "./search.vue";
import initMap from "./init";
import { ref } from "vue";
import { loadRipplePoints, createMultipleRippleCircles } from './circle.js';
import { $prototype } from "../../main.ts";
const miniMapContainer = ref<HTMLElement>();
let viewIndicator: Rectangle;
// 视图指示器样式
const indicatorStyle = ref({
left: "0px",
top: "0px",
width: "0px",
height: "0px",
});
// 更新指示器位置
const updateIndicatorPosition = () => {
if (!$prototype.$map) return;
const camera = $prototype.$map.camera;
const rect = camera.computeViewRectangle();
if (!rect) return;
// 计算指示器在鹰眼中的位置
const miniMapWidth = miniMapContainer.value?.clientWidth || 200;
const miniMapHeight = miniMapContainer.value?.clientHeight || 150;
// 更新CSS指示器(用于点击交互)
const westPercent = (((rect.west * 180) / Math.PI + 180) / 360) * 100;
const eastPercent = (((rect.east * 180) / Math.PI + 180) / 360) * 100;
const southPercent = ((90 - (rect.south * 180) / Math.PI) / 180) * 100;
const northPercent = ((90 - (rect.north * 180) / Math.PI) / 180) * 100;
indicatorStyle.value = {
left: `${westPercent}%`,
top: `${northPercent}%`,
width: `${eastPercent - westPercent}%`,
height: `${southPercent - northPercent}%`,
};
return rect;
};
let miniMapViewer = null;
const initMiniMap = () => {
Cesium.Ion.defaultAccessToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIxMDhlNDdmYy03NzFhLTQ1ZTQtOWQ3NS1lZDAzNDc3YjE4NDYiLCJpZCI6MzAxNzQyLCJpYXQiOjE3NDcwNTMyMDN9.eaez8rQxVbPv2LKEU0sMDclPWyHKhh1tR27Vg-_rQSM";
if (!miniMapContainer.value) return;
// 鹰眼地图初始化
miniMapViewer = new Cesium.Viewer(miniMapContainer.value, {
sceneMode: Cesium.SceneMode.SCENE2D,
baseLayerPicker: false,
homeButton: false,
timeline: false,
navigationHelpButton: false,
animation: false,
scene3DOnly: true,
selectionIndicator: false,
infoBox: false,
imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
url: "https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer",
}),
terrainProvider: window.Cesium.createWorldTerrain(),
});
var toolbar = miniMapViewer.container.getElementsByClassName(
"cesium-viewer-toolbar"
)[0];
if (toolbar) {
toolbar.style.display = "none";
}
// 隐藏鹰眼控件
miniMapViewer.cesiumWidget.creditContainer.style.display = "none";
// 设置鹰眼固定视角
// miniMapViewer.camera.setView({
// destination: new Cesium.Cartesian3(
// -2432812.6687511606,
// 5559483.804371395,
// 2832009.419525571
// ),
// });
};
function initRectangle() {
miniMapViewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(113.200224, 27.004546, 500),
orientation: {
heading: 3.1769448901508976,
pitch: -0.2880443992926125,
roll: 6.283184370499525,
},
duration: 3.0, // 飞行时间(秒)
});
// 创建视图指示器
viewIndicator = miniMapViewer.entities.add({
rectangle: {
// coordinates: new window.Cesium.CallbackProperty(
// updateIndicatorPosition,
// false
// ),
coordinates: new Cesium.CallbackProperty(function () {
// 必须返回 Cesium.Rectangle 对象
return new Cesium.Rectangle(
Cesium.Math.toRadians(113.125), // 西经
Cesium.Math.toRadians(26.9541), // 南纬
Cesium.Math.toRadians(113.2542), // 东经
Cesium.Math.toRadians(27.2545225) // 北纬
);
}, false), // false 表示不持续更新(性能优化)
material: Cesium.Color.RED.withAlpha(0.3),
outline: true,
outlineColor: Cesium.Color.RED,
outlineWidth: 2,
},
});
miniMapViewer.flyTo(viewIndicator, {
duration: 2, // 飞行持续时间(秒)
offset: new Cesium.HeadingPitchRange(
Cesium.Math.toRadians(0), // 朝向角度(0表示正北)
Cesium.Math.toRadians(-45), // 俯仰角度(-45度俯视)
10000 // 距离目标的距离(米)
),
});
console.log(miniMapViewer.entities);
}
const loaded = ref(false);
const useDmsFormat = ref(false);
function addDemoGraphics() {
const chinaBoundary = $prototype.$map.dataSources.add(
Cesium.GeoJsonDataSource.load("/shp_zz.geojson", {
stroke: Cesium.Color.WHITE,
fill: false,
clampToGround: true,
describe: null, // 禁用默认样式描述
})
);
// 添加标签
chinaBoundary.then((dataSource) => {
const entities = dataSource.entities.values;
for (let entity of entities) {
if (entity.polyline) {
entity.polyline.fill = false;
// entity.polyline.material.color = Cesium.Color.BLACK; // 彻底移除材质
}
}
});
}
function flyToDes() {
const center = Cesium.Cartesian3.fromDegrees(-98.0, 40.0);
// map.camera.lookAt(center, new Cesium.Cartesian3(0.0, -4790000.0, 3930000.0));
// 第一视角飞行 84.330408,38.24518
$prototype.$map.camera.flyTo({
destination: new Cesium.Cartesian3(
-2432812.6687511606,
5559483.804371395,
2832009.419525571
),
orientation: {
heading: 6.283185307179421,
pitch: -1.0472145569408116,
roll: 6.2831853071795205,
},
complete: function () {
// map.camera.lookAt(
// Cesium.Cartesian3.fromDegrees(113.300224, 27.004546, 500),
// new Cesium.HeadingPitchRange(
// 3.1769448901508976,
// -0.2880443992926125,
// 500
// )
// );
// map.camera.flyTo({
// destination: Cesium.Cartesian3.fromDegrees(113.300224, 27.004546, 500),
// orientation: {
// heading: 3.1769448901508976,
// pitch: -0.2880443992926125,
// roll: 6.283184370499525,
// },
// duration: 3.0, // 飞行时间(秒)
// });
},
});
}
// 监听主地图相机变化
const setupCameraListener = () => {
$prototype.$map.camera.changed.addEventListener(updateIndicatorPosition);
// viewIndicator.rectangle.coordinates = updateIndicatorPosition();
};
const handleMiniMapClick = (event: MouseEvent) => {
if (!miniMapContainer.value) return;
const rect = miniMapContainer.value.getBoundingClientRect();
const x = event.clientX - rect.left;
const y = event.clientY - rect.top;
// 计算点击位置的经纬度
const lon = (x / rect.width) * 360 - 180;
const lat = 90 - (y / rect.height) * 180;
// 主地图飞向点击位置
$prototype.$map.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(lon, lat, 1000000),
});
};
function addImage() {
var rightImageProvider = new Cesium.UrlTemplateImageryProvider({
name: "影像图",
type: "xyz",
layer: "vec_d",
url: "http://124.232.190.30:9000/proxy/pk1725866655224/map/zzzsyx_18/{z}/{x}/{y}.png",
minimumLevel: 1,
maximumLevel: 17,
crs: "EPSG:3857",
});
$prototype.$map.imageryLayers.addImageryProvider(rightImageProvider);
rightImageProvider.splitDirection = Cesium.SplitDirection.right;
}
onMounted(() => {
// console.clear()
initMap();
addImage();
loaded.value = true;
addDemoGraphics();
flyToDes();
initMiniMap();
setupCameraListener();
setTimeout(function () {
initRectangle();
}, 2000);
//测试加载wmts服务的geojson格式
//此处很重要,很重要如果是4326的话就需要,如果不是4326是900913就不需要下面的了
// var options = {
// url: "http://localhost:8080/geoserver/zhuzhou/gwc/service/wmts",
// layer: "zhuzhou:lukou_farmland",
// name: "zhuzhou:lukou_farmland",
// show: true,
// alpha: 1.0,
// serviceType: "wmts",
// type: "raster",
// // rectangle: layerData.rectangle,
// minimumLevel: 1,
// maximumLevel: 14,
// tileMatrixSetID: "EPSG:4326",
// style: "",
// format: "application/json;type=geojson",
// };
// options.tileMatrixLabels = [...Array(20).keys()].map((level) =>
// ("EPSG:4326:" + level).toString()
// );
// if (options.tileMatrixSetID == "EPSG:4326") {
// options.tilingScheme = new Cesium.GeographicTilingScheme({
// numberOfLevelZeroTilesX: 2,
// numberOfLevelZeroTilesY: 1,
// });
// }
// const provider = new Cesium.WebMapTileServiceImageryProvider(options);
// // $prototype.$map.imageryLayers.remove(
// // $prototype.$map.imageryLayers._layers[0]
// // );
// $prototype.$map!.imageryLayers.addImageryProvider(provider);
});
onUnmounted(() => {
if ($prototype.$map) {
$prototype.$map.destroy();
$prototype.$map = null;
}
console.log("组件销毁");
});
// onload事件将在地图渲染后触发
const emit = defineEmits(["onload", "onclick"]);
const initMars3d = async (option: any) => {
emit("onclick", true);
emit("onload", $prototype.$map);
};
</script>
<style lang="less">
/**cesium 工具按钮栏*/
.cesium-viewer-toolbar {
top: auto !important;
bottom: 35px !important;
left: 12px !important;
right: auto !important;
}
.cesium-toolbar-button img {
height: 100%;
}
.cesium-viewer-toolbar > .cesium-toolbar-button,
.cesium-navigationHelpButton-wrapper,
.cesium-viewer-geocoderContainer {
margin-bottom: 5px;
float: left;
clear: both;
text-align: center;
}
.cesium-button {
background-color: rgba(23, 49, 71, 0.8);
color: #e6e6e6;
fill: #e6e6e6;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
line-height: 32px;
}
.cesium-button:hover {
background: #3ea6ff;
}
/**cesium 底图切换面板*/
.cesium-baseLayerPicker-dropDown {
bottom: 0;
left: 40px;
max-height: 700px;
margin-bottom: 5px;
background-color: rgba(23, 49, 71, 0.8);
}
/**cesium 帮助面板*/
.cesium-navigation-help {
top: auto;
bottom: 0;
left: 40px;
transform-origin: left bottom;
background: none;
background-color: rgba(23, 49, 71, 0.8);
.cesium-navigation-help-instructions {
background: none;
}
.cesium-navigation-button {
background: none;
}
.cesium-navigation-button-selected,
.cesium-navigation-button-unselected:hover {
background: rgba(0, 138, 255, 0.2);
}
}
/**cesium 二维三维切换*/
.cesium-sceneModePicker-wrapper {
width: auto;
}
.cesium-sceneModePicker-wrapper .cesium-sceneModePicker-dropDown-icon {
float: right;
margin: 0 3px;
}
/**cesium POI查询输入框*/
.cesium-viewer-geocoderContainer .search-results {
left: 0;
right: 40px;
width: auto;
z-index: 9999;
}
.cesium-geocoder-searchButton {
background-color: rgba(23, 49, 71, 0.8);
}
.cesium-viewer-geocoderContainer .cesium-geocoder-input {
background-color: rgba(63, 72, 84, 0.7);
}
.cesium-viewer-geocoderContainer .cesium-geocoder-input:focus {
background-color: rgba(63, 72, 84, 0.9);
}
.cesium-viewer-geocoderContainer .search-results {
background-color: rgba(23, 49, 71, 0.8);
}
/**cesium info信息框*/
.cesium-infoBox {
top: 50px;
background-color: rgba(23, 49, 71, 0.8);
}
.cesium-infoBox-title {
background-color: rgba(23, 49, 71, 0.8);
}
/**cesium 任务栏的FPS信息*/
.cesium-performanceDisplay-defaultContainer {
top: auto;
bottom: 35px;
right: 50px;
}
.cesium-performanceDisplay-ms,
.cesium-performanceDisplay-fps {
color: #fff;
}
/**cesium tileset调试信息面板*/
.cesium-viewer-cesiumInspectorContainer {
top: 10px;
left: 10px;
right: auto;
}
.cesium-cesiumInspector {
background-color: rgba(23, 49, 71, 0.8);
}
/**覆盖mars3d内部控件的颜色等样式*/
.mars3d-compass .mars3d-compass-outer {
fill: rgba(23, 49, 71, 0.8);
}
.mars3d-contextmenu-ul,
.mars3d-sub-menu {
background-color: rgba(23, 49, 71, 0.8);
> li > a:hover,
> li > a:focus,
> li > .active {
background-color: #3ea6ff;
}
> .active > a,
> .active > a:hover,
> .active > a:focus {
background-color: #3ea6ff;
}
}
/* Popup样式*/
.mars3d-popup-color {
color: #ffffff;
}
.mars3d-popup-background {
background: rgba(23, 49, 71, 0.8);
}
.mars3d-popup-content {
margin: 15px;
}
.mars3d-template-content label {
padding-right: 6px;
}
.mars3d-template-titile {
border-bottom: 1px solid #3ea6ff;
}
.mars3d-template-titile a {
font-size: 16px;
}
.mars3d-tooltip {
background: rgba(23, 49, 71, 0.8);
border: 1px solid rgba(23, 49, 71, 0.8);
}
.mars3d-popup-btn-custom {
padding: 3px 10px;
border: 1px solid #209ffd;
background: #209ffd1c;
}
.mars-dialog .mars-dialog__content {
height: 100%;
width: 100%;
overflow: auto;
padding: 5px;
}
.image {
border: solid 2px #fff;
}
.content {
height: 90%;
padding-top: 10px;
overflow-x: auto;
overflow-y: auto;
}
.content-text {
padding: 0 10px;
text-indent: 30px;
font-size: 17px;
}
.details-video {
width: 100%;
height: 760px;
background-color: #000;
}
:where(.css-lt97qq9).ant-space {
display: inline-flex;
}
:where(.css-lt97qq9).ant-space-align-center {
align-items: center;
}
:where(.css-lt97qq9).ant-image .ant-image-mask {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
background: rgba(0, 0, 0, 0.5);
cursor: pointer;
opacity: 0;
transition: opacity 0.3s;
}
:where(.css-lt97qq9).ant-image .ant-image-mask .ant-image-mask-info {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
padding: 0 4px;
}
:where(.css-1t97qq9)[class^="ant-image"] [class^="ant-image"],
:where(.css-1t97qq9)[class*=" ant-image"] [class^="ant-image"],
:where(.css-1t97qq9)[class^="ant-image"] [class*=" ant-image"],
:where(.css-1t97qq9)[class*=" ant-image"] [class*=" ant-image"] {
box-sizing: border-box;
}
:where(.css-lt97qq9).ant-image .ant-image-img {
width: 100%;
height: auto;
vertical-align: middle;
}
</style>
<style scoped>
.mini-map-container {
position: relative;
width: 100%;
height: 100%;
}
.main-viewer {
width: 100%;
height: 100%;
}
.mini-map {
position: absolute;
right: 3vw;
bottom: 6vh;
width: 12vw;
height: 17vh;
border: 2px solid #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
z-index: 999;
cursor: pointer;
overflow: hidden;
}
.view-indicator {
position: absolute;
background-color: rgba(255, 0, 0, 0.3);
border: 1px solid red;
pointer-events: none;
}
::v-deep.cesium-viewer-toolbar {
display: none;
}
</style>
然后现在我要在这个xindvue文件里实现原本在CesiumViewer.vue中调用函数创建四个波纹圆的功能,也是同样位置,基于此在不更改任何原有代码基础上,我怎么添加波纹圆
最新发布