|
@@ -11,22 +11,13 @@
|
|
transformOrigin: '0 0'
|
|
transformOrigin: '0 0'
|
|
}"
|
|
}"
|
|
></div>
|
|
></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>
|
|
|
|
|
|
+ <rightTool :mapState="mapState" type="YztMap" :showMask="showMask" @changeShowMask="changeShowMask" />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
import 'ol/ol.css';
|
|
import 'ol/ol.css';
|
|
|
|
+import rightTool from '../rightTool.vue';
|
|
import mmJson from '@/assets/json/mm.json';
|
|
import mmJson from '@/assets/json/mm.json';
|
|
import { olMap } from '@/utils/olMap/olMap';
|
|
import { olMap } from '@/utils/olMap/olMap';
|
|
import { PointType } from '@/api/globalMap/type';
|
|
import { PointType } from '@/api/globalMap/type';
|
|
@@ -54,16 +45,16 @@ const mapState = reactive({
|
|
const containerRef = ref();
|
|
const containerRef = ref();
|
|
const width = ref('100%');
|
|
const width = ref('100%');
|
|
const height = ref('100%');
|
|
const height = ref('100%');
|
|
-let yztMap, map;
|
|
|
|
|
|
+let map, mapUtils;
|
|
|
|
|
|
// 监听是否开启绘制
|
|
// 监听是否开启绘制
|
|
watch(
|
|
watch(
|
|
() => props.drawing,
|
|
() => props.drawing,
|
|
(value) => {
|
|
(value) => {
|
|
if (value) {
|
|
if (value) {
|
|
- map.drawGraphics(props.graphicsType);
|
|
|
|
|
|
+ mapUtils.drawGraphics(props.graphicsType);
|
|
} else {
|
|
} else {
|
|
- map.closeDraw();
|
|
|
|
|
|
+ mapUtils.closeDraw();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
);
|
|
);
|
|
@@ -77,23 +68,23 @@ const mapList = reactive({
|
|
watch(
|
|
watch(
|
|
() => props.activeMap,
|
|
() => props.activeMap,
|
|
() => {
|
|
() => {
|
|
- if (!map) return;
|
|
|
|
- map.replaceLayers(mapList[props.activeMap]);
|
|
|
|
|
|
+ if (!mapUtils) return;
|
|
|
|
+ mapUtils.replaceLayers(mapList[props.activeMap]);
|
|
}
|
|
}
|
|
);
|
|
);
|
|
watch(
|
|
watch(
|
|
() => props.showMask,
|
|
() => props.showMask,
|
|
() => {
|
|
() => {
|
|
if (props.showMask) {
|
|
if (props.showMask) {
|
|
- map.createVecByJson(mmJson, '茂名市');
|
|
|
|
|
|
+ mapUtils.createVecByJson(mmJson, '茂名市');
|
|
} else {
|
|
} else {
|
|
- map.removeMask();
|
|
|
|
|
|
+ mapUtils.removeMask2();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
);
|
|
);
|
|
-let scaleLine;
|
|
|
|
|
|
+let scale;
|
|
const init = () => {
|
|
const init = () => {
|
|
- map = new olMap({
|
|
|
|
|
|
+ mapUtils = new olMap({
|
|
dom: mapRef.value,
|
|
dom: mapRef.value,
|
|
id: mapList[props.activeMap],
|
|
id: mapList[props.activeMap],
|
|
center: mapState.center,
|
|
center: mapState.center,
|
|
@@ -118,65 +109,31 @@ const init = () => {
|
|
}
|
|
}
|
|
},
|
|
},
|
|
// 加载完成事件
|
|
// 加载完成事件
|
|
- onLoadCompleted: (yMap) => {
|
|
|
|
- yztMap = yMap;
|
|
|
|
- // initMouseTool(map);
|
|
|
|
- scaleLine = new ScaleLine();
|
|
|
|
- yztMap.addControl(scaleLine);
|
|
|
|
- yztMap.getView().on('change:resolution', () => {
|
|
|
|
- mapState.zoom = yztMap.getView().getZoom().toFixed(2);
|
|
|
|
|
|
+ onLoadCompleted: (YztMap) => {
|
|
|
|
+ map = YztMap;
|
|
|
|
+ // initMouseTool(mapUtils);
|
|
|
|
+ scale = new ScaleLine();
|
|
|
|
+ map.addControl(scale);
|
|
|
|
+ map.getView().on('change:resolution', () => {
|
|
|
|
+ mapState.zoom = map.getView().getZoom().toFixed(2);
|
|
});
|
|
});
|
|
if (props.showMask) {
|
|
if (props.showMask) {
|
|
- map.createVecByJson(mmJson, '茂名市');
|
|
|
|
|
|
+ mapUtils.createVecByJson(mmJson, '茂名市');
|
|
}
|
|
}
|
|
handleResize();
|
|
handleResize();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
};
|
|
};
|
|
const addMarker = (points) => {
|
|
const addMarker = (points) => {
|
|
- map.addMarker(points);
|
|
|
|
-};
|
|
|
|
-// 设置地图层级
|
|
|
|
-const setMapZoom = (value) => {
|
|
|
|
- if (!yztMap) return;
|
|
|
|
- const view = yztMap.getView();
|
|
|
|
- if (value === 1) {
|
|
|
|
- view.setCenter([110.925175, 21.678955]);
|
|
|
|
- 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(11.38);
|
|
|
|
- } else if (value === 4) {
|
|
|
|
- view.setCenter([110.925175, 21.678955]);
|
|
|
|
- view.setZoom(12.83);
|
|
|
|
- }
|
|
|
|
-};
|
|
|
|
-// 切换2D、3D
|
|
|
|
-const switchThreeDimensional = () => {
|
|
|
|
- const view = yztMap.map.getView();
|
|
|
|
- mapState.isThreeDimensional = !mapState.isThreeDimensional;
|
|
|
|
- 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);
|
|
|
|
- }
|
|
|
|
|
|
+ mapUtils.addMarker(points);
|
|
};
|
|
};
|
|
const clearMarker = () => {
|
|
const clearMarker = () => {
|
|
- map.clearMarker();
|
|
|
|
|
|
+ mapUtils.clearMarker();
|
|
};
|
|
};
|
|
-const handleShowMask = () => {
|
|
|
|
|
|
+const changeShowMask = () => {
|
|
emits('update:showMask', !props.showMask);
|
|
emits('update:showMask', !props.showMask);
|
|
};
|
|
};
|
|
-defineExpose({ addMarker, clearMarker });
|
|
|
|
|
|
+
|
|
let inverseScale = ref({
|
|
let inverseScale = ref({
|
|
inverseScaleX: 1,
|
|
inverseScaleX: 1,
|
|
inverseScaleY: 1
|
|
inverseScaleY: 1
|
|
@@ -188,7 +145,13 @@ const handleResize = () => {
|
|
const containerHeight = containerRef.value.clientHeight * containerScale().scaleY;
|
|
const containerHeight = containerRef.value.clientHeight * containerScale().scaleY;
|
|
width.value = containerWidth + 'px';
|
|
width.value = containerWidth + 'px';
|
|
height.value = containerHeight + 'px';
|
|
height.value = containerHeight + 'px';
|
|
- yztMap.updateSize();
|
|
|
|
|
|
+ map.updateSize();
|
|
|
|
+};
|
|
|
|
+const getMap = () => {
|
|
|
|
+ return map;
|
|
|
|
+};
|
|
|
|
+const getScale = () => {
|
|
|
|
+ return scale;
|
|
};
|
|
};
|
|
// 加载事件
|
|
// 加载事件
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
@@ -199,6 +162,9 @@ onMounted(() => {
|
|
onUnmounted(() => {
|
|
onUnmounted(() => {
|
|
window.removeEventListener('resize', handleResize);
|
|
window.removeEventListener('resize', handleResize);
|
|
});
|
|
});
|
|
|
|
+provide('getMap', getMap);
|
|
|
|
+provide('getScale', getScale);
|
|
|
|
+defineExpose({ addMarker, clearMarker });
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
<style scoped>
|
|
@@ -206,47 +172,6 @@ onUnmounted(() => {
|
|
width: 100%;
|
|
width: 100%;
|
|
height: 100%;
|
|
height: 100%;
|
|
position: relative;
|
|
position: relative;
|
|
- .zoom-text {
|
|
|
|
- position: absolute;
|
|
|
|
- bottom: 120px;
|
|
|
|
- right: 170px;
|
|
|
|
- color: #eaf3fc;
|
|
|
|
- font-size: 25.73px;
|
|
|
|
- }
|
|
|
|
- .right-tool {
|
|
|
|
- position: absolute;
|
|
|
|
- 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;
|
|
|
|
- }
|
|
|
|
- .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;
|
|
|
|
- }
|
|
|
|
- .ruler-icon {
|
|
|
|
- width: 42px;
|
|
|
|
- height: 42px;
|
|
|
|
- background: url('@/assets/images/map/ruler.png') no-repeat;
|
|
|
|
- background-size: 100% 100%;
|
|
|
|
- cursor: pointer;
|
|
|
|
- }
|
|
|
|
:deep(.ol-scale-line) {
|
|
:deep(.ol-scale-line) {
|
|
left: unset;
|
|
left: unset;
|
|
bottom: 16px;
|
|
bottom: 16px;
|