|
@@ -1,22 +1,35 @@
|
|
|
<template>
|
|
|
<div ref="containerRef" class="map-container">
|
|
|
<div ref="mapRef" id="YztMap" class="map-container" :style="{ width: width, height: height }"></div>
|
|
|
+ <!-- 右下工具 -->
|
|
|
+ <div v-show="mapState.showScale" class="zoom-text">{{ mapState.zoom }}级</div>
|
|
|
+ <div class="right-tool">
|
|
|
+ <!-- 快捷缩放 -->
|
|
|
+ <QuickZoom v-model:zoom="mapState.zoom" @change-step="setMapZoom" />
|
|
|
+ <div class="flex" style="margin-top: 5px; justify-content: center">
|
|
|
+ <div class="mask-btn" @click="handleShowMask">{{ showMask ? '显' : '隐' }}</div>
|
|
|
+ <!-- <div class="model-btn" @click="switchThreeDimensional">{{ mapState.isThreeDimensional ? '3D' : '2D' }}</div>-->
|
|
|
+ <div class="ruler-icon" style="margin-left: 5px" @click="changeScaleControl"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
import 'ol/ol.css';
|
|
|
-import mmJson from '@/assets/json/mm.json'
|
|
|
+import mmJson from '@/assets/json/mm.json';
|
|
|
import { olMap } from '@/utils/olMap/olMap';
|
|
|
import { PointType } from '@/api/globalMap/type';
|
|
|
+import { ScaleLine } from 'ol/control';
|
|
|
|
|
|
interface Props {
|
|
|
activeMap: string;
|
|
|
pointType: PointType[];
|
|
|
+ showMask: boolean;
|
|
|
}
|
|
|
const containerScale = inject('containerScale');
|
|
|
const props = withDefaults(defineProps<Props>(), {});
|
|
|
-const emits = defineEmits(['update:drawing', 'selectGraphics']);
|
|
|
+const emits = defineEmits(['update:drawing', 'update:showMask', 'selectGraphics']);
|
|
|
|
|
|
const mapRef = ref(null);
|
|
|
const mapState = reactive({
|
|
@@ -56,10 +69,19 @@ watch(
|
|
|
() => {
|
|
|
if (!map) return;
|
|
|
map.replaceLayers(mapList[props.activeMap]);
|
|
|
- map.createVecByJson(mmJson, '茂名市');
|
|
|
}
|
|
|
);
|
|
|
-
|
|
|
+watch(
|
|
|
+ () => props.showMask,
|
|
|
+ () => {
|
|
|
+ if (props.showMask) {
|
|
|
+ map.createVecByJson(mmJson, '茂名市');
|
|
|
+ } else {
|
|
|
+ map.removeMask();
|
|
|
+ }
|
|
|
+ }
|
|
|
+);
|
|
|
+let scaleLine;
|
|
|
const init = () => {
|
|
|
map = new olMap({
|
|
|
dom: mapRef.value,
|
|
@@ -89,7 +111,14 @@ const init = () => {
|
|
|
onLoadCompleted: (yMap) => {
|
|
|
yztMap = yMap;
|
|
|
// initMouseTool(map);
|
|
|
- map.createVecByJson(mmJson, '茂名市');
|
|
|
+ scaleLine = new ScaleLine();
|
|
|
+ yztMap.addControl(scaleLine);
|
|
|
+ yztMap.getView().on('change:resolution', () => {
|
|
|
+ mapState.zoom = yztMap.getView().getZoom().toFixed(2);
|
|
|
+ });
|
|
|
+ if (props.showMask) {
|
|
|
+ map.createVecByJson(mmJson, '茂名市');
|
|
|
+ }
|
|
|
handleResize();
|
|
|
}
|
|
|
});
|
|
@@ -100,22 +129,19 @@ const addMarker = (points) => {
|
|
|
// 设置地图层级
|
|
|
const setMapZoom = (value) => {
|
|
|
if (!yztMap) return;
|
|
|
- const view = yztMap.map.getView();
|
|
|
+ const view = yztMap.getView();
|
|
|
if (value === 1) {
|
|
|
- view.setCenter([113.280637, 23.125178]);
|
|
|
- view.setZoom(7);
|
|
|
- } else if (value === 2) {
|
|
|
view.setCenter([110.925175, 21.678955]);
|
|
|
- view.setZoom(11);
|
|
|
+ view.setZoom(7.9);
|
|
|
+ } else if (value === 2) {
|
|
|
+ view.setCenter([110.925175, 21.6789558]);
|
|
|
+ view.setZoom(9.21);
|
|
|
} else if (value === 3) {
|
|
|
view.setCenter([110.925175, 21.678955]);
|
|
|
- view.setZoom(12);
|
|
|
+ view.setZoom(11.38);
|
|
|
} else if (value === 4) {
|
|
|
view.setCenter([110.925175, 21.678955]);
|
|
|
- view.setZoom(15);
|
|
|
- } else if (value === 5) {
|
|
|
- view.setCenter([110.925175, 21.678955]);
|
|
|
- view.setZoom(16);
|
|
|
+ view.setZoom(12.83);
|
|
|
}
|
|
|
};
|
|
|
// 切换2D、3D
|
|
@@ -125,8 +151,20 @@ const switchThreeDimensional = () => {
|
|
|
const pitch = mapState.isThreeDimensional ? 45 : 0;
|
|
|
view.setPitch(pitch);
|
|
|
};
|
|
|
+// 切换比例尺
|
|
|
+const changeScaleControl = () => {
|
|
|
+ mapState.showScale = !mapState.showScale;
|
|
|
+ if (mapState.showScale) {
|
|
|
+ yztMap.addControl(scaleLine);
|
|
|
+ } else {
|
|
|
+ yztMap.removeControl(scaleLine);
|
|
|
+ }
|
|
|
+};
|
|
|
const clearMarker = () => {
|
|
|
- this.map.clearMarker();
|
|
|
+ map.clearMarker();
|
|
|
+};
|
|
|
+const handleShowMask = () => {
|
|
|
+ emits('update:showMask', !props.showMask);
|
|
|
};
|
|
|
defineExpose({ addMarker, clearMarker });
|
|
|
const handleResize = () => {
|
|
@@ -154,75 +192,55 @@ onUnmounted(() => {
|
|
|
position: relative;
|
|
|
.zoom-text {
|
|
|
position: absolute;
|
|
|
- bottom: 8px;
|
|
|
- right: 75px;
|
|
|
- font-size: 14px;
|
|
|
+ bottom: 120px;
|
|
|
+ right: 170px;
|
|
|
+ color: #eaf3fc;
|
|
|
+ font-size: 25.73px;
|
|
|
}
|
|
|
.right-tool {
|
|
|
position: absolute;
|
|
|
- bottom: 50px;
|
|
|
- right: 5px;
|
|
|
- }
|
|
|
- .model-btn {
|
|
|
- background-color: #022577;
|
|
|
- font-size: 14px;
|
|
|
- color: #889ee9;
|
|
|
+ bottom: 160px;
|
|
|
+ right: 175px;
|
|
|
+ z-index: 2;
|
|
|
+ }
|
|
|
+ .mask-btn {
|
|
|
+ background-color: #04327c;
|
|
|
+ font-size: 25.73px;
|
|
|
+ border: 1px solid #91cfff;
|
|
|
+ color: #eaf3fc;
|
|
|
cursor: pointer;
|
|
|
padding: 3px 3px;
|
|
|
border-radius: 5px;
|
|
|
+ //margin-right: 5px;
|
|
|
+ cursor: pointer;
|
|
|
}
|
|
|
- :deep(.amap-scalecontrol) {
|
|
|
- left: unset !important;
|
|
|
- background-color: unset !important;
|
|
|
- right: 74px;
|
|
|
- }
|
|
|
- :deep(.amap-scale-text) {
|
|
|
- width: 230px !important;
|
|
|
- text-align: left !important;
|
|
|
- font-size: 14px;
|
|
|
- padding-left: 20px;
|
|
|
- }
|
|
|
- :deep(.amap-scale-middle) {
|
|
|
- width: 228px !important;
|
|
|
- }
|
|
|
- :deep(.amap-scale-edgeright) {
|
|
|
- left: 228px !important;
|
|
|
- }
|
|
|
- :deep(.amap-logo),
|
|
|
- :deep(.amap-copyright) {
|
|
|
- display: none !important;
|
|
|
- }
|
|
|
- /* 自定义测距工具样式 */
|
|
|
- :deep(.amap-ranger) {
|
|
|
- background-color: #ffffff;
|
|
|
- border: 1px solid #888888;
|
|
|
+ .model-btn {
|
|
|
+ background-color: #04327c;
|
|
|
+ font-size: 25.73px;
|
|
|
+ font-family: 'SourceHanSansCN';
|
|
|
+ border: 1px solid #91cfff;
|
|
|
+ color: #eaf3fc;
|
|
|
+ cursor: pointer;
|
|
|
+ padding: 3px 3px;
|
|
|
border-radius: 5px;
|
|
|
- padding: 5px;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.amap-ranger .amap-toolbar) {
|
|
|
- color: #333;
|
|
|
- font-size: 12px;
|
|
|
- padding: 5px;
|
|
|
}
|
|
|
-
|
|
|
- :deep(.amap-ranger .amap-toolbar button) {
|
|
|
- background-color: #022577;
|
|
|
- color: #fff;
|
|
|
- border: none;
|
|
|
- border-radius: 4px;
|
|
|
- padding: 5px;
|
|
|
- margin-right: 5px;
|
|
|
+ .ruler-icon {
|
|
|
+ width: 42px;
|
|
|
+ height: 42px;
|
|
|
+ background: url('@/assets/images/map/ruler.png') no-repeat;
|
|
|
+ background-size: 100% 100%;
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
-
|
|
|
- :deep(.amap-ranger .amap-toolbar button:hover) {
|
|
|
- background-color: #1a3c75;
|
|
|
+ :deep(.ol-scale-line) {
|
|
|
+ left: unset;
|
|
|
+ bottom: 16px;
|
|
|
+ right: 48px;
|
|
|
+ background-color: transparent;
|
|
|
}
|
|
|
-
|
|
|
- :deep(.amap-ranger .amap-toolbar .amap-toolbar-text) {
|
|
|
- color: #444;
|
|
|
- font-size: 14px;
|
|
|
+ :deep(.ol-scale-line-inner) {
|
|
|
+ color: #ffffff;
|
|
|
+ border: 1px solid #fff;
|
|
|
+ border-top: none;
|
|
|
}
|
|
|
}
|
|
|
</style>
|