【mars3d】基于vue3的marsgis通用UI库 mars-ui 的使用

这篇具有很好参考价值的文章主要介绍了【mars3d】基于vue3的marsgis通用UI库 mars-ui 的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一名脑残程序员的mars-ui心酸使用记录。

通过mars3d的官网我们可以看到,有配套的UI库使用,那么我们如何使用到自己的项目中呢,跟着文章一步一步来吧!

1、引入UI库

① 安装ant-design-vue

cnpm install ant-design-vue --save

② 下载基于vue开发的mars3d的源码,直通车: git clone https://gitee.com/marsgis/mars3d-vue-project.git,如下图所示,将src/components/mars-ui文件夹复制到我们的项目中,复制到src/components/文件夹下.
第一步完成
mars3d,mars3d,vue,项目经验,mars3d,vue

2、main.js配置

引入css文件,

  • 注意:mars-ui的引入要放到我们使用的UI框架ant-design-vue下面,以便于我们应用所有的mars-ui的样式(踩坑点)
......
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'

import MarsUIInstall from '@mars/components/mars-ui'
import '@mars/components/mars-ui/common'

const app = createApp(App)
MarsUIInstall(app, {})
......

至此第二步完成

3、vite.config.js配置

① 安装vite-plugin-style-import

cnpm install vite-plugin-style-import --save

② 配置插件

export default defineConfig({
..........
	plugins: [
	    vue(),
	    mars3dPlugin(),
	    createStyleImportPlugin({
	      resolves: [AndDesignVueResolve()]
	  ],
  .......
])

③ 配置less预加载,css与plugins同级

css: {
    preprocessorOptions: {
      less: {
        javascriptEnabled: true,
        additionalData: `@import "${path.resolve(__dirname, 'src/components/mars-ui/base.less')}";`
      }
    }
  }

所以准备工作已经配置完成好了,下边开始使用。

页面使用

为了与其他UI样式做区分,所以mars-ui必须放在类名为mars-main-view下才起作用

① 修改App.vue
 <div id="mars-main-view" class="mars-main-view">
    <router-view />
  </div>
② 修改我们的页面组件
<template>
  <div id="gui-container">
    <mars-dialog :visible="true" right="10" top="100" bottom="50" width="400">
    <div class="ui-container">
      <a-form
        :model="formState"
        :rules="rules"
        :label-col="{ span: 6 }"
        :wrapper-col="{ span: 18 }">
        <a-collapse v-model:activeKey="activeKey" expandIconPosition="right">
          <a-collapse-panel key="1" header="表单控件">
            <a-form-item label="简单文本" name="url">
              <mars-input v-model:value="formState.url" :allowClear="true" @change="onTextChange" />
            </a-form-item>

            <a-form-item label="地图交互" name="extent">
              <a-row :gutter="5">
                <a-col :span="19">
                  <mars-input v-model:value="formState.extent" :allowClear="true"></mars-input>
                </a-col>
                <a-col :span="5">
                  <a-space size="small">
                    <mars-button class="small-btn" @click="onClickDrawExtent">绘制</mars-button>
                  </a-space>
                </a-col>
              </a-row>
            </a-form-item>

            <a-form-item label="数字输入">
              <mars-input-number
                v-model:value="formState.countCar"
                :step="0.1"
                @change="onNumberChange" />
            </a-form-item>

            <a-form-item label="下拉选择">
              <mars-select
                v-model:value="formState.model"
                :options="modelOptions"
                @change="onSelectChange"></mars-select>
            </a-form-item>

            <a-form-item label="日期">
              <mars-date-picker
                v-model:value="formState.date"
                format="YYYY-MM-DD"
                @change="onDateChange" />
            </a-form-item>

            <a-form-item label="滑动条">
              <mars-slider
                v-model:value="formState.brightness"
                :min="-0.5"
                :max="1.5"
                :step="0.05"
                @change="onSliderChange" />
            </a-form-item>

            <a-form-item label="刻度滑动条">
              <mars-slider
                v-model:value="formState.contrast"
                :marks="marks"
                :min="-255"
                :max="255"
                :step="1"
                @change="onMarkSliderChange" />
            </a-form-item>

            <a-form-item label="多选" class="f-push-20-t">
              <a-checkbox-group v-model:value="formState.checkboxVal" @change="onCheckboxChange">
                <a-checkbox value="mars">火星</a-checkbox>
                <a-checkbox value="earth">地球</a-checkbox>
                <a-checkbox value="sun">太阳</a-checkbox>
              </a-checkbox-group>
            </a-form-item>

            <a-form-item label="单选">
              <a-radio-group v-model:value="formState.radioVal">
                <a-radio value="1">2D</a-radio>
                <a-radio value="2">2.5D</a-radio>
                <a-radio value="3">3D</a-radio>
              </a-radio-group>
              <!-- 已选择:{{ formState.radioVal }} -->
            </a-form-item>

            <a-form-item label="鼠标操作">
              <a-space>
                <mars-switch v-model:checked="formState.isScale" @change="onSwitchChange" />
                <span>是否允许</span>
              </a-space>
            </a-form-item>

            <a-form-item label="颜色选择">
              <a-space>
                <mars-color-picker v-model:value="formState.color" />
                <div class="color-state">已选择:{{ formState.color }}</div>
              </a-space>
            </a-form-item>

            <a-form-item label="颜色选择2">
              <a-space>
                <mars-color v-model:value="formState.color" @change="showColor" />
                <div class="color-state">已选择:{{ formState.color }}</div>
              </a-space>
            </a-form-item>

            <div class="f-tac">
              <a-space>
                <mars-button size="middle" @click="onClickMessage">
                  <template #icon><mars-icon icon="alarm" class="icon-vertical-a" /></template>
                  消息
                </mars-button>
                <mars-button size="middle" @click="onClickNotify">
                  <template #icon
                    ><mars-icon icon="download-one" class="icon-vertical-a"
                  /></template>
                  提示
                </mars-button>
                <mars-button size="middle" @click="onClickAlert">
                  <template #icon
                    ><mars-icon icon="download-one" class="icon-vertical-a"
                  /></template>
                  弹窗
                </mars-button>
                <mars-button size="middle" disabled> 禁用 </mars-button>
              </a-space>
            </div>
          </a-collapse-panel>

          <a-collapse-panel key="2" header="表格控件">
            <mars-table
              size="small"
              :customRow="customTableRow"
              :row-selection="rowSelection"
              bordered
              :pagination="{ pageSize: 5 }"
              :columns="columns"
              :dataSource="typhoonList"
              rowKey="id">
              <template #bodyCell="{ column, text }">
                <template v-if="column.dataIndex === 'name'">
                  <a>{{ text }}</a>
                </template>
              </template>
            </mars-table>
          </a-collapse-panel>
          <a-collapse-panel key="3" header="树控件">
            <mars-tree
              checkable
              :tree-data="treeData"
              v-model:expandedKeys="expandedKeys"
              v-model:checkedKeys="checkedKeys"
              @check="onCheckTreeItem">
              <template #title="{ title }">
                <span>{{ title }}</span>
              </template>
            </mars-tree>
          </a-collapse-panel>
        </a-collapse>

        <div class="f-tac">
          <a-space>
            <mars-button size="middle" @click="onClickLoading">
              <template #icon><mars-icon icon="find" class="icon-vertical-a" /></template>
              进度条1
            </mars-button>
            <mars-button size="middle" @click="onClickTopLoading">
              <template #icon><mars-icon icon="planet" class="icon-vertical-a" /></template>
              进度条2
            </mars-button>
          </a-space>
        </div>
      </a-form>
    </div>
  </mars-dialog>
  </div>
</template>

<script setup lang="ts">
import { onMounted, ref, reactive } from 'vue'
import * as mars3d from 'mars3d'
import axios from 'axios'
import { $message } from "@mars/components/mars-ui/index"
import * as mapWork from "./map.js"

const Cesium = mars3d.Cesium
let map

// onMounted(() => {
  
// })

onMounted(() => {
  initMap()
  // 访问后端接口,取台风列表数据
  const url = '//data.mars3d.cn/file/apidemo/typhoon/list_2020.json'
  axios.get(url).then(function (res: any) {
    const data = res.data
    typhoonList.value = data.typhoonList.map((item: any) => ({
      id: item[0],
      name_en: item[1],
      name_cn: item[2],
      typnumber: item[3],
      state: item[7]
    }))
  })
})


const initMap = () => {
  // 初始化 Cesium.Viewer
  var mapOptions = {
    basemaps: [{ name: '天地图', type: 'tdt', layer: 'img_d', show: true }],
    scene: {
      center: { lat: 31.786828, lng: 117.181704, alt: 3393, heading: 38, pitch: -34 }
    }
  }
  map = new mars3d.Map('gui-container', mapOptions)
}


const formState = reactive({
  url: '',
  extent: '',
  countCar: 1,
  model: '',
  date: null,
  brightness: 0,
  contrast: 128,
  checkboxVal: ['mars'],
  radioVal: '3',
  isScale: true,
  color: '#ffff00'
})

const rules = {
  url: [{ required: true, message: '请输入内容', trigger: 'blur' }]
}

// 数字输入框修改事件
const onNumberChange = () => {
  $message('您修改了数字:' + formState.countCar)
}

// 下拉列表数据
const modelOptions = [
  {
    value: 'jingche',
    label: '警车',
    style: { scale: 1, url: '//data.mars3d.cn/gltf/mars/jingche/jingche.gltf' }
  },
  {
    value: 'qiche',
    label: '小汽车',
    style: { scale: 1, url: '//data.mars3d.cn/gltf/mars/qiche.gltf' }
  },
  {
    value: 'dkc',
    label: '大卡车'
  }
]

// 下拉列表切换事件
const onSelectChange = (value: string, data: any) => {
  $message('您选择了:' + data.label)
  console.log('下拉列表切换事件', data)
}

// 日期切换事件
const onDateChange = (data: any, value: any) => {
  $message('您选择了日期:' + value)
}

// 多选框勾选事件
const onCheckboxChange = () => {
  $message('您勾选了:' + formState.checkboxVal)
  console.log('多选框勾选事件', formState.checkboxVal)
}

// 滑动条修改事件
const onSliderChange = () => {
  mapWork.updateBrightness(formState.brightness)
}

const marks: Record<number, any> = {
  '-255': '-255',
  '-125': '-125',
  0: '0',
  125: '125',
  255: '255'
}
// 带刻度滑动条修改事件
const onMarkSliderChange = () => {
  mapWork.updateContrast(formState.contrast) // 调用地图方法
}

// switch切换了
const onSwitchChange = () => {
  mapWork.enableMapMouseController(formState.isScale) // 调用地图方法
}

// 显示消息提示,自动消失
const onClickMessage = () => {
  $message('Message消息提示演示')
}

// 显示提示窗,不影响地图操作,会出现在页面右下角
const onClickNotify = async () => {
  $notify('Notify提示窗', `该窗口会出现在页面右下角,不影响地图交互操作。`)
}

// 显示遮罩提示窗,需要手动关闭
const onClickAlert = async () => {
  // $alert 返回一个Promise
  await $alert(`该窗口需要单击确定按钮进行关闭,会影响地图交互操作。`, 'Alert提示窗')

  $message('点击了确定按钮') // 异步单击确定后提示
}

// 按钮点击事件,演示loading持续三秒
const onClickLoading = async () => {
  $message('演示遮盖loading 持续三秒')

  window.$showLoading()
  setTimeout(() => {
    // 关闭loading
    window.$hideLoading()

    // 默认的信息提示
    $message('演示加载完成提示')
  }, 3000)
}

// 按钮点击事件,演示顶部不遮盖的loading
const onClickTopLoading = () => {
  $message('演示顶部不遮盖的loaing,看上面', 'warning')

  window.$showLoading('top') // top 调用出现在顶部的加载进度
  setTimeout(() => {
    window.$hideLoading('top')

    $message('演示加载失败提示', 'error')
  }, 3000)
}

// ========================= 表格控件相关处理============================

// 表格列头
const columns: TableColumnType[] = [
  {
    title: '台风编号',
    dataIndex: 'typnumber',
    key: 'typnumber'
  },
  {
    title: '台风名(中文)',
    dataIndex: 'name_cn'
  },
  {
    title: '台风名(英文)',
    dataIndex: 'name_en'
  }
]

interface typhoon {
  id: number
  name_en: string
  name_cn: string
  typnumber: string
  state: string
}
const typhoonList = ref<typhoon[]>([]) // 列表数据
onMounted(() => {
  // 访问后端接口,取台风列表数据
  const url = '//data.mars3d.cn/file/apidemo/typhoon/list_2020.json'
  axios.get(url).then(function (res: any) {
    const data = res.data
    typhoonList.value = data.typhoonList.map((item: any) => ({
      id: item[0],
      name_en: item[1],
      name_cn: item[2],
      typnumber: item[3],
      state: item[7]
    }))
  })
})

// 勾选了表格列表的行
const rowSelection: TableProps['rowSelection'] = {
  onSelect: (selectedRow: any, selectedRows: boolean) => {
    if (selectedRows) {
      $message('勾选了行:' + selectedRow.name_cn)
    } else {
      $message('取消了勾选行:' + selectedRow.name_cn)
    }
  }
}

// 点击表格列表的行
const customTableRow = (selectedRow: any) => {
  return {
    onClick: (row: any) => {
      $message('点击表格的行:' + selectedRow.name_cn)
    }
  }
}

// ========================= 树控件相关处理============================

const layersObj: any = {}
const treeData = ref<any[]>([])
const expandedKeys = ref<string[]>([])
const checkedKeys = ref<string[]>([])

function findChild(parent: any, list: any[]) {
  return list
    .filter((item: any) => item.pid === parent.id)
    .map((item: any) => {
      const node: any = {
        title: item.name,
        key: item.id,
        id: item.id,
        pId: item.pid
      }
      const nodeLayer = mapWork.createLayer(item) // 创建图层
      layersObj[item.id] = nodeLayer
      node.children = findChild(node, list)
      expandedKeys.value.push(node.key)
      if (item.isAdded && item.show) {
        checkedKeys.value.push(node.key)
      }
      return node
    })
}

// 勾选了树节点
const onCheckTreeItem = (keys: string[]) => {
  Object.keys(layersObj).forEach((k) => {
    const newKeys = keys.map((item) => {
      return String(item)
    })
    const show = newKeys.indexOf(k) !== -1
    const layer = layersObj[k]
    layer.show = show
    if (show) {
      if (!layer.isAdded) {
        mapWork.map.addLayer(layer)
      }
      layer.flyTo()
    } else {
      if (layer.isAdded) {
        mapWork.map.removeLayer(layer)
      }
    }
  })
}

</script>

<style scoped>
#gui-container {
  width: 100vw;
  height: 100vh;
}
.ui-container {
  height: 100%;
  overflow-y: scroll;
}
</style>

③ 同文件夹下添加 map.js
import * as mars3d from "mars3d"

export let map // mars3d.Map三维地图对象

// 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并)
export const mapOptions = {
  scene: {
    center: { lat: 31.823874, lng: 117.223976, alt: 3509, heading: 0, pitch: -90 }
  },
  control: {
    baseLayerPicker: false
  }
}

/**
 * 构造bloom效果对象
 * @type {mars3d.BloomEffect}
 */
let bloomEffect

// 事件对象,用于抛出事件给面板
export const eventTarget = new mars3d.BaseClass()

/**
 * 初始化地图业务,生命周期钩子函数(必须)
 * 框架在地图初始化完成后自动调用该函数
 * @param {mars3d.Map} mapInstance 地图对象
 * @returns {void} 无
 */
export function onMounted(mapInstance) {
  console.log("onMounted执行了")
  map = mapInstance // 记录首次创建的map

  // 构造bloom效果 用于滑动条测试
  bloomEffect = new mars3d.effect.BloomEffect()
  map.addEffect(bloomEffect)

  eventTarget.fire("init", {
    value: 10
  })
  queryTilesetData()
}

/**
 * 释放当前地图业务的生命周期函数
 * @returns {void} 无
 */
export function onUnmounted() {
  console.log("onUnmounted执行了")
  map.graphicLayer.clear()
  map.removeEffect(bloomEffect, true)
  bloomEffect = null
  map = null
}

// 绘制矩形(演示map.js与index.vue的交互)
export function drawExtent() {
  map.graphicLayer.clear()
  // 绘制矩形
  map.graphicLayer.startDraw({
    type: "rectangle",
    style: {
      fill: true,
      color: "rgba(255,255,0,0.2)",
      outline: true,
      outlineWidth: 2,
      outlineColor: "rgba(255,255,0,1)"
    },
    success: function (graphic) {
      const rectangle = mars3d.PolyUtil.formatRectangle(graphic._rectangle_draw)
      eventTarget.fire("drawExtent", { extent: JSON.stringify(rectangle) }) // 抛出事件,可以组件中去监听事件
    }
  })
}

// 是否运行地图鼠标交互
export function enableMapMouseController(value) {
  map.setSceneOptions({
    cameraController: {
      enableZoom: value,
      enableTranslate: value,
      enableRotate: value,
      enableTilt: value
    }
  })
}

// 调整亮度 (演示滑动条)
export function updateBrightness(val) {
  bloomEffect.brightness = val
}

// 调整对比度 (演示滑动条)
export function updateContrast(val) {
  bloomEffect.contrast = val
}

// 创建图层
export function createLayer(layer) {
  return mars3d.LayerUtil.create(layer)
}

// 数据获取
function queryTilesetData() {
  mars3d.Util.fetchJson({ url: "config/tileset.json" })
    .then(function (arr) {
      const modelData = arr.layers
      eventTarget.fire("loadTypeList", { modelData })
    })
    .catch(function (error) {
      console.log("加载JSON出错", error)
    })
}
④ 运行项目,看效果,

mars3d,mars3d,vue,项目经验,mars3d,vue
好了,已经完成mars-ui的添加了,可以继续开发了,文章来源地址https://www.toymoban.com/news/detail-707430.html

到了这里,关于【mars3d】基于vue3的marsgis通用UI库 mars-ui 的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3 + vite + ts 集成mars3d

    使用mars3d过程中,需要集成mars3d到自己的项目中,mars3d开发教程中已经有集成好的项目模板 http://mars3d.cn/doc.html 项目模板gitte地址:https://gitee.com/marsgis/mars3d-vue-template/tree/master/mars3d-vue3-vite 如果不想用官方的模板就需要自己集成 如何创建项目参考网上的教程,这里就不做详细

    2024年02月06日
    浏览(45)
  • Mars3D手把手开发教程(vue3)

    Mars3D三维可视化平台  是火星科技 (opens new window)研发的一款基于 WebGL 技术实现的三维客户端开发平台,基于Cesium (opens new window)优化提升与B/S架构设计,支持多行业扩展的轻量级高效能GIS开发平台,能够免安装、无插件地在浏览器中高效运行,并可快速接入与使用多种GIS数

    2024年04月15日
    浏览(82)
  • Vue3项目中集成mars3D简单三部曲

    这里是参考网址,大佬可以点击一件跳转 1.安装依赖 2.修改 vite.config.ts 配置文件 3. 新建DIV容器 + 创建地图 新建map.ts文件,以下代码闭眼直接copy vue文件引入map.ts,以下代码闭眼直接copy 快去试试吧~

    2024年01月25日
    浏览(34)
  • 【mars3d】Vue3项目集成mard3d实现gis空间地理系统

    最近公司的业务逻辑需要使用到gis空间地理系统,最开始使用的是Cesium.js.涉及东西很多,对新手不是太友好,传送门: https://cesium.com/platform/cesiumjs/ . 业务要使用到很多特效,刚接触到Cesium,很多效果实现起来很鸡肋,mars3d则很适合新手.文档与示例也很全,现在记录一下vue3项目如何集

    2024年02月13日
    浏览(45)
  • Vue2项目使用mars3d

    或参考webpack.config.js写法进行修改

    2024年02月14日
    浏览(44)
  • vue集成mars3d后,basemaps加不上去

    首先: template   div id=\\\"centerDiv\\\" class=\\\"mapcontainer\\\"     mars-map :url=\\\"configUrl\\\" @οnlοad=\\\"onMapload\\\" /   /div /template script import MarsMap from \\\'../components/mars-work/mars-map.vue\\\' import * as mars3d from \\\'mars3d\\\' //npm install mars3d-echarts --save import \\\'mars3d-echarts\\\' const Cesium = mars3d.Cesium export default {   // eslint-disabl

    2024年02月10日
    浏览(39)
  • Mars3D使用教程

    1、使用npm安装依赖库 //安装mars3d主库 ​ //安装mars3d插件(按需安装) ​ //安装copy-webpack-plugin 插件在第3步中使用,根据webpack版本安装,不匹配的版本可能出错,版本需要5.0 “copy-webpack-plugin”: “^5.0.0”, 2.在main.js全局导入 或者 在使用mars3d的文件中导入(这一步可以跳过,

    2024年02月02日
    浏览(50)
  • mars3d绘制区域范围(面+边框)

    1、图例(绿色面区域+白色边框)  2、代码 1)、绘制区域ts文件 解释: 1、new mars3d.layer.GeoJsonLayer      生成矢量图层 2、styleField       \\\"levels\\\" 是在json文件中区分不同级别景区的标志,值为1、2、3等 3、styleFieldOptions       根据styleField获取到的值进行区分,划分不同颜色的

    2024年02月15日
    浏览(48)
  • Mars3D Studio 的使用方法

    mars3d Studio 是 mars3d 研发团队于近期研发上线的一款 场景可视化编辑平台。拥有资源存档、团队协作、定制材质等丰富的功能。可以实现零代码构建一个可视化三维场景。 (1)数据上传:目前支持 tif 影像上传、 3dtitles 、 gltf 小模型上传以及矢量数据( shp、gesojson、kml ) 下

    2023年04月16日
    浏览(102)
  • [mars3d 学习] 最近升级版本造成的问题

    1、mars3d升级3.5以上,使用的时候报错; 需要看下 Mars3D三维可视化平台 | 火星科技 版本更新日志; 使用将Cesium的版本升级到1.103 2、升级Cesium到1.103,之后打包又会报错 - error in ./node_modules/mars3d-Cesium/Build/Cesium/index.js 哦,是因为cesium1.96改变了代码打包方式;在vue2中就会存在

    2024年02月17日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包