From 99cf5cda1ab5886307759de6ed430b4d8cd1a828 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=88=98=E5=A6=8D?= <1455167345@qq.com>
Date: Thu, 18 Jan 2024 08:59:13 +0800
Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90mars3d?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.vscode/settings.json | 2 +-
package.json | 8 +
public/config/config.json | 1142 +++++++++++++++++
src/locales/lang/zh-CN/routes/demo.json | 3 +-
src/main.ts | 11 +
src/mars/.editorconfig | 21 +
src/mars/.eslintrc.js | 78 ++
src/mars/.prettierrc | 10 +
src/mars/common/store/test.ts | 19 +
src/mars/common/store/widget.ts | 299 +++++
src/mars/common/uses/use-lifecycle.ts | 21 +
.../mars-sample/fixedRoute-info.vue | 107 ++
.../mars-sample/graphic-layer-state.vue | 877 +++++++++++++
.../components/mars-sample/layer-state.vue | 371 ++++++
.../components/mars-sample/location-to.vue | 60 +
.../mars-sample/tile-layer-state.vue | 438 +++++++
.../assets/images/border-image-base.png | Bin 0 -> 836 bytes
.../assets/images/login/login-bg-color.png | Bin 0 -> 595517 bytes
.../assets/images/login/login-bg-earth.png | Bin 0 -> 1159725 bytes
.../assets/images/login/login-content-bg.png | Bin 0 -> 11602 bytes
.../images/login/login-content-footer.png | Bin 0 -> 2250 bytes
.../assets/images/login/login-title-bg.png | Bin 0 -> 5070 bytes
.../assets/images/login/login-title-logo.png | Bin 0 -> 7153 bytes
.../components/mars-ui/assets/images/logo.png | Bin 0 -> 16758 bytes
.../assets/images/query-site-text_num.png | Bin 0 -> 548 bytes
.../mars-ui/assets/images/tab-title.png | Bin 0 -> 906 bytes
.../assets/images/zhyq/datails-title-bg.png | Bin 0 -> 3870 bytes
.../images/zhyq/echarts-title-bottom.png | Bin 0 -> 240 bytes
.../assets/images/zhyq/search-order.png | Bin 0 -> 226 bytes
src/mars/components/mars-ui/base.less | 489 +++++++
src/mars/components/mars-ui/common.ts | 2 +
src/mars/components/mars-ui/function.less | 440 +++++++
src/mars/components/mars-ui/index.less | 87 ++
src/mars/components/mars-ui/index.ts | 153 +++
.../components/mars-ui/mars-alert/alert.less | 38 +
.../components/mars-ui/mars-alert/index.ts | 38 +
.../components/mars-ui/mars-button/index.vue | 72 ++
.../mars-ui/mars-color-picker/index.ts | 97 ++
.../mars-color-picker/mars-color-picker.less | 224 ++++
.../components/mars-ui/mars-color/index.vue | 46 +
.../mars-ui/mars-date-picker/index.vue | 85 ++
.../components/mars-ui/mars-dialog/index.vue | 804 ++++++++++++
.../mars-ui/mars-dropdown/dropdown.less | 30 +
.../components/mars-ui/mars-dropdown/index.ts | 24 +
.../components/mars-ui/mars-echarts/index.ts | 476 +++++++
src/mars/components/mars-ui/mars-gui/index.ts | 30 +
.../components/mars-ui/mars-gui/index.vue | 185 +++
.../components/mars-ui/mars-icon/index.vue | 46 +
.../mars-ui/mars-input-group/index.vue | 33 +
.../mars-ui/mars-input-number/index.vue | 39 +
.../components/mars-ui/mars-input/index.vue | 43 +
.../components/mars-ui/mars-loading/index.ts | 34 +
.../components/mars-ui/mars-message/index.ts | 32 +
.../mars-ui/mars-message/message.less | 15 +
.../components/mars-ui/mars-notify/index.ts | 40 +
.../mars-ui/mars-notify/notify.less | 22 +
.../mars-ui/mars-range-picker/index.vue | 52 +
.../components/mars-ui/mars-select/index.vue | 43 +
.../components/mars-ui/mars-slider/index.vue | 68 +
.../components/mars-ui/mars-switch/index.vue | 49 +
.../components/mars-ui/mars-table/index.vue | 24 +
.../mars-ui/mars-textarea/index.vue | 38 +
.../components/mars-ui/mars-tree/index.ts | 53 +
.../components/mars-ui/mars-tree/tree.less | 81 ++
.../assets/images/border-image-base.png | Bin 0 -> 2325 bytes
.../assets/images/dialog-title-slice.png | Bin 0 -> 1382 bytes
.../themes/assets/images/dialog-title.png | Bin 0 -> 77546 bytes
.../themes/assets/images/heade-title-bg.png | Bin 0 -> 46988 bytes
.../themes/assets/images/header-bg.png | Bin 0 -> 27985 bytes
.../themes/assets/images/menu-hover.png | Bin 0 -> 8787 bytes
.../themes/assets/images/msg-title-bg.png | Bin 0 -> 1248 bytes
.../themes/assets/images/pannel-bg.png | Bin 0 -> 29819 bytes
.../assets/images/selet-dropdown-border.png | Bin 0 -> 5663 bytes
.../assets/images/sub-menu-emb-light.png | Bin 0 -> 2703 bytes
.../themes/assets/images/sub-menu-emb.png | Bin 0 -> 5206 bytes
.../themes/assets/images/tab-title.png | Bin 0 -> 2225 bytes
.../components/mars-ui/themes/dark/index.less | 41 +
.../components/mars-ui/themes/dark/index.wxss | 36 +
.../components/mars-ui/themes/dark/zhts.less | 5 +
src/mars/components/mars-ui/themes/index.ts | 2 +
.../mars-ui/themes/light/index.less | 40 +
.../components/mars-ui/themes/light/zhts.less | 4 +
src/mars/components/mars-work/main-view.vue | 82 ++
src/mars/components/mars-work/mars-map.vue | 355 +++++
src/mars/components/mars-work/widget.vue | 41 +
src/mars/install/index.ts | 26 +
src/mars/install/widget-store.ts | 56 +
src/mars/misc/env.d.ts | 44 +
src/mars/utils/file-util.ts | 81 ++
src/mars/utils/getDefaultContextMenu.ts | 840 ++++++++++++
src/mars/utils/mars-util.ts | 121 ++
src/mars/views/index.vue | 30 +
.../widgets/basic/location-point/index.vue | 304 +++++
src/mars/widgets/basic/location-point/map.ts | 102 ++
.../widgets/basic/manage-basemap/index.vue | 88 ++
src/mars/widgets/basic/manage-basemap/map.ts | 33 +
.../basic/manage-layers/img/guihua.jpg | Bin 0 -> 70928 bytes
.../basic/manage-layers/img/heatmap.png | Bin 0 -> 13482 bytes
.../widgets/basic/manage-layers/index.vue | 332 +++++
.../manage-layers/layer-picture-guihua.vue | 16 +
.../manage-layers/layer-picture-heatmap.vue | 17 +
.../basic/manage-layers/layer-tree.vue | 85 ++
src/mars/widgets/basic/manage-layers/map.ts | 87 ++
src/mars/widgets/basic/query-poi/index.vue | 332 +++++
src/mars/widgets/basic/query-poi/map.ts | 230 ++++
.../widgets/basic/query-poi/query-popup.vue | 37 +
src/mars/widgets/basic/toolbar/index.vue | 94 ++
src/mars/widgets/demo/menu/index.vue | 37 +
src/mars/widgets/demo/menu/map.ts | 50 +
src/mars/widgets/demo/menu/popup-demo.vue | 24 +
src/mars/widgets/demo/my-dialog/index.vue | 53 +
src/mars/widgets/demo/my-dialog/map.ts | 36 +
src/mars/widgets/demo/power-pannel/index.vue | 258 ++++
src/mars/widgets/demo/sample-dialog/index.vue | 42 +
src/mars/widgets/demo/sample-dialog/map.ts | 36 +
src/mars/widgets/demo/sample-pannel/index.vue | 44 +
src/mars/widgets/demo/sample-pannel/map.ts | 38 +
src/mars/widgets/demo/test/index.vue | 15 +
src/mars/widgets/demo/test/map.ts | 208 +++
src/mars/widgets/demo/ui/index.vue | 435 +++++++
src/mars/widgets/demo/ui/map.ts | 93 ++
src/router/routes/modules/demo/charts.ts | 25 +
src/router/routes/modules/demo/system.ts | 11 +-
src/settings/projectSetting.ts | 2 +-
src/views/demo/charts/mars3d/index.vue | 162 +++
src/views/demo/charts/mars3d/map.js | 217 ++++
tsconfig.json | 2 +-
vite.config.ts | 28 +
128 files changed, 12871 insertions(+), 5 deletions(-)
create mode 100644 public/config/config.json
create mode 100644 src/mars/.editorconfig
create mode 100644 src/mars/.eslintrc.js
create mode 100644 src/mars/.prettierrc
create mode 100644 src/mars/common/store/test.ts
create mode 100644 src/mars/common/store/widget.ts
create mode 100644 src/mars/common/uses/use-lifecycle.ts
create mode 100644 src/mars/components/mars-sample/fixedRoute-info.vue
create mode 100644 src/mars/components/mars-sample/graphic-layer-state.vue
create mode 100644 src/mars/components/mars-sample/layer-state.vue
create mode 100644 src/mars/components/mars-sample/location-to.vue
create mode 100644 src/mars/components/mars-sample/tile-layer-state.vue
create mode 100644 src/mars/components/mars-ui/assets/images/border-image-base.png
create mode 100644 src/mars/components/mars-ui/assets/images/login/login-bg-color.png
create mode 100644 src/mars/components/mars-ui/assets/images/login/login-bg-earth.png
create mode 100644 src/mars/components/mars-ui/assets/images/login/login-content-bg.png
create mode 100644 src/mars/components/mars-ui/assets/images/login/login-content-footer.png
create mode 100644 src/mars/components/mars-ui/assets/images/login/login-title-bg.png
create mode 100644 src/mars/components/mars-ui/assets/images/login/login-title-logo.png
create mode 100644 src/mars/components/mars-ui/assets/images/logo.png
create mode 100644 src/mars/components/mars-ui/assets/images/query-site-text_num.png
create mode 100644 src/mars/components/mars-ui/assets/images/tab-title.png
create mode 100644 src/mars/components/mars-ui/assets/images/zhyq/datails-title-bg.png
create mode 100644 src/mars/components/mars-ui/assets/images/zhyq/echarts-title-bottom.png
create mode 100644 src/mars/components/mars-ui/assets/images/zhyq/search-order.png
create mode 100644 src/mars/components/mars-ui/base.less
create mode 100644 src/mars/components/mars-ui/common.ts
create mode 100644 src/mars/components/mars-ui/function.less
create mode 100644 src/mars/components/mars-ui/index.less
create mode 100644 src/mars/components/mars-ui/index.ts
create mode 100644 src/mars/components/mars-ui/mars-alert/alert.less
create mode 100644 src/mars/components/mars-ui/mars-alert/index.ts
create mode 100644 src/mars/components/mars-ui/mars-button/index.vue
create mode 100644 src/mars/components/mars-ui/mars-color-picker/index.ts
create mode 100644 src/mars/components/mars-ui/mars-color-picker/mars-color-picker.less
create mode 100644 src/mars/components/mars-ui/mars-color/index.vue
create mode 100644 src/mars/components/mars-ui/mars-date-picker/index.vue
create mode 100644 src/mars/components/mars-ui/mars-dialog/index.vue
create mode 100644 src/mars/components/mars-ui/mars-dropdown/dropdown.less
create mode 100644 src/mars/components/mars-ui/mars-dropdown/index.ts
create mode 100644 src/mars/components/mars-ui/mars-echarts/index.ts
create mode 100644 src/mars/components/mars-ui/mars-gui/index.ts
create mode 100644 src/mars/components/mars-ui/mars-gui/index.vue
create mode 100644 src/mars/components/mars-ui/mars-icon/index.vue
create mode 100644 src/mars/components/mars-ui/mars-input-group/index.vue
create mode 100644 src/mars/components/mars-ui/mars-input-number/index.vue
create mode 100644 src/mars/components/mars-ui/mars-input/index.vue
create mode 100644 src/mars/components/mars-ui/mars-loading/index.ts
create mode 100644 src/mars/components/mars-ui/mars-message/index.ts
create mode 100644 src/mars/components/mars-ui/mars-message/message.less
create mode 100644 src/mars/components/mars-ui/mars-notify/index.ts
create mode 100644 src/mars/components/mars-ui/mars-notify/notify.less
create mode 100644 src/mars/components/mars-ui/mars-range-picker/index.vue
create mode 100644 src/mars/components/mars-ui/mars-select/index.vue
create mode 100644 src/mars/components/mars-ui/mars-slider/index.vue
create mode 100644 src/mars/components/mars-ui/mars-switch/index.vue
create mode 100644 src/mars/components/mars-ui/mars-table/index.vue
create mode 100644 src/mars/components/mars-ui/mars-textarea/index.vue
create mode 100644 src/mars/components/mars-ui/mars-tree/index.ts
create mode 100644 src/mars/components/mars-ui/mars-tree/tree.less
create mode 100644 src/mars/components/mars-ui/themes/assets/images/border-image-base.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/dialog-title-slice.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/dialog-title.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/heade-title-bg.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/header-bg.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/menu-hover.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/msg-title-bg.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/pannel-bg.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/selet-dropdown-border.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/sub-menu-emb-light.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/sub-menu-emb.png
create mode 100644 src/mars/components/mars-ui/themes/assets/images/tab-title.png
create mode 100644 src/mars/components/mars-ui/themes/dark/index.less
create mode 100644 src/mars/components/mars-ui/themes/dark/index.wxss
create mode 100644 src/mars/components/mars-ui/themes/dark/zhts.less
create mode 100644 src/mars/components/mars-ui/themes/index.ts
create mode 100644 src/mars/components/mars-ui/themes/light/index.less
create mode 100644 src/mars/components/mars-ui/themes/light/zhts.less
create mode 100644 src/mars/components/mars-work/main-view.vue
create mode 100644 src/mars/components/mars-work/mars-map.vue
create mode 100644 src/mars/components/mars-work/widget.vue
create mode 100644 src/mars/install/index.ts
create mode 100644 src/mars/install/widget-store.ts
create mode 100644 src/mars/misc/env.d.ts
create mode 100644 src/mars/utils/file-util.ts
create mode 100644 src/mars/utils/getDefaultContextMenu.ts
create mode 100644 src/mars/utils/mars-util.ts
create mode 100644 src/mars/views/index.vue
create mode 100644 src/mars/widgets/basic/location-point/index.vue
create mode 100644 src/mars/widgets/basic/location-point/map.ts
create mode 100644 src/mars/widgets/basic/manage-basemap/index.vue
create mode 100644 src/mars/widgets/basic/manage-basemap/map.ts
create mode 100644 src/mars/widgets/basic/manage-layers/img/guihua.jpg
create mode 100644 src/mars/widgets/basic/manage-layers/img/heatmap.png
create mode 100644 src/mars/widgets/basic/manage-layers/index.vue
create mode 100644 src/mars/widgets/basic/manage-layers/layer-picture-guihua.vue
create mode 100644 src/mars/widgets/basic/manage-layers/layer-picture-heatmap.vue
create mode 100644 src/mars/widgets/basic/manage-layers/layer-tree.vue
create mode 100644 src/mars/widgets/basic/manage-layers/map.ts
create mode 100644 src/mars/widgets/basic/query-poi/index.vue
create mode 100644 src/mars/widgets/basic/query-poi/map.ts
create mode 100644 src/mars/widgets/basic/query-poi/query-popup.vue
create mode 100644 src/mars/widgets/basic/toolbar/index.vue
create mode 100644 src/mars/widgets/demo/menu/index.vue
create mode 100644 src/mars/widgets/demo/menu/map.ts
create mode 100644 src/mars/widgets/demo/menu/popup-demo.vue
create mode 100644 src/mars/widgets/demo/my-dialog/index.vue
create mode 100644 src/mars/widgets/demo/my-dialog/map.ts
create mode 100644 src/mars/widgets/demo/power-pannel/index.vue
create mode 100644 src/mars/widgets/demo/sample-dialog/index.vue
create mode 100644 src/mars/widgets/demo/sample-dialog/map.ts
create mode 100644 src/mars/widgets/demo/sample-pannel/index.vue
create mode 100644 src/mars/widgets/demo/sample-pannel/map.ts
create mode 100644 src/mars/widgets/demo/test/index.vue
create mode 100644 src/mars/widgets/demo/test/map.ts
create mode 100644 src/mars/widgets/demo/ui/index.vue
create mode 100644 src/mars/widgets/demo/ui/map.ts
create mode 100644 src/views/demo/charts/mars3d/index.vue
create mode 100644 src/views/demo/charts/mars3d/map.js
diff --git a/.vscode/settings.json b/.vscode/settings.json
index fcbab54..102e165 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -76,7 +76,7 @@
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
- "editor.defaultFormatter": "esbenp.prettier-vscode"
+ "editor.defaultFormatter": "vscode.html-language-features"
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
diff --git a/package.json b/package.json
index 789bc84..e429ec1 100644
--- a/package.json
+++ b/package.json
@@ -69,6 +69,7 @@
},
"dependencies": {
"@ant-design/icons-vue": "^7.0.1",
+ "@icon-park/svg": "^1.4.2",
"@iconify/iconify": "^3.1.1",
"@logicflow/core": "^1.2.18",
"@logicflow/extension": "^1.2.19",
@@ -85,7 +86,10 @@
"driver.js": "^1.3.1",
"echarts": "^5.4.3",
"exceljs": "^4.4.0",
+ "lodash": "^4.17.21",
"lodash-es": "^4.17.21",
+ "mars3d": "^3.7.0",
+ "mars3d-cesium": "^1.113.0",
"mockjs": "^1.1.0",
"nprogress": "^0.2.0",
"path-to-regexp": "^6.2.1",
@@ -99,13 +103,16 @@
"sortablejs": "^1.15.1",
"tinymce": "^5.10.9",
"unocss": "0.58.3",
+ "uuid": "^9.0.1",
"vditor": "^3.9.8",
"vue": "3.3.4",
+ "vue-color-kit": "^1.0.6",
"vue-i18n": "^9.8.0",
"vue-json-pretty": "^2.3.0",
"vue-router": "^4.2.5",
"vue-types": "^5.1.1",
"vuedraggable": "^4.1.0",
+ "vuex": "^4.1.0",
"vxe-table": "^4.5.17",
"vxe-table-plugin-export-xlsx": "^3.1.0",
"xe-utils": "^3.5.14",
@@ -144,6 +151,7 @@
"typescript": "^5.3.3",
"unbuild": "^2.0.0",
"vite": "^5.0.10",
+ "vite-plugin-mars3d": "^3.1.3",
"vite-plugin-mock": "^2.9.6",
"vue-tsc": "^1.8.27"
},
diff --git a/public/config/config.json b/public/config/config.json
new file mode 100644
index 0000000..b3936c0
--- /dev/null
+++ b/public/config/config.json
@@ -0,0 +1,1142 @@
+{
+ "map3d": {
+ "scene": {
+ "center": { "lat": 31.686288, "lng": 117.229619, "alt": 11333.9, "heading": 359.2, "pitch": -39.5 },
+ "scene3DOnly": false,
+ "shadows": false,
+ "removeDblClick": true,
+ "sceneMode": 3,
+ "showSun": true,
+ "showMoon": true,
+ "showSkyBox": true,
+ "showSkyAtmosphere": true,
+ "fog": true,
+ "fxaa": true,
+ "requestRenderMode": true,
+ "globe": {
+ "depthTestAgainstTerrain": false,
+ "baseColor": "#546a53",
+ "showGroundAtmosphere": true,
+ "enableLighting": false
+ },
+ "cameraController": {
+ "zoomFactor": 3.0,
+ "minimumZoomDistance": 1,
+ "maximumZoomDistance": 50000000,
+ "enableRotate": true,
+ "enableTranslate": true,
+ "enableTilt": true,
+ "enableZoom": true,
+ "enableCollisionDetection": true,
+ "minimumCollisionTerrainHeight": 15000
+ }
+ },
+ "control": {
+ "homeButton": true,
+ "baseLayerPicker": false,
+ "sceneModePicker": true,
+ "vrButton": false,
+ "fullscreenButton": true,
+ "navigationHelpButton": true,
+ "animation": false,
+ "timeline": false,
+ "infoBox": false,
+ "geocoder": false,
+ "selectionIndicator": false,
+
+ "contextmenu": { "hasDefault": true },
+ "mouseDownView": true,
+ "zoom": { "insertIndex": 1 },
+ "compass": { "bottom": "toolbar", "left": "5px" },
+ "distanceLegend": { "left": "100px", "bottom": "2px" },
+ "locationBar": {
+ "fps": false,
+ "crs": "CGCS2000_GK_Zone_3",
+ "crsDecimal": 0,
+ "template": "
经度:{lng}
纬度:{lat}
横{crsx} 纵{crsy}
海拔:{alt}米
层级:{level}
方向:{heading}°
俯仰角:{pitch}°
视高:{cameraHeight}米
"
+ }
+ },
+ "templateValues": {
+ "dataServer": "//data.mars3d.cn",
+ "gltfServerUrl": "//data.mars3d.cn/gltf"
+ },
+ "terrain": {
+ "url": "//data.mars3d.cn/terrain",
+ "show": true
+ },
+ "basemaps": [
+ { "id": 10, "name": "地图底图", "type": "group" },
+ {
+ "id": 2021,
+ "pid": 10,
+ "name": "谷歌影像",
+ "icon": "/img/basemaps/google_img.png",
+ "type": "google",
+ "layer": "img_d",
+ "show": true
+ },
+ {
+ "pid": 10,
+ "name": "天地图影像",
+ "icon": "img/basemaps/tdt_img.png",
+ "type": "group",
+ "layers": [
+ { "name": "底图", "type": "tdt", "layer": "img_d" },
+ { "name": "注记", "type": "tdt", "layer": "img_z" }
+ ],
+ "show": false
+ },
+ {
+ "pid": 10,
+ "name": "天地图电子",
+ "icon": "img/basemaps/tdt_vec.png",
+ "type": "group",
+ "layers": [
+ { "name": "底图", "type": "tdt", "layer": "vec_d" },
+ { "name": "注记", "type": "tdt", "layer": "vec_z" }
+ ]
+ },
+ {
+ "pid": 10,
+ "name": "高德影像",
+ "type": "group",
+ "icon": "img/basemaps/gaode_img.png",
+ "layers": [
+ { "name": "底图", "type": "gaode", "layer": "img_d" },
+ { "name": "注记", "type": "gaode", "layer": "img_z" }
+ ]
+ },
+ {
+ "pid": 10,
+ "name": "高德电子",
+ "type": "gaode",
+ "icon": "img/basemaps/gaode_vec.png",
+ "layer": "vec"
+ },
+ {
+ "pid": 10,
+ "name": "百度影像",
+ "type": "group",
+ "icon": "img/basemaps/bd-img.png",
+ "layers": [
+ { "name": "底图", "type": "baidu", "layer": "img_d" },
+ { "name": "注记", "type": "baidu", "layer": "img_z" }
+ ]
+ },
+ {
+ "pid": 10,
+ "name": "百度电子",
+ "icon": "img/basemaps/bd-vec.png",
+ "type": "baidu",
+ "layer": "vec"
+ },
+ {
+ "pid": 10,
+ "name": "腾讯影像",
+ "icon": "img/basemaps/tencent_img.png",
+ "type": "group",
+ "layers": [
+ { "name": "底图", "type": "tencent", "layer": "img_d" },
+ { "name": "注记", "type": "tencent", "layer": "img_z" }
+ ]
+ },
+ {
+ "pid": 10,
+ "name": "腾讯电子",
+ "icon": "img/basemaps/tencent_vec.png",
+ "type": "tencent",
+ "layer": "vec"
+ },
+ {
+ "pid": 10,
+ "name": "ArcGIS影像",
+ "icon": "img/basemaps/esriWorldImagery.png",
+ "type": "xyz",
+ "url": "https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
+ "enablePickFeatures": false
+ },
+ {
+ "pid": 10,
+ "name": "微软影像",
+ "icon": "img/basemaps/bingAerial.png",
+ "type": "bing",
+ "layer": "Aerial"
+ },
+ {
+ "id": 2017,
+ "pid": 10,
+ "name": "暗色底图",
+ "type": "gaode",
+ "icon": "img/basemaps/blackMarble.png",
+ "layer": "vec",
+ "invertColor": true,
+ "filterColor": "#4e70a6",
+ "brightness": 0.6,
+ "contrast": 1.8,
+ "gamma": 0.3,
+ "hue": 1,
+ "saturation": 0
+ },
+ {
+ "pid": 10,
+ "name": "蓝色底图",
+ "icon": "img/basemaps/bd-c-midnight.png",
+ "type": "xyz",
+ "url": "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}",
+ "chinaCRS": "GCJ02",
+ "enablePickFeatures": false
+ },
+ {
+ "pid": 10,
+ "name": "黑色底图",
+ "icon": "img/basemaps/bd-c-dark.png",
+ "type": "tencent",
+ "layer": "custom",
+ "style": "4"
+ },
+ {
+ "pid": 10,
+ "name": "离线地图 (供参考)",
+ "type": "group",
+ "icon": "img/basemaps/google_img.png",
+ "layers": [
+ {
+ "name": "全球",
+ "type": "xyz",
+ "url": "{dataServer}/tile/googleImg/{z}/{x}/{y}.jpg",
+ "minimumLevel": 0,
+ "maximumLevel": 9
+ },
+ {
+ "name": "中国",
+ "type": "xyz",
+ "url": "{dataServer}/tile/googleImg/{z}/{x}/{y}.jpg",
+ "minimumTerrainLevel": 10,
+ "minimumLevel": 10,
+ "maximumLevel": 12,
+ "rectangle": { "xmin": 69.706929, "xmax": 136.560941, "ymin": 15.831038, "ymax": 52.558005 }
+ },
+ {
+ "name": "具体项目(如合肥)",
+ "type": "xyz",
+ "url": "{dataServer}/tile/googleImg/{z}/{x}/{y}.jpg",
+ "minimumTerrainLevel": 12,
+ "minimumLevel": 12,
+ "maximumLevel": 18,
+ "rectangle": { "xmin": 116.33236, "xmax": 118.183557, "ymin": 31.143784, "ymax": 32.565035 }
+ }
+ ]
+ },
+ {
+ "pid": 10,
+ "name": "单张图片 (本地离线)",
+ "icon": "img/basemaps/offline.png",
+ "type": "image",
+ "url": "//data.mars3d.cn/file/img/world/world.jpg"
+ },
+ {
+ "id": 2023,
+ "pid": 10,
+ "name": "无底图",
+ "icon": "/img/basemaps/null.png",
+ "type": "grid",
+ "color": "#ffffff",
+ "alpha": 0.03,
+ "cells": 2
+ }
+ ],
+ "layers": [
+ { "id": 50, "name": "辅助图层", "type": "group" },
+ { "pid": 50, "type": "graticule", "name": "经纬网" },
+ {
+ "pid": 50,
+ "name": "行政区划界线",
+ "type": "tdt",
+ "url": "https://t{s}.tianditu.gov.cn/mapservice/swdx?T=ibo_w&x={x}&y={y}&l={z}",
+ "maximumLevel": 10,
+ "mapSplit": false
+ },
+ {
+ "pid": 50,
+ "name": "高德实时路况",
+ "type": "gaode",
+ "layer": "time",
+ "minimumTerrainLevel": 4,
+ "minimumLevel": 4,
+ "proxy": "//server.mars3d.cn/proxy/",
+ "mapSplit": false
+ },
+ {
+ "pid": 50,
+ "name": "百度实时路况",
+ "type": "baidu",
+ "layer": "time",
+ "mapSplit": false
+ },
+
+ { "id": 60, "name": "地形", "type": "group" },
+ { "pid": 60, "type": "terrain", "name": "Cesium地形", "terrain": { "type": "ion" }, "radio": true },
+ { "pid": 60, "type": "terrain", "name": "Mars3D地形", "terrain": { "type": "xyz", "url": "{dataServer}/terrain" }, "radio": true },
+ {
+ "pid": 60,
+ "type": "terrain",
+ "name": "ArcGIS地形",
+ "terrain": { "type": "arcgis", "url": "https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" },
+ "radio": true
+ },
+ { "pid": 60, "type": "terrain", "name": "无地形", "terrain": { "type": "none" }, "radio": true },
+
+ { "id": 40, "name": "栅格数据", "type": "group" },
+ { "id": 4020, "pid": 40, "name": "OGC WMS服务", "type": "group" },
+ {
+ "pid": 4020,
+ "name": "教育设施点",
+ "type": "wms",
+ "url": "//server.mars3d.cn/geoserver/mars/wms",
+ "layers": "mars:hfjy",
+ "crs": "EPSG:4326",
+ "parameters": { "transparent": "true", "format": "image/png" },
+ "popup": "名称:{项目名称}
类型:{设施类型}
面积:{用地面积}亩
位置:{具体位置}",
+ "mapSplit": false,
+ "show": false,
+ "flyTo": true
+ },
+ {
+ "pid": 4020,
+ "name": "道路线",
+ "type": "wms",
+ "url": "//server.mars3d.cn/geoserver/mars/wms",
+ "layers": "mars:hfdl",
+ "crs": "EPSG:4326",
+ "parameters": { "transparent": "true", "format": "image/png" },
+ "center": { "lat": 31.743214, "lng": 117.277097, "alt": 47197.7, "heading": 0.3, "pitch": -78.8 },
+ "popup": "all",
+ "mapSplit": false,
+ "show": false,
+ "flyTo": true
+ },
+ {
+ "pid": 4020,
+ "name": "建筑物面",
+ "type": "wms",
+ "url": "//server.mars3d.cn/geoserver/mars/wms",
+ "layers": "mars:hfjzw",
+ "crs": "EPSG:4326",
+ "parameters": { "transparent": "true", "format": "image/png" },
+ "highlight": {
+ "showTime": 5000,
+ "fill": true,
+ "color": "#2deaf7",
+ "opacity": 0.6,
+ "outline": true,
+ "outlineWidth": 3,
+ "outlineColor": "#e000d9",
+ "outlineOpacity": 1.0,
+ "clampToGround": true
+ },
+ "center": { "lat": 31.79513, "lng": 117.236172, "alt": 3784.6, "heading": 0.7, "pitch": -42.2 },
+ "popup": "all",
+ "show": false,
+ "flyTo": true
+ },
+ {
+ "pid": 4020,
+ "name": "规划面",
+ "type": "wms",
+ "url": "//server.mars3d.cn/geoserver/mars/wms",
+ "layers": "mars:hfgh",
+ "crs": "EPSG:4326",
+ "parameters": { "transparent": "true", "format": "image/png" },
+ "center": { "lat": 31.743214, "lng": 117.277097, "alt": 47197.7, "heading": 0.3, "pitch": -78.8 },
+ "popup": "all",
+ "show": false,
+ "flyTo": true
+ },
+ { "id": 4030, "pid": 40, "name": "ArcGIS 瓦片", "type": "group" },
+ {
+ "pid": 4030,
+ "name": "合肥规划图",
+ "type": "arcgis_cache",
+ "url": "{dataServer}/arcgis_cache/hfgh/_alllayers/{z}/{y}/{x}.png",
+ "minimumLevel": 1,
+ "maximumLevel": 17,
+ "minimumTerrainLevel": 1,
+ "maximumTerrainLevel": 17,
+ "rectangle": { "xmin": 116.846, "xmax": 117.642, "ymin": 31.533, "ymax": 32.185 }
+ },
+ { "id": 4010, "pid": 40, "name": "ArcGIS Dynamic", "type": "group" },
+ {
+ "id": 401085,
+ "pid": 4010,
+ "type": "arcgis",
+ "name": "主要道路",
+ "url": "//server.mars3d.cn/arcgis/rest/services/mars/hefei/MapServer",
+ "layers": "24",
+ "highlight": { "type": "polyline", "color": "#2deaf7", "width": 4, "clampToGround": true },
+ "center": { "lat": 31.814176, "lng": 117.225362, "alt": 5105.3, "heading": 359.2, "pitch": -83.1 },
+ "popup": "all",
+ "onWidget": "layer-picture-heatmap",
+ "mapSplit": false
+ },
+ {
+ "id": 401086,
+ "pid": 4010,
+ "type": "arcgis",
+ "name": "建筑物",
+ "url": "//server.mars3d.cn/arcgis/rest/services/mars/hefei/MapServer",
+ "layers": "35,36,37,39",
+ "highlight": {
+ "fill": true,
+ "color": "#2deaf7",
+ "opacity": 0.6,
+ "outline": true,
+ "outlineWidth": 3,
+ "outlineColor": "#e000d9",
+ "outlineOpacity": 1.0,
+ "clampToGround": true
+ },
+ "center": { "lat": 31.816951, "lng": 117.22898, "alt": 2916.7, "heading": 0.3, "pitch": -78.8 },
+ "popup": "名称:{NAME}
层数:{floor}",
+ "onWidget": "layer-picture-heatmap"
+ },
+ {
+ "id": 401087,
+ "pid": 4010,
+ "type": "arcgis",
+ "name": "规划",
+ "url": "//server.mars3d.cn/arcgis/rest/services/mars/guihua/MapServer",
+ "highlight": {
+ "showTime": 5000,
+ "fill": true,
+ "color": "#2deaf7",
+ "opacity": 0.6,
+ "outline": true,
+ "outlineWidth": 3,
+ "outlineColor": "#e000d9",
+ "outlineOpacity": 1.0,
+ "clampToGround": true
+ },
+ "center": { "lat": 31.816951, "lng": 117.22898, "alt": 2916.7, "heading": 0.3, "pitch": -78.8 },
+ "popup": [
+ { "field": "用地名称", "name": "名称" },
+ { "field": "用地编号", "name": "编号" },
+ { "field": "规划用地", "name": "规划" },
+ { "type": "html", "html": "数据仅供参考
" }
+ ],
+ "popupNoTitle": true,
+ "onWidget": "layer-picture-guihua"
+ },
+ { "id": 30, "name": "矢量数据", "type": "group" },
+ { "id": 3030, "pid": 30, "name": "GeoJSON数据", "type": "group" },
+ {
+ "id": 303011,
+ "pid": 3030,
+ "type": "geojson",
+ "name": "平台标绘",
+ "url": "{dataServer}/file/geojson/mars3d-draw.json",
+ "popup": "{type}{name}",
+ "show": false,
+ "flyTo": true
+ },
+ {
+ "pid": 3030,
+ "type": "geojson",
+ "name": "用地规划",
+ "url": "{dataServer}/file/geojson/guihua.json",
+ "symbol": {
+ "styleOptions": { "opacity": 0.6, "color": "#0000FF", "width": 3, "clampToGround": true },
+ "styleField": "类型",
+ "styleFieldOptions": {
+ "一类居住用地": { "color": "#FFDF7F" },
+ "二类居住用地": { "color": "#FFFF00" },
+ "社区服务用地": { "color": "#FF6A38" },
+ "幼托用地": { "color": "#FF6A38" },
+ "商住混合用地": { "color": "#FF850A" },
+ "行政办公用地": { "color": "#FF00FF" },
+ "文化设施用地": { "color": "#FF00FF" },
+ "小学用地": { "color": "#FF7FFF" },
+ "初中用地": { "color": "#FF7FFF" },
+ "体育场用地": { "color": "#00A57C" },
+ "医院用地": { "color": "#A5527C" },
+ "社会福利用地": { "color": "#FF7F9F" },
+ "商业用地": { "color": "#FF0000" },
+ "商务用地": { "color": "#7F0000" },
+ "营业网点用地": { "color": "#FF7F7F" },
+ "一类工业用地": { "color": "#A57C52" },
+ "社会停车场用地": { "color": "#C0C0C0" },
+ "通信用地": { "color": "#007CA5" },
+ "排水用地": { "color": "#00BFFF" },
+ "公园绿地": { "color": "#00FF00" },
+ "防护绿地": { "color": "#007F00" },
+ "河流水域": { "color": "#7FFFFF" },
+ "配建停车场": { "color": "#ffffff" },
+ "道路用地": { "color": "#ffffff" }
+ }
+ },
+ "popup": "{类型}",
+ "show": false,
+ "flyTo": true
+ },
+ {
+ "pid": 3030,
+ "type": "geojson",
+ "name": "建筑物面",
+ "url": "{dataServer}/file/geojson/buildings-demo.json",
+ "symbol": { "styleOptions": { "color": "#0d3685", "outlineColor": "#0d3685", "opacity": 0.8 } },
+ "buildings": { "cloumn": "floors", "height": "flo_height" },
+ "popup": "all",
+ "flyTo": true,
+ "flyToOptions": { "minHeight": 2000 }
+ },
+ {
+ "pid": 3030,
+ "type": "geojson",
+ "name": "安徽各市",
+ "url": "{dataServer}/file/geojson/areas/340000_full.json",
+ "symbol": {
+ "type": "polygon",
+ "styleOptions": {
+ "materialType": "PolyGradient",
+ "materialOptions": {
+ "color": "rgb(15,176,255)",
+ "opacity": 0.7,
+ "alphaPower": 1.3
+ },
+ "label": {
+ "text": "{name}",
+ "opacity": 1,
+ "font_size": 25,
+ "color": "#ffffff",
+ "outline": true,
+ "outlineColor": "#000000",
+ "outlineWidth": 3,
+ "scaleByDistance": true,
+ "scaleByDistance_far": 2743804,
+ "scaleByDistance_farValue": 0.3,
+ "scaleByDistance_near": 10000,
+ "scaleByDistance_nearValue": 1,
+ "distanceDisplayCondition": true,
+ "distanceDisplayCondition_far": 2743804,
+ "distanceDisplayCondition_near": 0
+ }
+ }
+ },
+ "popup": "{name}",
+ "show": false,
+ "flyTo": true
+ },
+ {
+ "pid": 3030,
+ "type": "geojson",
+ "name": "中国省界",
+ "url": "{dataServer}/file/geojson/areas/100000_full.json",
+ "symbol": {
+ "type": "polylineP",
+ "styleOptions": {
+ "color": "#ffffff",
+ "width": 2,
+ "opacity": 0.8,
+ "label": {
+ "text": "{name}",
+ "position": "center",
+ "font_size": 30,
+ "color": "#ffffff",
+ "outline": true,
+ "outlineColor": "#000000",
+ "scaleByDistance": true,
+ "scaleByDistance_far": 60000000,
+ "scaleByDistance_farValue": 0.2,
+ "scaleByDistance_near": 1000000,
+ "scaleByDistance_nearValue": 1,
+ "distanceDisplayCondition": true,
+ "distanceDisplayCondition_far": 12000000,
+ "distanceDisplayCondition_near": 0
+ }
+ }
+ },
+ "show": false,
+ "flyTo": true
+ },
+ {
+ "pid": 3030,
+ "type": "geojson",
+ "name": "西藏垭口",
+ "url": "{dataServer}/file/geojson/xizangyakou.json",
+ "symbol": {
+ "styleOptions": {
+ "image": "img/marker/mark-red.png",
+ "scaleByDistance": true,
+ "scaleByDistance_far": 5000000,
+ "scaleByDistance_farValue": 0.5,
+ "scaleByDistance_near": 1000,
+ "scaleByDistance_nearValue": 1,
+ "verticalOrigin": 1,
+ "horizontalOrigin": 0,
+ "clampToGround": true,
+ "label": {
+ "text": "{NAME}",
+ "font_size": 25,
+ "color": "#ffff00",
+ "font_family": "微软雅黑",
+ "outline": true,
+ "outlineColor": "#000000",
+ "pixelOffsetY": -40,
+ "scaleByDistance": true,
+ "scaleByDistance_far": 1000000,
+ "scaleByDistance_farValue": 0.5,
+ "scaleByDistance_near": 1000,
+ "scaleByDistance_nearValue": 1,
+ "distanceDisplayCondition": true,
+ "distanceDisplayCondition_far": 1000000,
+ "distanceDisplayCondition_near": 0,
+ "visibleDepth": true
+ }
+ }
+ },
+ "popup": [
+ { "field": "NAME", "name": "名称" },
+ { "type": "details", "callback": "showPopupDetails", "field": "图片", "className": "mars3d-popup-btn-custom" }
+ ],
+ "show": false,
+ "flyTo": true
+ },
+ {
+ "pid": 3030,
+ "type": "geojson",
+ "name": "体育设施点",
+ "url": "{dataServer}/file/geojson/hfty-point.json",
+ "symbol": {
+ "styleOptions": {
+ "image": "img/marker/mark-red.png",
+ "scale": 1,
+ "scaleByDistance": true,
+ "scaleByDistance_far": 20000,
+ "scaleByDistance_farValue": 0.5,
+ "scaleByDistance_near": 1000,
+ "scaleByDistance_nearValue": 1,
+ "verticalOrigin": 1,
+ "horizontalOrigin": 0,
+ "clampToGround": true,
+ "label": {
+ "text": "{项目名称}",
+ "font_size": 25,
+ "color": "#ffffff",
+ "outline": true,
+ "outlineColor": "#000000",
+ "pixelOffsetY": -25,
+ "scaleByDistance": true,
+ "scaleByDistance_far": 80000,
+ "scaleByDistance_farValue": 0.5,
+ "scaleByDistance_near": 1000,
+ "scaleByDistance_nearValue": 1,
+ "distanceDisplayCondition": true,
+ "distanceDisplayCondition_far": 80000,
+ "distanceDisplayCondition_near": 0
+ }
+ }
+ },
+ "popup": [
+ { "field": "项目名称", "name": "项目名称" },
+ { "field": "建设性质", "name": "建设性质" },
+ { "field": "设施级别", "name": "设施级别" },
+ { "field": "所属区县", "name": "所属区县" },
+ { "field": "建筑内容及", "name": "建筑内容" },
+ { "field": "新增用地(", "name": "新增用地" },
+ { "field": "开工", "name": "开工" },
+ { "field": "总投资(万", "name": "总投资" },
+ { "field": "资金来源", "name": "资金来源" },
+ { "field": "初步选址", "name": "初步选址" },
+ { "field": "设施类型", "name": "设施类型" },
+ { "field": "设施等级", "name": "设施等级" },
+ { "field": "所在区县", "name": "所在区县" },
+ { "field": "具体位置", "name": "具体位置" },
+ { "field": "建设内容(", "name": "建设内容" },
+ { "field": "用地面积(", "name": "用地面积", "format": "mars3d.MeasureUtil.formatArea" },
+ { "field": "设施规模(", "name": "设施规模" },
+ { "field": "举办者类型", "name": "举办者类型" },
+ { "field": "开工时间", "name": "开工时间" },
+ { "field": "总投资额(", "name": "总投资额", "unit": "亿元" },
+ { "field": "项目推进主", "name": "项目推进主体" },
+ { "field": "项目进度", "name": "项目进度" },
+ { "field": "项目来源", "name": "项目来源" },
+ { "field": "备注", "name": "备注" }
+ ],
+ "show": false,
+ "flyTo": true
+ },
+ { "id": 3070, "pid": 30, "name": "GeoServer WFS", "type": "group" },
+ {
+ "pid": 3070,
+ "type": "wfs",
+ "name": "建筑物面",
+ "url": "//server.mars3d.cn/geoserver/mars/ows",
+ "layer": "mars:hfjzw",
+ "parameters": { "maxFeatures": 500 },
+ "minimumLevel": 15,
+ "symbol": {
+ "type": "polygonP",
+ "styleOptions": { "color": "#00469c", "outline": false, "opacity": 1 }
+ },
+ "buildings": { "cloumn": "floor" },
+ "center": { "lat": 31.818396, "lng": 117.229083, "alt": 2554.4, "heading": 359.2, "pitch": -83.1 },
+ "popup": "名称:{NAME}
层数:{floor}"
+ },
+ {
+ "pid": 3070,
+ "name": "教育设施点",
+ "type": "wfs",
+ "url": "//server.mars3d.cn/geoserver/mars/ows",
+ "layer": "mars:hfjy",
+ "parameters": { "maxFeatures": 500 },
+ "minimumLevel": 13,
+ "symbol": {
+ "type": "billboardP",
+ "styleOptions": {
+ "image": "img/marker/mark-red.png",
+ "scaleByDistance": true,
+ "scaleByDistance_far": 20000,
+ "scaleByDistance_farValue": 0.6,
+ "scaleByDistance_near": 1000,
+ "scaleByDistance_nearValue": 1,
+ "clampToGround": true,
+ "label": {
+ "text": "{项目名称}",
+ "font_size": 15,
+ "color": "#ffffff",
+ "outline": true,
+ "outlineColor": "#000000",
+ "pixelOffsetY": -30,
+ "distanceDisplayCondition": true,
+ "distanceDisplayCondition_far": 2000,
+ "distanceDisplayCondition_near": 0
+ }
+ }
+ },
+ "center": { "lat": 31.812256, "lng": 117.229873, "alt": 4683.91, "heading": 357.4, "pitch": -65.4 },
+ "popup": "all"
+ },
+ { "id": 3010, "pid": 30, "name": "ArcGIS WFS", "type": "group" },
+ {
+ "pid": 3010,
+ "type": "arcgis_wfs",
+ "name": "兴趣点",
+ "url": "//server.mars3d.cn/arcgis/rest/services/mars/hefei/MapServer/1",
+ "where": " 1=1 ",
+ "minimumLevel": 15,
+ "center": { "lat": 31.818396, "lng": 117.229083, "alt": 2554.4, "heading": 359.2, "pitch": -83.1 },
+ "symbol": {
+ "type": "billboardP",
+ "styleOptions": {
+ "image": "img/marker/mark-blue.png",
+ "scaleByDistance": true,
+ "scaleByDistance_far": 20000,
+ "scaleByDistance_farValue": 0.6,
+ "scaleByDistance_near": 1000,
+ "scaleByDistance_nearValue": 1,
+ "clampToGround": true,
+ "label": {
+ "text": "{NAME}",
+ "font_size": 15,
+ "color": "#ffffff",
+ "outline": true,
+ "outlineColor": "#000000",
+ "pixelOffsetY": -30,
+ "distanceDisplayCondition": true,
+ "distanceDisplayCondition_far": 3000,
+ "distanceDisplayCondition_near": 0
+ }
+ },
+ "styleField": "address",
+ "styleFieldOptions": {
+ "AB03": { "image": "img/marker/mark-red.png" },
+ "A980": { "image": "img/marker/mark-blue.png" },
+ "A900": { "image": "img/marker/mark-green.png" }
+ }
+ },
+ "popup": "名称:{NAME}
地址:{address}",
+ "show": false
+ },
+ {
+ "pid": 3010,
+ "type": "arcgis_wfs",
+ "name": "道路",
+ "url": "//server.mars3d.cn/arcgis/rest/services/mars/hefei/MapServer/28",
+ "minimumLevel": 14,
+ "symbol": {
+ "type": "polylineP",
+ "styleOptions": { "color": "#3388ff", "width": 3, "clampToGround": true },
+ "styleField": "NAME",
+ "styleFieldOptions": {
+ "祁门路": { "color": "#8744c0", "width": 3 },
+ "东流路": { "color": "#f7ba2a", "width": 3 },
+ "翡翠路": { "color": "#20a0ff", "width": 3 },
+ "岳西路": { "color": "#50bfff", "width": 3 }
+ }
+ },
+ "popup": "名称:{NAME}",
+ "center": { "lat": 31.814176, "lng": 117.225362, "alt": 5105.3, "heading": 359.2, "pitch": -83.1 }
+ },
+ {
+ "pid": 3010,
+ "type": "arcgis_wfs",
+ "name": "建筑物面",
+ "url": "//server.mars3d.cn/arcgis/rest/services/mars/hefei/MapServer/37",
+ "minimumLevel": 15,
+ "symbol": { "styleOptions": { "color": "#0d3685", "outlineColor": "#0d3685", "opacity": 0.8 } },
+ "buildings": { "cloumn": "floor" },
+ "debuggerTileInfo": false,
+ "center": { "lat": 31.816951, "lng": 117.22898, "alt": 1916.7, "heading": 0.3, "pitch": -78.8 },
+ "popup": "名称:{NAME}
层数:{floor}"
+ },
+ { "id": 3060, "pid": 30, "name": "CZML数据", "type": "group" },
+ {
+ "id": 306010,
+ "pid": 3060,
+ "type": "czml",
+ "name": "汽车",
+ "url": "{dataServer}/file/czml/car.czml",
+ "center": { "lat": 40.894745, "lng": 121.920252, "alt": 904, "heading": 64, "pitch": -67 },
+ "onWidget": "control-clock",
+ "radio": true,
+ "flyTo": true
+ },
+ {
+ "id": 306011,
+ "pid": 3060,
+ "type": "czml",
+ "name": "卫星轨道",
+ "url": "{dataServer}/file/czml/satellite-simple.czml",
+ "popup": "all",
+ "onWidget": "control-clock",
+ "radio": true,
+ "flyTo": true
+ },
+ { "id": 3050, "pid": 30, "name": "KML数据", "type": "group" },
+ { "pid": 3050, "type": "kml", "name": "海上安全警告", "url": "{dataServer}/file/kml/NAVWARN.kmz", "popup": "all" },
+ {
+ "pid": 3050,
+ "type": "kml",
+ "name": "国境线",
+ "url": "{dataServer}/file/kml/countryboundary.kml",
+ "symbol": { "styleOptions": { "color": "#FED976", "width": 2 } }
+ },
+ {
+ "pid": 3050,
+ "type": "kml",
+ "name": "省界线",
+ "url": "{dataServer}/file/kml/province.kml",
+ "symbol": { "styleOptions": { "color": "#00FF00", "width": 2 } }
+ },
+ { "id": 20, "name": "三维模型", "type": "group" },
+ { "id": 2010, "pid": 20, "name": "gltf模型", "type": "group" },
+ {
+ "pid": 2010,
+ "type": "graphic",
+ "name": "风力发电机",
+ "data": [
+ {
+ "type": "modelP",
+ "position": [117.219071, 31.828783, 39.87],
+ "style": {
+ "url": "//data.mars3d.cn/gltf/mars/fengche.gltf",
+ "scale": 50,
+ "heading": -93
+ }
+ }
+ ],
+ "popup": "示例信息,这是一个风力发电机",
+ "center": { "lat": 31.821083, "lng": 117.21832, "alt": 832.64, "heading": 2.3, "pitch": -39.2 }
+ },
+ {
+ "pid": 2010,
+ "type": "graphic",
+ "name": "警车",
+ "data": [
+ {
+ "type": "modelP",
+ "position": [117.217458, 31.815349, 35.03],
+ "style": {
+ "url": "//data.mars3d.cn/gltf/mars/jingche/jingche.gltf",
+ "scale": 2,
+ "heading": -95,
+ "clampToGround": true
+ }
+ }
+ ],
+ "center": { "lat": 31.815363, "lng": 117.215958, "alt": 107.35, "heading": 90.7, "pitch": -26.1 }
+ },
+ { "id": 2040, "pid": 20, "name": "城市白模", "type": "group" },
+ {
+ "id": 204011,
+ "pid": 2040,
+ "type": "3dtiles",
+ "name": "合肥市区",
+ "url": "{dataServer}/3dtiles/jzw-hefei/tileset.json",
+ "maximumScreenSpaceError": 1,
+ "maximumMemoryUsage": 1024,
+ "marsJzwStyle": true,
+ "highlight": { "type": "click", "color": "#FFFF00" },
+ "popup": [
+ { "field": "objectid", "name": "编号" },
+ { "field": "name", "name": "名称" },
+ { "field": "height", "name": "楼高", "unit": "米" }
+ ],
+ "center": { "lat": 31.786281, "lng": 117.223716, "alt": 3718, "heading": 2, "pitch": -45 }
+ },
+ {
+ "id": 204012,
+ "pid": 2040,
+ "type": "3dtiles",
+ "name": "上海市区",
+ "url": "{dataServer}/3dtiles/jzw-shanghai/tileset.json",
+ "maximumScreenSpaceError": 4,
+ "maximumMemoryUsage": 1024,
+ "style": {
+ "color": {
+ "conditions": [
+ ["${floor} >= 200", "rgba(45, 0, 75, 0.5)"],
+ ["${floor} >= 100", "rgb(170, 162, 204)"],
+ ["${floor} >= 50", "rgb(224, 226, 238)"],
+ ["${floor} >= 25", "rgb(252, 230, 200)"],
+ ["${floor} >= 10", "rgb(248, 176, 87)"],
+ ["${floor} >= 5", "rgb(198, 106, 11)"],
+ ["true", "rgb(127, 59, 8)"]
+ ]
+ }
+ },
+ "highlight": { "type": "click", "color": "#FFFF00" },
+ "popup": [
+ { "field": "name", "name": "名称" },
+ { "field": "floor", "name": "楼层" }
+ ],
+ "center": { "lat": 31.257341, "lng": 121.466139, "alt": 2170.8, "heading": 122.2, "pitch": -31.8 }
+ },
+
+ { "id": 2050, "pid": 20, "name": "点云", "type": "group" },
+ {
+ "id": 202016,
+ "pid": 2050,
+ "type": "3dtiles",
+ "name": "高压线塔杆",
+ "url": "//data.mars3d.cn/3dtiles/pnts-ganta/tileset.json",
+ "maximumScreenSpaceError": 1,
+ "position": { "alt": 31 },
+ "style": {
+ "color": {
+ "conditions": [
+ ["(${Classification} >= 4) && (${Classification} < 5) ", "color('#DC143C')"],
+ ["(${Classification} >= 7) && (${Classification} < 8) ", "color('#7B68EE')"],
+ ["(${Classification} >= 16) && (${Classification} < 17) ", "color('#00CED1')"],
+ ["(${Classification} >= 17) && (${Classification} < 18) ", "color('#3CB371')"],
+ ["(${Classification} >= 18) && (${Classification} < 19) ", "color('#FFFF00')"],
+ ["(${Classification} >= 19) && (${Classification} < 20) ", "color('#FFA500')"],
+ ["(${Classification} >= 20) && (${Classification} < 21) ", "color('#FF6347')"]
+ ]
+ }
+ },
+ "hasOpacity": false,
+ "center": { "lat": 31.504746, "lng": 118.264278, "alt": 580, "heading": 29, "pitch": -49 }
+ },
+ { "id": 2060, "pid": 20, "name": "BIM模型", "type": "group" },
+ {
+ "id": 20601121,
+ "pid": 2060,
+ "type": "3dtiles",
+ "name": "大学教学楼",
+ "url": "{dataServer}/3dtiles/bim-daxue/tileset.json",
+ "position": { "lng": 117.251229, "lat": 31.844015, "alt": 31.2 },
+ "highlight": { "type": "click", "color": "#FFFF00" },
+ "popup": "all",
+ "scenetree": "scenetree.json",
+ "center": { "lat": 31.842516, "lng": 117.25107, "alt": 145, "heading": 8, "pitch": -39 }
+ },
+ {
+ "pid": 2060,
+ "type": "3dtiles",
+ "name": "轻轨地铁站",
+ "url": "{dataServer}/3dtiles/bim-ditiezhan/tileset.json",
+ "position": { "lng": 117.203994, "lat": 31.857999, "alt": 28.9 },
+ "rotation": { "z": 168.1 },
+ "highlight": { "type": "click", "color": "#00FF00" },
+ "popup": "all",
+ "scenetree": "scenetree.json",
+ "center": { "lat": 31.856125, "lng": 117.204513, "alt": 155, "heading": 350, "pitch": -31 }
+ },
+ {
+ "id": 206012,
+ "pid": 2060,
+ "type": "3dtiles",
+ "name": "桥梁",
+ "url": "{dataServer}/3dtiles/bim-qiaoliang/tileset.json",
+ "position": { "lng": 117.096906, "lat": 31.851564, "alt": 45 },
+ "rotation": { "z": 17.5 },
+ "maximumScreenSpaceError": 16,
+ "maximumMemoryUsage": 1024,
+ "skipLevelOfDetail": true,
+ "loadSiblings": true,
+ "cullRequestsWhileMoving": true,
+ "cullRequestsWhileMovingMultiplier": 10,
+ "preferLeaves": true,
+ "progressiveResolutionHeightFraction": 0.5,
+ "dynamicScreenSpaceError": true,
+ "preloadWhenHidden": true,
+ "center": { "lat": 31.849357, "lng": 117.099194, "alt": 306.2, "heading": 327.1, "pitch": -30.9 },
+ "scenetree": "scenetree.json",
+ "highlight": { "type": "click", "color": "#00FF00" },
+ "popup": "all"
+ },
+ { "id": 2020, "pid": 20, "name": "人工建模", "type": "group" },
+ {
+ "id": 202013,
+ "pid": 2020,
+ "type": "3dtiles",
+ "name": "地下管网",
+ "url": "{dataServer}/3dtiles/max-piping/tileset.json",
+ "position": { "lng": 117.215457, "lat": 31.843363, "alt": -3.6 },
+ "rotation": { "z": 336.7 },
+ "maximumScreenSpaceError": 2,
+ "maximumMemoryUsage": 1024,
+ "highlight": { "type": "click", "color": "#00FF00" },
+ "popup": "all",
+ "center": { "lat": 31.838821, "lng": 117.216402, "alt": 461, "heading": 0, "pitch": -46 },
+ "msg": "演示数据,地下数据拖动时会在地面漂移"
+ },
+ {
+ "id": 202012,
+ "pid": 2020,
+ "type": "3dtiles",
+ "name": "石化工厂",
+ "url": "{dataServer}/3dtiles/max-shihua/tileset.json",
+ "position": { "lng": 117.077158, "lat": 31.659116, "alt": 24.6 },
+ "maximumScreenSpaceError": 1,
+ "maximumMemoryUsage": 1024,
+ "highlight": { "type": "click", "color": "#00FF00" },
+ "popup": "all",
+ "scenetree": "scenetree.json",
+ "center": { "lat": 31.654916, "lng": 117.08278, "alt": 279, "heading": 316, "pitch": -29 }
+ },
+ {
+ "id": 202030,
+ "pid": 2020,
+ "name": "水利闸门",
+ "type": "group",
+ "center": { "lat": 29.794301, "lng": 121.47998, "alt": 262, "heading": 191, "pitch": -35 }
+ },
+ {
+ "pid": 202030,
+ "name": "闸门",
+ "type": "graphic",
+ "data": [
+ {
+ "type": "modelP",
+ "position": [121.479813, 29.791278, 16],
+ "style": {
+ "url": "//data.mars3d.cn/gltf/mars/zhamen.glb",
+ "heading": 105
+ }
+ }
+ ],
+ "center": { "lat": 29.791607, "lng": 121.479925, "alt": 27, "heading": 198, "pitch": -18 }
+ },
+ {
+ "id": 202011,
+ "pid": 202030,
+ "type": "3dtiles",
+ "name": "整体",
+ "url": "{dataServer}/3dtiles/max-fsdzm/tileset.json",
+ "position": { "alt": 15.2 },
+ "maximumScreenSpaceError": 1,
+ "maximumMemoryUsage": 1024,
+ "center": { "lat": 29.792675, "lng": 121.480207, "alt": 190.8, "heading": 196.1, "pitch": -49 }
+ },
+ { "id": 2030, "pid": 20, "name": "倾斜摄影", "type": "group" },
+ {
+ "id": 203014,
+ "pid": 2030,
+ "type": "3dtiles",
+ "name": "县城社区",
+ "url": "{dataServer}/3dtiles/qx-shequ/tileset.json",
+ "position": { "alt": 11.5 },
+ "maximumScreenSpaceError": 2,
+ "maximumMemoryUsage": 2048,
+ "dynamicScreenSpaceError": true,
+ "cullWithChildrenBounds": false,
+ "center": { "lat": 28.440864, "lng": 119.486477, "alt": 588.23, "heading": 268.6, "pitch": -37.8 },
+ "show": false,
+ "flyTo": false
+ },
+ {
+ "id": 203015,
+ "pid": 2030,
+ "name": "合肥天鹅湖",
+ "type": "3dtiles",
+ "url": "{dataServer}/3dtiles/qx-teh/tileset.json",
+ "position": { "lng": 117.218434, "lat": 31.81807, "alt": 163 },
+ "maximumScreenSpaceError": 16,
+ "maximumMemoryUsage": 1024,
+ "dynamicScreenSpaceError": true,
+ "cullWithChildrenBounds": false,
+ "skipLevelOfDetail": true,
+ "preferLeaves": true,
+ "center": { "lat": 31.795308, "lng": 117.21948, "alt": 1820, "heading": 0, "pitch": -39 }
+ },
+ {
+ "pid": 2030,
+ "type": "3dtiles",
+ "name": "大雁塔",
+ "url": "{dataServer}/3dtiles/qx-dyt/tileset.json",
+ "position": { "alt": -27 },
+ "maximumScreenSpaceError": 1,
+ "maximumMemoryUsage": 1024,
+ "center": { "lat": 34.215516, "lng": 108.960251, "alt": 834, "heading": 4, "pitch": -48 },
+ "flat": {
+ "enabled": true,
+ "editHeight": 420
+ },
+ "flyTo": false,
+ "show": false
+ },
+ {
+ "id": 203013,
+ "pid": 2030,
+ "type": "geojson",
+ "name": "文庙-单体化",
+ "url": " {dataServer}/file/geojson/dth-wm.json",
+ "symbol": {
+ "type": "polygonP",
+ "styleOptions": {
+ "color": "rgba(255, 255, 255, 0.01)",
+ "clampToGround": true,
+ "classification": true,
+ "buffer": 1,
+ "highlight": {
+ "color": "rgba(255,255,0,0.5)"
+ }
+ }
+ },
+ "popup": [
+ { "field": "name", "name": "房屋名称" },
+ { "field": "jznf", "name": "建造年份" },
+ { "field": "ssdw", "name": "所属单位" },
+ { "field": "remark", "name": "备注信息" }
+ ]
+ },
+ {
+ "id": 203012,
+ "pid": 2030,
+ "type": "3dtiles",
+ "name": "文庙",
+ "url": "{dataServer}/3dtiles/qx-simiao/tileset.json",
+ "position": { "alt": 80.6 },
+ "maximumScreenSpaceError": 2,
+ "maximumMemoryUsage": 2048,
+ "dynamicScreenSpaceError": true,
+ "cullWithChildrenBounds": false,
+ "skipLevelOfDetail": true,
+ "preferLeaves": true,
+ "center": { "lat": 33.589536, "lng": 119.032216, "alt": 145.08, "heading": 3.1, "pitch": -22.9 }
+ },
+ { "id": 99, "name": "数据图层", "type": "group" }
+ ]
+ }
+}
diff --git a/src/locales/lang/zh-CN/routes/demo.json b/src/locales/lang/zh-CN/routes/demo.json
index aec4378..ea80500 100644
--- a/src/locales/lang/zh-CN/routes/demo.json
+++ b/src/locales/lang/zh-CN/routes/demo.json
@@ -6,7 +6,8 @@
"charts": "图表",
"map": "地图",
"line": "折线图",
- "pie": "饼图"
+ "pie": "饼图",
+ "mars3d":"mars3d"
},
"comp": {
"comp": "组件",
diff --git a/src/main.ts b/src/main.ts
index 1c4c808..ed3e1ae 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,3 +1,11 @@
+/*
+ * @Author: 刘妍
+ * @Date: 2024-01-13 13:04:15
+ * @LastEditors: Do not edit
+ * @LastEditTime: 2024-01-16 14:25:41
+ * @FilePath: \费县天空地大屏正式代码e:\新架构\vue-vben-admin\src\main.ts
+ * @Description:
+ */
import 'uno.css';
import '@/design/index.less';
import '@/components/VxeTable/src/css/index.scss';
@@ -18,6 +26,9 @@ import { setupStore } from '@/store';
import App from './App.vue';
+import "mars3d-cesium/Build/Cesium/Widgets/widgets.css"
+import "mars3d/dist/mars3d.css"
+
async function bootstrap() {
const app = createApp(App);
diff --git a/src/mars/.editorconfig b/src/mars/.editorconfig
new file mode 100644
index 0000000..f6d9322
--- /dev/null
+++ b/src/mars/.editorconfig
@@ -0,0 +1,21 @@
+root = true #表示是最顶层的配置文件,发现设为true时,才会停止查找.editorconfig文件
+
+# 匹配全部文件
+[*]
+# 缩进风格,可选"space"、"tab"
+indent_style = space
+# 缩进的空格数
+indent_size = 2
+# 结尾换行符
+end_of_line = lf
+# 设置字符集
+charset = utf-8
+# 删除一行中的前后空格
+trim_trailing_whitespace = true
+# 在文件结尾插入新行
+insert_final_newline = true
+max_line_length = 150
+
+[*.md]
+# 删除一行中的前后空格
+trim_trailing_whitespace = false
diff --git a/src/mars/.eslintrc.js b/src/mars/.eslintrc.js
new file mode 100644
index 0000000..6c50f27
--- /dev/null
+++ b/src/mars/.eslintrc.js
@@ -0,0 +1,78 @@
+module.exports = {
+ root: true,
+ env: {
+ node: true
+ },
+ extends: ["plugin:vue/vue3-essential", "standard", "@vue/typescript/recommended"],
+ globals: {
+ defineProps: "readonly",
+ defineEmits: "readonly",
+ defineExpose: "readonly",
+ withDefaults: "readonly"
+ },
+ rules: {
+ "@typescript-eslint/no-explicit-any": "off", // ts:允许用any
+ "@typescript-eslint/no-useless-constructor": "error", // ts:不允许使用未定位类型自动转为any
+ "@typescript-eslint/no-var-requires": "off", // ts:是否允许使用var
+ "@typescript-eslint/no-non-null-assertion": "off", // ts:非空赋值
+ "@typescript-eslint/explicit-module-boundary-types": "off", // ts:是否需要显式定义函数将返回什么类型
+ "@typescript-eslint/ban-ts-comment": "off", // ts: 禁止ts注释
+ "@typescript-eslint/no-unused-vars": "off", // ts:允许定义未引用使用的变量
+ "vue/multi-word-component-names": ["error", { ignores: ["index", "App"] }], // vue:多词组件名称
+ "vue/comment-directive": ["off", { reportUnusedDisableDirectives: false }], // vue:允许在标签中写 HTML 注释。
+ "vue/no-deprecated-slot-attribute": "off", // 允许使用slot
+ "vue/valid-v-slot": "off",
+
+ camelcase: "off", // 强制驼峰命名规则
+ indent: "off", // 强制一致的缩进风格
+ eqeqeq: "error", // 是否使用 === 替代 ==
+ quotes: ["error", "double", { avoidEscape: true, allowTemplateLiterals: true }], // 使用双引号
+ curly: ["error", "all"], // 强制所有控制语句使用一致的括号风格 @fixable if 后面必须要有 {,除非是单行 if
+
+ "padded-blocks": "off", // 块内行首行尾是否空行
+ "global-require": "off", // require 必须在全局作用域下
+ "comma-dangle": "error", // 强制在对象和数组文字中一致地使用尾随逗号
+ "valid-jsdoc": "off", // 强制使用有效的 JSDoc 注释
+ "consistent-return": "off", // 要求 return 语句要么总是指定返回的值,要么不指定
+ "default-case": "off", // switch 语句强制 default 分支,也可添加 // no default 注释取消此次警告
+ "block-scoped-var": "error", // 将 var 定义的变量视为块作用域,禁止在块外使用
+ "guard-for-in": "off", // for in 内部必须有 hasOwnProperty
+ "constructor-super": "error", // constructor 中必须有 super
+ "dot-location": ["off", "property"], // @fixable 链式调用的时候,点号必须放在第二行开头处,禁止放在第一行结尾处
+ "comma-style": ["error", "last"], // 控制逗号在行尾出现还是在行首出现 (默认行尾)
+ "space-before-function-paren": ["off", "always"], // 函数定义时括号前的空格
+ "object-curly-newline": ["error", { multiline: true, consistent: true }], // @fixable 大括号内的首尾必须有换行
+ "computed-property-spacing": ["error", "never"], // "SwitchCase" (默认:0) 强制 switch 语句中的 case 子句的缩进水平
+
+ "no-debugger": "warn", // 是否允许debugger
+ "no-console": "off", // 不允许出现console语句
+ "no-var": "error", // @fixable 禁止使用 var
+ "no-trailing-spaces": "off", // 一行最后不允许有空格
+ "no-prototype-builtins": "off", // 是否允许使用Object.prototype
+ "no-template-curly-in-string": "off", // 关闭${xxx}检测
+ "no-mixed-spaces-and-tabs": "error", // 不允许混用tab和空格
+ "no-new": "error", // 禁止在非赋值或条件语句中使用 new 操作符
+ "no-new-wrappers": "error", // 禁止对 String,Number 和 Boolean 使用 new 操作符
+ "no-self-assign": "error", // 禁止自我赋值
+ "no-self-compare": "error", // 禁止自身比较
+ "no-case-declarations": "error", // switch 的 case 内有变量定义的时候,必须使用大括号将 case 内变成一个代码块
+ "no-extend-native": "error", // 禁止修改原生对象
+ "no-extra-bind": "error", // @fixable 禁止出现没必要的 bind
+ "no-extra-label": "error", // @fixable 禁止出现没必要的 label
+ "no-fallthrough": "error", // switch 的 case 内必须有 break, return 或 throw
+ "no-floating-decimal": "error", // @fixable 表示小数时,禁止省略 0,比如 .5
+ "no-global-assign": "error", // 禁止对全局变量赋值
+ "no-multi-str": "error", // 禁止使用 \ 来换行字符串
+ "no-const-assign": "error", // 禁止对使用 const 定义的常量重新赋值
+ "no-dupe-class-members": "error", // 禁止重复定义类
+ "no-duplicate-imports": "off", // 禁止重复 import 模块
+ "no-useless-constructor": "off", // 禁止出现没必要的 constructor,比如 constructor(value) { super(value) }
+ "no-useless-escape": "off", // 可以使用\转义
+ "no-callback-literal": "off", // 关闭eslint标准模式callback回调报错
+ "no-dupe-keys": "error", // 禁止对象字面量中出现重复的 key
+ "no-func-assign": "error", // 禁止对 function 声明重新赋值
+ "no-nested-ternary": "error", // 禁用嵌套的三元表达式
+ "no-multiple-empty-lines": ["error", { max: 3 }], // 空行最多不能超过两行
+ "new-cap": "off" // 关闭eslint fromDegrees方法报错
+ }
+}
diff --git a/src/mars/.prettierrc b/src/mars/.prettierrc
new file mode 100644
index 0000000..2204472
--- /dev/null
+++ b/src/mars/.prettierrc
@@ -0,0 +1,10 @@
+{
+ "useTabs": false,
+ "eslintIntegration": true,
+ "singleQuote": false,
+ "semi": false,
+ "trailingComma": "none",
+ "bracketSpacing": true,
+ "printWidth": 150,
+ "arrowParens": "always"
+}
diff --git a/src/mars/common/store/test.ts b/src/mars/common/store/test.ts
new file mode 100644
index 0000000..9984874
--- /dev/null
+++ b/src/mars/common/store/test.ts
@@ -0,0 +1,19 @@
+/**
+ * store 状态管理
+ * @copyright 火星科技 mars3d.cn
+ * @author 火星渣渣灰 2022-02-19
+ */
+import { Store, createStore } from "vuex"
+import { InjectionKey } from "vue"
+
+export interface Test {
+ count?: number
+}
+
+export const key: InjectionKey> = Symbol("test")
+
+export const store = createStore({
+ state: {
+ count: 0
+ }
+})
diff --git a/src/mars/common/store/widget.ts b/src/mars/common/store/widget.ts
new file mode 100644
index 0000000..79b4daf
--- /dev/null
+++ b/src/mars/common/store/widget.ts
@@ -0,0 +1,299 @@
+/**
+ * store 状态管理
+ * @copyright 火星科技 mars3d.cn
+ * @author 火星渣渣灰 2022-02-19
+ */
+import { Store, StoreOptions, createStore, useStore } from "vuex"
+import { InjectionKey, computed, nextTick, onUnmounted, inject } from "vue"
+import { v4 as uuidV4 } from "uuid"
+
+// 为 store state 声明类型
+export interface DefaultOption {
+ autoDisable?: boolean
+ disableOther?: boolean | string[]
+ group?: string // group相同的widget一定是互斥的
+ meta?: any // 额外参数 不会在每次关闭后清除
+}
+
+export interface Widget {
+ name: string // 唯一标识
+ key?: string // 作为vue diff 环节的key,用于控制组件重载
+ component?: any // widget关联的异步组件
+ autoDisable?: boolean // 是否能够被自动关闭
+ disableOther?: boolean | string[] // 是否自动关闭其他widget,或通过数组指定需要被关闭的widget
+ group?: string // group相同的widget一定是互斥的
+ visible?: boolean // 显示隐藏
+ data?: any // 额外传参 会在每次关闭后清除
+ meta?: any // 额外参数 不会在每次关闭后清除
+}
+
+export interface WidgetState {
+ widgets: Widget[] // widget具体配置
+ openAtStart: string[] // 默认加载的widget
+ defaultOption?: DefaultOption // 支持配置默认参数
+}
+
+export let key: InjectionKey> = Symbol("widget")
+
+/**
+ * 初始化状态
+ * @param {StoreOptions} options
+ * @return {Store} 公共状态
+ */
+export const injectState = (options: StoreOptions): Store => {
+ key = Symbol("widget")
+ if (typeof options.state === "function") {
+ options.state = (options.state() || {}) as WidgetState
+ }
+ const defaultOption = {
+ autoDisable: true,
+ disableOther: false,
+ ...options.state.defaultOption
+ }
+ const openAtStart = options.state?.openAtStart
+ if (!options) {
+ throw new Error("injectState 参数不能为空")
+ } else {
+ const widgets = options.state?.widgets.map((item) => {
+ return {
+ visible: openAtStart?.includes(item.name),
+ ...defaultOption,
+ ...item,
+ meta: {
+ ...defaultOption.meta,
+ ...item.meta
+ },
+ key: uuidV4()
+ }
+ })
+ options.state!.widgets = widgets!
+ }
+ return createStore({
+ state: {
+ widgets: [],
+ openAtStart: [],
+ ...options.state,
+ defaultOption
+ },
+ getters: {
+ ...options.getters
+ },
+ mutations: {
+ addAlive(state, value: string) {
+ if (!state.openAtStart.includes(value)) {
+ state.openAtStart.push(value)
+ }
+ },
+ ...options.mutations
+ },
+ actions: {
+ activate({ commit, state, dispatch }, widget: any) {
+ const value = typeof widget === "string" ? widget : widget.name
+
+ const pannel = state.widgets.find((item) => item.name === value)
+ if (!pannel) {
+ console.log("widget不存在", widget)
+ return
+ }
+
+ if (pannel.visible && widget.reload) {
+ // 重载组件
+ pannel.visible = false
+ pannel.key = uuidV4()
+ }
+
+ nextTick(() => {
+ if (typeof widget === "object" && widget !== null && widget.data) {
+ pannel.data = widget.data
+ }
+ pannel.visible = true
+ })
+
+ // 处理其他面板的显示隐藏
+ state.widgets.forEach((item) => {
+ if (pannel.name !== item.name) {
+ // 默认关闭同组
+ if (pannel.group && item.group === pannel.group) {
+ item.visible = false
+ }
+ // 关闭非同组需要关闭的面板
+ if (Array.isArray(pannel.disableOther)) {
+ pannel.disableOther.forEach((item: string) => {
+ dispatch("disable", item)
+ })
+ } else if (pannel.disableOther && item.autoDisable) {
+ item.visible = false
+ }
+ }
+ })
+
+ if (!state.openAtStart.includes(value)) {
+ commit("addAlive", value)
+ }
+ },
+ disable({ state }, widget: string) {
+ const value = widget
+ const pannel = state.widgets.find((item, i) => {
+ if (item.name === value) {
+ delete state.widgets[i].data
+ return true
+ } else {
+ return false
+ }
+ })
+ // 显示面板
+ if (pannel) {
+ pannel.visible = false
+ }
+ },
+ disableAll({ state }, hasAll: boolean) {
+ state.widgets.forEach((item: Widget) => {
+ if (item.visible && (hasAll || item.autoDisable)) {
+ item.visible = false
+ }
+ })
+ },
+ ...options.actions
+ }
+ })
+}
+
+type EventCb = (...args: any[]) => void
+class Event {
+ private _cache: Record = {}
+ // 绑定
+ on(type: string, callback: EventCb) {
+ const fns = (this._cache[type] = this._cache[type] || [])
+ if (fns.indexOf(callback) === -1) {
+ fns.push(callback)
+ }
+ return this
+ }
+
+ emit(type: string, ...args: any[]) {
+ const fns = this._cache[type]
+ if (Array.isArray(fns)) {
+ fns.forEach((fn) => {
+ fn(...args)
+ })
+ }
+ return this
+ }
+
+ off(type: string, callback: EventCb) {
+ const fns = this._cache[type]
+ if (Array.isArray(fns)) {
+ if (callback) {
+ const index = fns.indexOf(callback)
+ if (index !== -1) {
+ fns.splice(index, 1)
+ }
+ } else {
+ // 全部清空
+ fns.length = 0
+ }
+ }
+ return this
+ }
+}
+const widgetEvent = new Event()
+
+export function useWidgetStore() {
+ const store = useStore(key)
+ return store
+}
+
+export function useWidget() {
+ const store = useStore(key)
+
+ const getCurrentWidget = inject<() => string>("getCurrentWidget")
+ let currentWidget: any
+ if (getCurrentWidget) {
+ const widegtName = getCurrentWidget()
+
+ currentWidget = {
+ ...store.state.widgets.find((item: any) => item.name === widegtName),
+ onUpdate(callback: EventCb) {
+ if (currentWidget) {
+ widgetEvent.on(currentWidget.name, callback)
+ }
+ onUnmounted(() => {
+ if (currentWidget) {
+ widgetEvent.off(currentWidget.name, callback)
+ }
+ })
+ }
+ }
+ }
+ return {
+ currentWidget: currentWidget,
+ // 获取指定的widget
+ getWidget: (name: string) => {
+ const widget = store.state.widgets.find((item: any) => item.name === name)
+ if (!widget) {
+ return null
+ }
+
+ return {
+ ...widget,
+ onUpdate(callback: EventCb) {
+ if (widget) {
+ widgetEvent.on(widget.name, callback)
+ }
+ onUnmounted(() => {
+ widgetEvent.off(widget.name, callback)
+ })
+ }
+ }
+ },
+ setVisible(name: string, visible: boolean) {
+ const widget = store.state.widgets.find((item: any) => item.name === name)
+ widget.visible = visible
+ },
+ // 出发对应widget的onUpdate
+ updateWidget(name: string, ...args: any[]) {
+ widgetEvent.emit(name, ...args)
+ },
+ // 获取widget的当前激活状态
+ isActivate: (name: string) => {
+ const widget = store.state.widgets.find((item: any) => item.name === name)
+ return widget ? widget.visible : false
+ },
+ // 激活指定 widget模块
+ activate: (option: string | Widget | (string | Widget)[], reload = true) => {
+ let widgets: (string | Widget)[] = []
+ if (!Array.isArray(option)) {
+ widgets.push(option)
+ } else {
+ widgets = option
+ }
+ console.log("widgets", widgets)
+ widgets.forEach((widget) => {
+ let params: any
+ if (typeof widget === "string") {
+ params = { reload, name: widget }
+ } else {
+ params = { reload, ...widget }
+ }
+ store.dispatch("activate", params)
+ })
+ },
+ // 释放指定的widget
+ disable: (option: string | string[]) => {
+ let widgets: (string | Widget)[] = []
+ if (!Array.isArray(option)) {
+ widgets.push(option)
+ } else {
+ widgets = option
+ }
+
+ widgets.forEach((widget) => {
+ store.dispatch("disable", widget)
+ })
+ },
+ // 关闭释放所有widget ,hasAll传true值强制释放所有widget(默认autoDisable为false的widet不会释放)
+ disableAll: (hasAll = false) => {
+ store.dispatch("disableAll", hasAll)
+ }
+ }
+}
diff --git a/src/mars/common/uses/use-lifecycle.ts b/src/mars/common/uses/use-lifecycle.ts
new file mode 100644
index 0000000..f1c8841
--- /dev/null
+++ b/src/mars/common/uses/use-lifecycle.ts
@@ -0,0 +1,21 @@
+/**
+ * 组件中开启 map.ts 生命周期
+ * @copyright 火星科技 mars3d.cn
+ * @author 火星渣渣灰 2022-02-19
+ */
+import { inject, onBeforeMount, onBeforeUnmount } from "vue"
+
+export default function useLifecycle(mapWork: any): void {
+ const getMapInstance = inject("getMapInstance")
+ onBeforeMount(() => {
+ if (mapWork.onMounted) {
+ const map = getMapInstance()
+ mapWork.onMounted(map)
+ }
+ })
+ onBeforeUnmount(() => {
+ if (mapWork.onUnmounted) {
+ mapWork.onUnmounted()
+ }
+ })
+}
diff --git a/src/mars/components/mars-sample/fixedRoute-info.vue b/src/mars/components/mars-sample/fixedRoute-info.vue
new file mode 100644
index 0000000..ae463eb
--- /dev/null
+++ b/src/mars/components/mars-sample/fixedRoute-info.vue
@@ -0,0 +1,107 @@
+
+
+
+
+ 总长度:
+ {{ formState.td_alllength }}
+
+ 已漫游长度:
+ {{ formState.td_length }}
+
+ 总时长:
+ {{ formState.td_alltimes }}
+
+ 已漫游时间:
+ {{ formState.td_times }}
+
+ 经度:
+ {{ formState.td_jd }}
+
+ 纬度:
+ {{ formState.td_wd }}
+
+ 漫游高程:
+ {{ formState.td_gd }}
+
+
+
+
+
+
+
+
diff --git a/src/mars/components/mars-sample/graphic-layer-state.vue b/src/mars/components/mars-sample/graphic-layer-state.vue
new file mode 100644
index 0000000..1fac07d
--- /dev/null
+++ b/src/mars/components/mars-sample/graphic-layer-state.vue
@@ -0,0 +1,877 @@
+
+
+
+ 图层状态:
+ 显示
+
+ 透明度:
+
+
+
+
+ 定位
+
+
+
+
+
+
+ 图层交互:
+ 单击Popup
+ 移入Tooltip
+ 右键菜单
+
+
+
+
+
+ 数据维护:
+ {{ props.drawLabel1 }}
+ {{ props.drawLabel2 }}
+ 取消绘制
+
+ 是否编辑
+
+ 显示列表
+
+
+
+
+
+ 数据测试:
+ 条
+ 生成
+
+
+ 清除
+
+
+
+
+
+
+ 数据导出:
+
+
+
+
+ 打开
+
+
+
+
+
+ 导出GeoJSON
+
+
+ 导出构造JSON
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ record.name }}
+
+
+
+
+
+
+
+
+
diff --git a/src/mars/components/mars-sample/layer-state.vue b/src/mars/components/mars-sample/layer-state.vue
new file mode 100644
index 0000000..3936079
--- /dev/null
+++ b/src/mars/components/mars-sample/layer-state.vue
@@ -0,0 +1,371 @@
+
+
+ {{ props.label }}
+ 显示
+ Popup
+ Tooltip
+ 右键菜单
+
+
+
+
+
diff --git a/src/mars/components/mars-sample/location-to.vue b/src/mars/components/mars-sample/location-to.vue
new file mode 100644
index 0000000..15d7c98
--- /dev/null
+++ b/src/mars/components/mars-sample/location-to.vue
@@ -0,0 +1,60 @@
+
+
+
+ 定位至山区
+ 定位至模型
+
+
+
+
+
+
diff --git a/src/mars/components/mars-sample/tile-layer-state.vue b/src/mars/components/mars-sample/tile-layer-state.vue
new file mode 100644
index 0000000..5a9b368
--- /dev/null
+++ b/src/mars/components/mars-sample/tile-layer-state.vue
@@ -0,0 +1,438 @@
+
+
+
+ 添加图层
+ 移除图层
+
+ 显示列表
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ formState.layerName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 图层交互:
+ 单击Popup
+ 单击高亮
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mars/components/mars-ui/assets/images/border-image-base.png b/src/mars/components/mars-ui/assets/images/border-image-base.png
new file mode 100644
index 0000000000000000000000000000000000000000..22787a2f58d4d89a5fbde410ed1d8cc9abecffa8
GIT binary patch
literal 836
zcmeAS@N?(olHy`uVBq!ia0vp^zk%4DgAGU?tTJ2yq!^2X+?^QKos)UVz`*p+)5S5Q
zBJS<={oYp!WsVo_S9?^LnOO9Nc{!7CmOxgn*!C5wG0Mwd{LkQyS`!)7W!8BtOtA$h
zC#bdSjM3)FM*4ae-WmOG_`OeVo!=LNr6Z#DnVf8+H2pZm6k1M3dtefXV}-xDkOQTpye0gdSn
z+CNTxdh9Q||K@4ai&9K1w^)z7ljCUN=&*gV@T`hLnYn|4i^Cg5{#-T2jk_6{6q%Cv
zD>IBaJMQuda0m)ipKzY->F_46!J(t!hO^u)AEu;oW)>%wBXXZEqzMV^mR1l@QusEZ
z-E4Bhjk^qu0*o8mZMMv0Ir5He`<=I!oi@#2In3=Nj-u66w+P9>mvYV!a9
literal 0
HcmV?d00001
diff --git a/src/mars/components/mars-ui/assets/images/login/login-bg-color.png b/src/mars/components/mars-ui/assets/images/login/login-bg-color.png
new file mode 100644
index 0000000000000000000000000000000000000000..de5cd9590d69ee053e261c1b34f6f9eabe7c19d9
GIT binary patch
literal 595517
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%0DA6gYMC*QZhLno!vV8$lc!L0@b)Th4YEih
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