vue3结合arcgis api4.28实现淹没分析

发布时间:2024年01月23日

1、通过SketchViewModel在地图上选择一个点作为最低点海拔高度

2、通过SketchViewModel在地图上画一个包含步骤1中点的多边形,1和2的代码如下:

const draw = (type) => {

? ? if (type === 'polygon') {

? ? ? ? if (clickedPoint.value === false) {

? ? ? ? ? ? ElMessage({

? ? ? ? ? ? ? ? message: '请先获取最低点海拔',

? ? ? ? ? ? ? ? type: 'warning',

? ? ? ? ? ? ? ? duration: 1000,

? ? ? ? ? ? });

? ? ? ? ? ? return;

? ? ? ? }

? ? }

? ? let sketchLayer = view.map.findLayerById('sketchLayer');

? ? if (sketchLayer) {

? ? ? ? sketchLayer.removeAll();

? ? } else {

? ? ? ? sketchLayer = new GraphicsLayer({

? ? ? ? ? ? id: 'sketchLayer',

? ? ? ? ? ? elevationInfo: {

? ? ? ? ? ? ? ? mode: 'absolute-height',

? ? ? ? ? ? },

? ? ? ? });

? ? ? ? view.map.add(sketchLayer);

? ? }

? ? const sketchVM = new SketchViewModel({

? ? ? ? view: view,

? ? ? ? layer: sketchLayer,

? ? });

? ? sketchVM.create(type);

? ? sketchVM.on('create', function (event) {

? ? ? ? if (event.state === 'complete') {

? ? ? ? ? ? if (type === 'point') {

? ? ? ? ? ? ? ? clickedPoint.value = true;

? ? ? ? ? ? ? ? form.minHeight = event.graphic.geometry.z;

? ? ? ? ? ? ? ? point = event.graphic.geometry;

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? polygon = event.graphic.geometry;

? ? ? ? ? ? ? ? //判断画的多边形是否包含最低点海拔那个点

? ? ? ? ? ? ? ? const isContained = geometryEngine.contains(polygon, point);

? ? ? ? ? ? ? ? if (isContained) {

? ? ? ? ? ? ? ? ? ? floodAnalysis(sketchLayer);

? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? ElMessage({

? ? ? ? ? ? ? ? ? ? ? ? message: '该多边形没有包含获取海拔那个点',

? ? ? ? ? ? ? ? ? ? ? ? type: 'warning',

? ? ? ? ? ? ? ? ? ? ? ? duration: 1000,

? ? ? ? ? ? ? ? ? ? });

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? });

};

3、进行淹没分析

const floodAnalysis = (sketchLayer) => {

? ? const { minHeight, height, floodSpeed } = form;

? ? const time = (height / floodSpeed) * 1000;

? ? const graphics = sketchLayer.graphics.items;

? ? graphics.forEach((graphic) => {

? ? ? ? graphic.geometry = new Polygon({

? ? ? ? ? ? hasZ: true,

? ? ? ? ? ? rings: graphic.geometry.rings[0].map(([x, y]) => [x, y, minHeight]),

? ? ? ? ? ? spatialReference: view.spatialReference,

? ? ? ? });

? ? });

? ? analysisDone.value = false;

? ? heightAnimation(performance.now(), graphics, time, height);

};

4、渐变高度动画

const heightAnimation = (clock, graphics, time, height) => {

? ? animationKey.value = requestAnimationFrame((c) => {

? ? ? ? graphics.forEach((graphic) => {

? ? ? ? ? ? if (c - clock >= 0) {

? ? ? ? ? ? ? ? graphic.symbol = {

? ? ? ? ? ? ? ? ? ? type: 'polygon-3d',

? ? ? ? ? ? ? ? ? ? symbolLayers: [

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? type: 'extrude',

? ? ? ? ? ? ? ? ? ? ? ? ? ? size: ((c - clock) / time) * height,

? ? ? ? ? ? ? ? ? ? ? ? ? ? material: { color: [0, 240, 255, 0.7] },

? ? ? ? ? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? ? ? ],

? ? ? ? ? ? ? ? };

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? if (c - clock < time) {

? ? ? ? ? ? heightAnimation(clock, graphics, time, height);

? ? ? ? } else {

? ? ? ? ? ? analysisDone.value = true;

? ? ? ? ? ? cancelAnimationFrame(animationKey.value);

? ? ? ? }

? ? });

};

5、效果图如下

淹没分析-CSDN直播

文章来源:https://blog.csdn.net/m0_65745337/article/details/135750370
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。