Browse Source

第一次提交

Version1.0
YF-yuan 3 years ago
parent
commit
c4cd18edaf
30 changed files with 14876 additions and 0 deletions
  1. +5
    -0
      babel.config.js
  2. +13362
    -0
      package-lock.json
  3. +60
    -0
      package.json
  4. BIN
      public/favicon.ico
  5. +17
    -0
      public/index.html
  6. +29
    -0
      src/App.vue
  7. BIN
      src/assets/img/gisdemo/button-h.png
  8. BIN
      src/assets/img/gisdemo/button.png
  9. BIN
      src/assets/img/gisdemo/color.jpg
  10. BIN
      src/assets/img/gisdemo/head-date.png
  11. BIN
      src/assets/img/gisdemo/nav.png
  12. BIN
      src/assets/img/gisdemo/outlet.png
  13. BIN
      src/assets/img/gisdemo/point.png
  14. BIN
      src/assets/img/gisdemo/popup.png
  15. BIN
      src/assets/img/gisdemo/quality.png
  16. BIN
      src/assets/img/gisdemo/river-h.png
  17. BIN
      src/assets/img/gisdemo/river.png
  18. BIN
      src/assets/img/gisdemo/up.png
  19. BIN
      src/assets/logo.png
  20. +60
    -0
      src/components/HelloWorld.vue
  21. +12
    -0
      src/main.js
  22. +21
    -0
      src/router/index.js
  23. +15
    -0
      src/store/index.js
  24. +8
    -0
      src/styles/global.scss
  25. +976
    -0
      src/views/Home.vue
  26. +124
    -0
      src/views/leftCompoents/landUse.vue
  27. +15
    -0
      src/views/leftCompoents/outletQulity.vue
  28. +88
    -0
      src/views/leftCompoents/pointQulity.vue
  29. +68
    -0
      src/views/leftCompoents/popupComponents.vue
  30. +16
    -0
      vue.config.js

+ 5
- 0
babel.config.js View File

@@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

+ 13362
- 0
package-lock.json
File diff suppressed because it is too large
View File


+ 60
- 0
package.json View File

@@ -0,0 +1,60 @@
{
"name": "app",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"@antv/g2": "^4.1.3",
"@antv/g2plot": "^2.3.2",
"axios": "^0.21.0",
"core-js": "^3.6.5",
"element-ui": "^2.14.1",
"esri-loader": "^2.16.0",
"insert-css": "^2.0.0",
"js-cookie": "^2.2.1",
"jsonp": "^0.2.1",
"less-loader": "^7.1.0",
"normalize.css": "^8.0.1",
"ol": "^6.4.3",
"proj4": "^2.6.3",
"vue": "^2.6.11",
"vue-router": "^3.2.0",
"vuex": "^3.4.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-router": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"node-sass": "^4.12.0",
"sass-loader": "^8.0.2",
"vue-template-compiler": "^2.6.11"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}

BIN
public/favicon.ico View File

Before After

+ 17
- 0
public/index.html View File

@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

+ 29
- 0
src/App.vue View File

@@ -0,0 +1,29 @@
<template>
<div id="app">
<router-view/>
</div>
</template>

<style lang="scss">
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
height:100%;
}

#nav {
padding: 30px;

a {
font-weight: bold;
color: #2c3e50;

&.router-link-exact-active {
color: #42b983;
}
}
}
</style>

BIN
src/assets/img/gisdemo/button-h.png View File

Before After
Width: 317  |  Height: 94  |  Size: 9.9KB

BIN
src/assets/img/gisdemo/button.png View File

Before After
Width: 291  |  Height: 67  |  Size: 3.9KB

BIN
src/assets/img/gisdemo/color.jpg View File

Before After
Width: 25  |  Height: 207  |  Size: 4.2KB

BIN
src/assets/img/gisdemo/head-date.png View File

Before After
Width: 266  |  Height: 94  |  Size: 7.4KB

BIN
src/assets/img/gisdemo/nav.png View File

Before After
Width: 3847  |  Height: 217  |  Size: 177KB

BIN
src/assets/img/gisdemo/outlet.png View File

Before After
Width: 34  |  Height: 27  |  Size: 701B

BIN
src/assets/img/gisdemo/point.png View File

Before After
Width: 19  |  Height: 18  |  Size: 751B

BIN
src/assets/img/gisdemo/popup.png View File

Before After
Width: 422  |  Height: 319  |  Size: 12KB

BIN
src/assets/img/gisdemo/quality.png View File

Before After
Width: 132  |  Height: 27  |  Size: 2.7KB

BIN
src/assets/img/gisdemo/river-h.png View File

Before After
Width: 219  |  Height: 72  |  Size: 10KB

BIN
src/assets/img/gisdemo/river.png View File

Before After
Width: 200  |  Height: 53  |  Size: 1.9KB

BIN
src/assets/img/gisdemo/up.png View File

Before After
Width: 14  |  Height: 17  |  Size: 436B

BIN
src/assets/logo.png View File

Before After
Width: 200  |  Height: 200  |  Size: 6.7KB

+ 60
- 0
src/components/HelloWorld.vue View File

@@ -0,0 +1,60 @@
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br>
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-vuex" target="_blank" rel="noopener">vuex</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
</ul>
<h3>Essential Links</h3>
<ul>
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
</ul>
<h3>Ecosystem</h3>
<ul>
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
</ul>
</div>
</template>

<script>
export default {
name: 'HelloWorld',
props: {
msg: String
}
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss">
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

+ 12
- 0
src/main.js View File

@@ -0,0 +1,12 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import "@/styles/global.scss"
Vue.config.productionTip = false

new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')

+ 21
- 0
src/router/index.js View File

@@ -0,0 +1,21 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'

Vue.use(VueRouter)

const routes = [
{
path: '/',
name: 'Home',
component: Home
}
]

const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})

export default router

+ 15
- 0
src/store/index.js View File

@@ -0,0 +1,15 @@
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
state: {
},
mutations: {
},
actions: {
},
modules: {
}
})

+ 8
- 0
src/styles/global.scss View File

@@ -0,0 +1,8 @@
@import "/node_modules/normalize.css/normalize.css";
*{
padding:0;
margin:0;
}
html,body{
height:100%;
}

+ 976
- 0
src/views/Home.vue View File

@@ -0,0 +1,976 @@
<template>
<div class="home" style="position: relative">
<!-- nav -->
<div class="nav"></div>
<!-- 地图 -->
<div id="map"></div>
<!-- 占地图例信息 -->
<ul id="landmark" v-for="(item, index) in landColorList">
<div class="landItem"></div>
</ul>
<!-- 左侧菜单 -->
<div id="leftSide">
<!-- 大标题 -->
<div class="mainTitle"></div>
<!-- 统计图表 -->
<div class="charts">
<!-- 采样点柱状图 -->
<div class="pointContainer" v-if="ischeckRef == 'point'">
<div class="pointBtnlist">
<div
@click="changeParams('cod', currentRiver)"
class="pointbtn"
:class="{ btnActive: isParams == 'cod' }"
>
COD
</div>
<div
@click="changeParams('tn', currentRiver)"
class="pointbtn"
:class="{ btnActive: isParams == 'tn' }"
>
TN
</div>
<div
@click="changeParams('nh4_n', currentRiver)"
class="pointbtn"
:class="{ btnActive: isParams == 'nh4_n' }"
>
NH4_N
</div>
<div
@click="changeParams('tp', currentRiver)"
class="pointbtn"
:class="{ btnActive: isParams == 'tp' }"
>
TP
</div>
</div>
<point-qulity :dataList="dataList" id="pointQulity"></point-qulity>
</div>
<!-- 土地利用环状图 -->
<land-use
:dataList="landUseList"
id="landUse"
v-if="ischeckRef == 'landuse'"
></land-use>
<!-- 排口折线图 -->
</div>
<!-- 排口、水质、土地利用 -->
<div class="reference">
<div
class="chooseRef"
@click="chooseRef('outlet')"
:class="{ refActive: refrence == 'outlet' }"
>
排口
<i class="outletimg"></i>
</div>
<div
class="chooseRef"
@click="chooseRef('point')"
:class="{ refActive: refrence == 'point' }"
>
采样点水质
<i class="pointimg"></i>
</div>
<div
class="chooseRef"
@click="chooseRef('landuse')"
:class="{ refActive: refrence == 'landuse' }"
>
土地利用
</div>
</div>
</div>

<!-- 弹出框 -->
<div class="showPopup" ref="popup">
<popup-compoents :dataList="popupData"></popup-compoents>
</div>

<!-- 右侧 -->
<div id="rightSide">
<!-- 实验河道切换 -->
<div id="selectRiver">
<div class="titleTxt">河道切换</div>
<div class="control" v-for="(item, index) in riverList" :key="index">
<div
class="riverItem"
@click="selectRiver(item.id, index)"
:class="{ riverActive: currentRiver == item.id }"
>
{{ item.name }}
</div>
</div>
</div>

<!-- 水质参数反演 -->
<div id="lists">
<div class="titleTxt">
<span>{{ fourData.name }}</span>
水质检测参数
</div>
<div class="control">
<div
v-for="(item, index) in fourData.item"
:key="index"
@click="selectLayers(item.value,index)"
:class="{paramsActive:index==currentParams}"
>
{{ item.type }}
</div>
</div>
</div>

<!-- 色带 -->
<div id="colorTab">
<div class="color"></div>
<div class="datacolor">
<span>{{ colorHL&&colorHL.value.high }}</span>
<span>{{ colorHL&&colorHL.value.low }}</span>
</div>
<div class="colorPoint">
<span>{{colorHL.type}}</span>
</div>
</div>

<!-- 地图切换 -->
<div id="changeMap">
<p class="titleTxt">地图切换</p>
<div class="control">
<div class="mapItem">
<label for="osm">OSM</label>
<input type="checkbox" id="osm" :checked="isChecked == 'osm'" />
</div>
<div class="mapItem">
<label for="google">google</label>
<input
type="checkbox"
id="google"
:checked="isChecked == 'google'"
/>
</div>
<div class="mapItem">
<label for="TDmap">TDmap</label>
<input type="checkbox" id="TDmap" :checked="isChecked == 'TDmap'" />
</div>
</div>
</div>
</div>
</div>
</template>

<script>
import pointQulity from "./leftCompoents/pointQulity";
import landUse from "./leftCompoents/landUse";
import popupCompoents from "./leftCompoents/popupComponents";
import "ol/ol.css";
import { Map as OMap, View } from "ol";
import {
OSM,
ImageArcGISRest,
XYZ,
TileArcGISRest,
Vector as VectorSource,
ImageWMS,
TileWMS,
} from "ol/source";
import {
Tile as TileLayer,
Image as ImageLayer,
Vector as VectorLayer,
} from "ol/layer";
import {
transform,
get as getProjection,
getTransform,
addProjection,
addCoordinateTransforms,
} from "ol/proj";
import TileGrid from "ol/tilegrid/TileGrid";
import GeoJSON from "ol/format/GeoJSON";
import { Fill, Stroke, Style } from "ol/style";
import jsonp from "jsonp";
import WMSCapabilities from "ol/format/WMSCapabilities";
import axios from "axios";
// 弹出框
import { Select } from "ol/interaction";
import Overlay from "ol/Overlay";
import { Point } from "ol/geom";
// 重新投影
import { applyTransform } from "ol/extent";
import proj4 from "proj4";
import proj from "ol/proj";
import { Projection } from "ol/proj";
import * as control from "ol/control";
import { register } from "ol/proj/proj4";
import LandUse from "./leftCompoents/landUse.vue";
import WMSGetFeatureInfo from "ol/format/WMSGetFeatureInfo";
axios.defaults.baseURL=process.env.VUE_APP_BASE_URL;
export default {
name: "gisdemo-index",
data() {
return {
map: null,
view: null,
num: 0,
source: null,
sourceDong4: null,
river: "river2",
landColorList: [],
landColor: null,
center: [116.632997, 30.113954],
zoom: 12,
ischeckRef: "point",
regions: [],
// 色带取值
oneColor: [],
twoColor: [],
threeColor: [],
colorList: {},
colorHL: {
type:'东风河_COD',
value: {
high: 9,
low: 7
}
},
dataList: [],// 采样点数据
landUseList: [],//土地利用占比数据
landuseAll:{},// 三条河土地占比数据
isChecked: "google",
// 弹出框数据
popupData: {},
isParams: "cod",
currentRiver: 5,
// 所有采样点数据
allPointdata: [],
//
currentParams: 0,
dotPlace: null,
refrence: "point",
isPoint: false,
fourData: {
id: 5,
name: "东风河",
item: [
{ type: "cod", value: 6 },
{ type: "tn", value: 7 },
{ type: "tp", value: 8 },
{ type: "nh4_n", value: 9 },
],
},
riverList: [
{
id: 0,
name: "解溪河",
item: [
{ type: "cod", value: 1 },
{ type: "tn", value: 2 },
{ type: "tp", value: 3 },
{ type: "nh4_n", value: 4 },
],
},
{
id: 5,
name: "东风河",
item: [
{ type: "cod", value: 6 },
{ type: "tn", value: 7 },
{ type: "tp", value: 8 },
{ type: "nh4_n", value: 9 },
],
},
{
id: 10,
name: "秦淮新河",
item: [
{ type: "cod", value: 11 },
{ type: "tn", value: 12 },
{ type: "tp", value: 13 },
{ type: "nh4_n", value: 14 },
],
},
],
};
},
components: { pointQulity, landUse, popupCompoents },
created() {
// 采样点数据
let vectorDot = new VectorSource({
projection: "EGSP:3857",
});
let paramVaules = {};
axios
.get(
"/api" +
"?service=WFS&version=1.0.0&request=GetFeature&typeName=demo%3Asample_all&maxFeatures=50"
)
.then((res) => {
let features = new WMSGetFeatureInfo().readFeatures(res.data);
features.forEach((feature) => {
let obj = feature.getProperties();
if (paramVaules[obj["river"]]) {
paramVaules[obj["river"]].cod.push({
value: obj.cod,
key: paramVaules[obj["river"]].cod.length,
});
paramVaules[obj["river"]].tp.push({
value: obj.tp,
key: paramVaules[obj["river"]].tp.length,
});
paramVaules[obj["river"]].tn.push({
value: obj.tn,
key: paramVaules[obj["river"]].tn.length,
});
paramVaules[obj["river"]]["nh4_n"].push({
value: obj["nh4_n"],
key: paramVaules[obj["river"]]["nh4_n"].length,
});
} else {
paramVaules[obj["river"]] = {};
paramVaules[obj["river"]].cod = [];
paramVaules[obj["river"]].tp = [];
paramVaules[obj["river"]].tp = [];
paramVaules[obj["river"]].tn = [];
paramVaules[obj["river"]]["nh4_n"] = [];
}
});
vectorDot.addFeatures(features);
for (var key in paramVaules) {
this.allPointdata.push(paramVaules[key]);
}
this.dataList = this.allPointdata[0].cod;
});
this.dotPlace = new VectorLayer({
source: vectorDot,
});
// color色带数据
let regions = [];
axios
.get(
"http://121.4.38.11:6080/arcgis/rest/services/demo/result_rasters/MapServer/legend?f=pjson"
)
.then((res) => {
let layers = res.data.layers;
        layers.forEach((layer) => {
          let region = { high: 0, low: 0 };
          let obj={type:layer.layerName,value:region}
          layer.legend.forEach((label) => {
            let stop = label.label;
            let arr = stop.split(":");
            if (arr.length > 1) {
              arr[1] = parseFloat(arr[1]);
              if (region.high > arr[1]) {
                region.low = arr[1];
              } else {
                region.high = arr[1];
              }
            }
          });
          regions.push(obj);
        });
this.region = regions
// 分割每条河的色带值
this.oneColor = regions.splice(0,4)
this.twoColor = regions.splice(0,4)
this.threeColor = regions.splice(0,4)
this.colorList = this.twoColor[0]
});
},
mounted() {
// 颜色
// 土地占有面积
this.landColor = [
      ["居民小区", "blue"],
      ["城市绿化用地", "pink"],
      ["道路", "green"],
      ["河道边坡生态岸线", "skyblue"],
      ["商服用地", "red"],
      ["建筑工地", "rgb(168, 112, 0)"],
      ['建设用地',"green"],
      ["生态绿化用地","red"],
      ["生态护岸","black"],
      ["农田","yellow"],
      ["草地","greed"],
      ["灌木林地","pink"],
      ["交通用地","black"],
      ["居民点","skyblue"],
      ["堆料场","yellow"],
      ["工矿企业","red"],
      ["未利用地","green"],
      ["水域","blue"],
      ["教育用地","green"],
      ["居民地","greed"],
      ["拆迁未利用地",'greed'],
      ["堆土","yellow"],
    ];
    this.landColorList = this.landColor;

    // 土地占有面积
    let styleFunction = this.landColor.map((item) => {
      let style = new Style({
        fill: new Fill({
          color: item[1],
        }),
      });
      return [item[0], style];
    });
    styleFunction = new Map(styleFunction);
    this.landColor = new Map(this.landColor);
    let landData = {};
    let vector = new VectorSource({});
    axios
      .get(
        "/api" +
          "?service=WFS&version=1.0.0&request=GetFeature&typeName=demo%3Alanduse_all"
      )
      .then((res) => {
        let features = new WMSGetFeatureInfo().readFeatures(res.data);
        features.forEach((feature) => {
          vector.addFeatures(features);
          let obj = feature.getProperties();
          obj.color = landColor.get(obj.lc);
          if (landData[obj.objectid]) {
            landData[obj.objectid].push(obj);
          } else {
            landData[obj.objectid] = [];
          }
        });
        // 土地占比数据
        this.landuseAll= landData;
this.landUseList = this.landuseAll[0] // 设置土地占比初始值
      });

    let place = new VectorLayer({
      source: vector,
      style: (feature) => {
        let lc = feature.getProperties().lc;
        return styleFunction.get(lc);
      },
    });

// 加载切片服务
// 东风切片(3条)
let resolutionsDong = [
52.91677250021167,
26.458386250105836,
13.229193125052918,
6.614596562526459,
3.9687579375158752,
2.6458386250105836,
1.3229193125052918,
0.7937515875031751,
0.26458386250105836,
0.13229193125052918,
0.06614596562526459,
];
let originDong = [-2.00377e7, 3.02411e7];
let extentDong = [
1.3208182632841771e7,
3745046.606619288,
1.3236917029063372e7,
3763312.538603185,
];
let tileGridDong = new TileGrid({
tileSize: 128,
resolutions: resolutionsDong,
origin: originDong,
extent: extentDong,
});
let sourceDong = new XYZ({
crossOrigin: "Anonymous",
tileUrlFunction: function (coordinate) {
return (
"http://121.4.38.11:6080/arcgis/rest/services/demo/photo/MapServer/tile/" +
coordinate[0] +
"/" +
coordinate[2] +
"/" +
coordinate[1]
);
},
tileGrid: tileGridDong,
});
let tileDong1 = new TileLayer({
// opacity: 0.8,
minZoom: 15,
source: sourceDong,
});

// 切换图层、加载栅格图层

// 东风4参数
this.sourceDong4 = new ImageArcGISRest({
// params: { layers: "show:0" },
ratio: 1,
url:
"http://121.4.38.11:6080/arcgis/rest/services/demo/result_rasters/MapServer",
});
let tileDong = new ImageLayer({
opacity: 0.8,
source: this.sourceDong4,
});

// 底图
let google = new TileLayer({
projection: "EPSG:4326",
title: "谷歌地图服务",
source: new XYZ({
url: "http://mt1.google.cn/vt/lyrs=s&x={x}&y={y}&z={z}",
}),
visible: true,
});
let osm = new TileLayer({
source: new OSM(),
opacity: 0.5,
visible: false,
});
// 天地图
let sourceTD = new XYZ({
url:
"http://t3.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=f82bb2fd8115c7fb576a8b2fcf738523",
// projection: 'EPSG:4326',
});
let TDlayer = new TileLayer({
source: sourceTD,
visible: false,
minZoom: 8,
maxZoom: 18,
});

this.view = new View({
minZoom: 11,
maxZoom: 19,
zoom: 17,
center: transform([118.803623, 31.998328], "EPSG:4326", "EPSG:3857"),
});
this.map = new OMap({
controls: control
.defaults({ attribution: false, zoom: false, rotate: false })
.extend([]),
logo: "false",
target: "map",
layers: [
osm,
google,
TDlayer,
// tile1,
place,
tileDong1,
tileDong, // 四参数
this.dotPlace, //采样点
],
view: this.view,
});

let changeMap = document.getElementById("changeMap");
changeMap.addEventListener("click", (event) => {
if (event.target.checked) {
switch (event.target.id) {
case "osm":
this.isChecked = "osm";
this.map.getLayers().item(0).setVisible(true);
this.map.getLayers().item(1).setVisible(false);
this.map.getLayers().item(2).setVisible(false);
break;
case "google":
this.isChecked = "google";
this.map.getLayers().item(0).setVisible(false);
this.map.getLayers().item(1).setVisible(true);
this.map.getLayers().item(2).setVisible(false);
break;
case "TDmap":
this.isChecked = "TDmap";
this.map.getLayers().item(0).setVisible(false);
this.map.getLayers().item(1).setVisible(false);
this.map.getLayers().item(2).setVisible(true);
break;
default:
break;
}
} else {
switch (event.target.id) {
case "osm":
this.isChecked = "google";
this.map.getLayers().item(0).setVisible(false);
this.map.getLayers().item(1).setVisible(true);
this.map.getLayers().item(2).setVisible(false);
break;
case "google":
this.isChecked = "google";
this.map.getLayers().item(1).setVisible(true);
this.map.getLayers().item(0).setVisible(false);
this.map.getLayers().item(2).setVisible(false);
break;
case "TDmap":
this.isChecked = "google";
this.map.getLayers().item(2).setVisible(false);
this.map.getLayers().item(1).setVisible(true);
this.map.getLayers().item(0).setVisible(false);
break;
default:
break;
}
}
});
// 弹出框
let overlay = new Overlay({
element: this.$refs.popup,
autoPan: true,
positioning: "bottom-center",
});
let select = new Select();
this.map.addInteraction(select);
let selectedFeatures = select.getFeatures();
select.on("select", (e) => {
if (e.selected.length > 0) {
let properties = e.selected[0].getProperties();

if (properties.geom instanceof Point) {
this.popupData = properties
let coordinate = e.mapBrowserEvent.coordinate;
overlay.setPosition(coordinate);
overlay.setOffset([140,-10])
this.map.addOverlay(overlay);
}else{
this.map.removeOverlay(overlay);
}
} else {
this.map.removeOverlay(overlay);
}
});
},
methods: {
chooseRef(value) {
this.ischeckRef = value;
this.refrence = value;
this.dataList = this.allPointdata[0].cod;
},
selectLayers(value,index) {
this.sourceDong4.updateParams({ layers: "show:" + value });
this.colorHL = this.colorList[index];
this.currentParams = index
},
selectRiver(value, index) {
// 初始化this.colorList 东风河
this.colorHL = {}
console.log(this.colorList);
this.landUseList = this.landuseAll[index+1]
this.currentRiver = value;
this.sourceDong4.updateParams({ layers: "show:" + value });
this.fourData = this.riverList[index];
if(index == 0) {
this.colorList = this.oneColor
}
if(index == 1) {
this.colorList = this.twoColor
}
if(index == 2) {
this.colorList = this.threeColor
}
if (value == 0) {
this.river = "river1";
this.view.animate({zoom:12},{center:transform([118.89544, 31.884104], "EPSG:4326", "EPSG:3857")},{zoom:15})
}
if (value == 5) {
this.river = "river2";
this.view.animate({zoom:12},{center:transform([118.803623, 31.998328], "EPSG:4326", "EPSG:3857")},{zoom:17})
}
if (value == 10) {
this.river = "river3";
this.view.animate({zoom:12},{center:transform([118.668429, 31.965454], "EPSG:4326", "EPSG:3857")},{zoom:15})
}
},
setProjection(code, name, proj4def, bbox) {
var newProjCode = "EPSG:" + code;
proj4.defs(newProjCode, proj4def);
register(proj4);
var newProj = getProjection(newProjCode);
var fromLonLat = getTransform("EPSG:4326", newProj);

var worldExtent = [bbox[1], bbox[2], bbox[3], bbox[0]];
newProj.setWorldExtent(worldExtent);
if (bbox[1] > bbox[3]) {
worldExtent = [bbox[1], bbox[2], bbox[3] + 360, bbox[0]];
}
var extent = applyTransform(worldExtent, fromLonLat, undefined, 8);
newProj.setExtent(extent);
addProjection(newProj);
addCoordinateTransforms(
"EPSG:4326",
"EPSG:32650",
function (coordinate) {
return proj4("EPSG:4326", "EPSG:32650", coordinate);
},
function (coordinate) {
return proj4("EPSG:32650", "EPSG:4326", coordinate);
}
);
},
// 切换参数
changeParams(value, currentRiver) {
this.isParams = value;
this.dataList = this.allPointdata[currentRiver][value];
},
},
};
</script>

<style scoped>
html,
body {
height: 100%;
margin: 0;
padding: 0;
box-sizing: border-box;
}
.home,
#map {
height: 100%;
position: relative;
}
.nav {
z-index: 99;
width: 100%;
height: 70px;
background-image: url("../assets/img/gisdemo/nav.png");
background-size: cover;
position: fixed;
top: 0px;
}
#leftSide {
width: 320px;
height: 90%;
background-color: #333333c5;
position: absolute;
top: 70px;
left: 0px;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
.mainTitle {
width: 120px;
height: 24px;
margin-top: 10px;
background-image: url("../assets/img/gisdemo/quality.png");
background-size: cover;
}
/* 统计图表 */
.charts {
width: 280px;
height: 320px;
padding: 20px;
margin-top: 10px;
background-color: #18161694;
}
.pointContainer {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
.pointContainer .pointBtnlist {
width: 100%;
height: 40px;
display: flex;
justify-content: space-around;
align-items: center;
color: #fff;
font-size: 12px;
}
#pointQulity {
width: 100%;
}
.pointbtn {
width: 40px;
height: 22px;
line-height: 20px;
text-align: center;
border: 1px solid #2b7b8a;
}
/* 采样点、排口 */
.reference {
width: 320px;
height: 150px;
margin-top: 10px;
background-color: #18161694;
display: flex;
flex-direction: column;
justify-content: space-evenly;
align-items: center;
color: #fff;
}
.chooseRef {
outline: none;
border: none;
width: 150px;
height: 35px;
background-image: url("../assets/img/gisdemo/button.png");
background-size: contain;
text-align: center;
line-height: 35px;
}
.showPopup {
width: 178px;
height: 120px;
}
#rightSide {
width: 200px;
height: 92%;
padding: 10px;
background-color: #18161694;
position: absolute;
bottom: 0px;
right: 0px;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: flex-start;
}
#lists {
width: 180px;
height: 150px;
padding: 10px;
background-color: #18161694;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
#lists .control {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-content: flex-start;
}
#lists > .control div {
outline: none;
width: 46px;
height: 20px;
margin-top: 10px;
border: 2px solid #2b7b8a;
color: #fff;
font-size: 12px;
line-height: 20px;
}
#changeMap {
width: 180px;
height: 50px;
padding: 10px;
background-color: #18161694;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
#changeMap .control {
width: 100%;
display: flex;
justify-content: space-around;
align-items: flex-start;
}
.mapItem {
width: 100%;
margin: 10px;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
color: #999999;
font-size: 14px;
font-weight: 600;
}
.control input {
outline: none;
display: none;
border: none;
border-radius: 50%;
background-color: rgba(51, 51, 51, 0.623);
}
#selectRiver {
width: 180px;
height: 200x;
padding: 10px;
background-color: #18161694;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
#selectRiver .control {
width: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
}

#selectRiver .riverItem {
outline: none;
width: 120px;
height: 32px;
margin-top: 10px;
border: none;
border-radius: 4px;
background-color: rgba(51, 51, 51, 0.623);
color: #fff;
font-size: 12px;
background-image: url("../assets/img/gisdemo/river.png");
background-size: contain;
line-height: 32px;
text-align: center;
}
#colorTab {
width: 180px;
height: 120px;
padding: 10px;
background-color: #18161694;
display: flex;
justify-content: flex-start;
align-items: flex-start;
color: #fff;
font-size: 12px;
}
#colorTab .color {
width: 20px;
height: 120px;
margin-right: 10px;
background-image: url("../assets/img/gisdemo/color.jpg");
background-size: contain;
}
#colorTab .datacolor {
width: 80px;
height: 120px;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: flex-start;
}
.titleTxt {
color: #fff;
font-size: 14px;
font-weight: 600;
}
.btnActive {
background-color: #2b7b8a;
}
.riverActive {
background-image: url("../assets/img/gisdemo/river-h.png");
background-size: contain;
}
.refActive {
background-image: url("../assets/img/gisdemo/button-h.png");
background-size: cover;
}
.paramsActive {
background-color: #2b7b8a;
}
</style>

+ 124
- 0
src/views/leftCompoents/landUse.vue View File

@@ -0,0 +1,124 @@
<template>
<div class="landuse" :id="id">
<div class="landcolor"></div>
</div>
</template>

<script>
import { Chart } from "@antv/g2";
import insertCss from "insert-css";
export default {
name: "landuse",
data() {
return {};
},
props: {
id: {
type: String,
default() {
return "";
},
},
dataList: {
type: Array,
default() {
return [];
},
},
},
watch: {
dataList: {
deep: true,
handler: function (newVal, oldVal) {
return newVal;
},
},
},
created() {},
mounted() {
const data = this.dataList;
const chart = new Chart({
  container: this.id,
  autoFit: true,
  height: 300,
});
chart.data(data);
chart.scale('ratio', {
  formatter: (val) => {
    val =(new Number(val)).toFixed(2) + '%';
console.log(val)
    return val;
  },
});
chart.coordinate('theta', {
  radius: 0.5,
  innerRadius: 0.7,
});
chart.tooltip({
  showTitle: false,
  showMarkers: false,
  itemTpl: '<li class="g2-tooltip-list-item"><span style="background-color:{color};" class="g2-tooltip-marker"></span>{name}: {value}</li>',
});
// 辅助文本
chart
  .annotation() // 注释
  .text({
    position: ['50%', '50%'],
    content: '土地占有面积',
    style: {
      fontSize: 14,
      fill: '#eeeeee',
      textAlign: 'center',
    },
    offsetY: -10,
  })
  .text({
    position: ['50%', '50%'],
    content: '单位:',
    style: {
      fontSize: 14,
      fill: '#eeeeee',
      textAlign: 'center',
    },
    offsetX: -10,
    offsetY: 20,
  })
  .text({
    position: ['50%', '50%'],
    content: '公顷',
    style: {
      fontSize: 14,
      fill: '#eeeeee',
      textAlign: 'center',
    },
    offsetY: 20,
    offsetX: 20,
  });
chart
  .interval()
  .adjust('stack')
  .position('area')
  .color('lc')
  .label('ratio', (ratio) => {
    return {
      content: (data) => {
        return `${data.lc}: ${ratio}%`;
      },
    };
  })
  .tooltip('lc*ratio', (lc,ratio) => {
    return {
      name:lc,
      value:ratio,
    };
  });

chart.interaction('element-active');

chart.render();
},
};
</script>

<style>
</style>

+ 15
- 0
src/views/leftCompoents/outletQulity.vue View File

@@ -0,0 +1,15 @@
<template>
<div id="outlet">
</div>
</template>

<script>
export default {

}
</script>

<style>

</style>

+ 88
- 0
src/views/leftCompoents/pointQulity.vue View File

@@ -0,0 +1,88 @@
<template>
<div class="point" :id="id"></div>
</template>

<script>
import { Chart } from "@antv/g2";
import insertCss from "insert-css";
export default {
name: "point",
data() {
return {
dataList1:[]
};
},
created() {
this.dataList1 = this.dataList
},
props: {
id: {
type: String,
default() {
return "";
},
},
dataList: {
type: Array,
default() {
return [];
},
},
},
watch: {
dataList: {
deep: true,
handler: function (newVal, oldVal) {
if (this.chart) {
newVal=[...newVal].map(item=>{
return Object.assign(item,{value:parseFloat(item.value)})
})
this.chart.data(newVal);
this.chart.render();
}
},
},
},

mounted() {
const data = this.dataList1
let chart = new Chart({
container: this.id,
// autoFit: true,
width: 230,
height: 250,
padding: [10, 10, 40, 30],
});

chart.data(data);
chart.axis('value', {
label: {
formatter: (val) => {
return parseFloat(val);
},
},
})
chart.scale("value", {
nice: true,
});
chart.axis("key", {
tickLine: null,
});

chart.tooltip({
showMarkers: false,
});
chart.interaction("active-region");
chart.interval().position("key*value");
chart.render();
this.chart = chart;
chart.changeData(this.dataList1)
},
};
</script>

<style scoped>
#point {
width: 100%;
}
</style>

+ 68
- 0
src/views/leftCompoents/popupComponents.vue View File

@@ -0,0 +1,68 @@
<template>
<div id="popupComponents">
<p class="title">{{dataList.river}} 号河道采样点水质详情</p>
<ul class="paramsList">
<li class="paramsItem">
<span class="value">cod:{{dataList.cod}} μg/L</span>
<span class="value">tn:{{dataList.tn}} mg/L</span>
<span class="value">tp:{{dataList.tp}} mg/L</span>
<span class="value">nh4_n:{{dataList.nh4_n}} mg/L</span>
</li>
</ul>
</div>
</template>

<script>
export default {
data() {
return {};
},
props: {
dataList: {
type: Object,
default() {
return {};
},
},
},
created () {
// console.log(this.dataList);
}
};
</script>

<style scoped>
#popupComponents {
width: 100%;
height: 100%;
padding: 30px;
background-image: url('../../assets/img/gisdemo/popup.png');
background-size: contain;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
color: #ffffff;
font-size: 14px;
}
#popupComponents .title {
width: 100%;
text-align: start;
color: #2b7b8a;
font-size: 16px;
font-weight: 600;
}
#popupComponents .paramsList {
width: 100%;
list-style: none;
width: 100%;
}
.paramsItem {
margin-top: 10px;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
}
</style>

+ 16
- 0
vue.config.js View File

@@ -0,0 +1,16 @@
module.exports = {
lintOnSave:false,
devServer: {
proxy: {
'/api': {
target: 'http://121.4.38.11:8080/geoserver/demo/ows',
ws: true,
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
},
}
}
}

Loading…
Cancel
Save