From d1d62b3a7fa9f514c55edfc8b7c845fdc35f76d3 Mon Sep 17 00:00:00 2001
From: zengh <123456>
Date: Fri, 06 Nov 2020 17:45:41 +0800
Subject: [PATCH] 剖面分析集成
---
widgets/MapSection/Widget.js | 257 +++++++++++++++++++++++++
widgets/MapSection/Widget.html | 6
widgets/MapSection/manifest.json | 18 +
widgets/MapSection/nls/strings.js | 7
widgets/MapSection/nls/es/strings.js | 5
widgets/MapSection/css/style.css | 61 ++++++
widgets/MapSection/nls/zh-cn/strings.js | 5
widgets/MapSection/SectionChart.js | 236 +++++++++++++++++++++++
widgets/MapSection/images/icon.png | 0
9 files changed, 595 insertions(+), 0 deletions(-)
diff --git a/widgets/MapSection/SectionChart.js b/widgets/MapSection/SectionChart.js
new file mode 100644
index 0000000..d2087cb
--- /dev/null
+++ b/widgets/MapSection/SectionChart.js
@@ -0,0 +1,236 @@
+define([
+ 'dojo/_base/declare',
+ 'dojo/_base/lang',
+ 'dojo/_base/html',
+ 'dijit/_WidgetBase',
+ 'dijit/_TemplatedMixin',
+ 'dojo/on',
+ 'dojo/mouse',
+ 'dojo/query',
+ 'dojo/request/xhr',
+ 'dojo/topic',
+ 'dojo/json',
+ "dojo/dom-construct",
+ "libs/echarts/v4/echarts.min"
+ ],
+ function (declare, lang, html, _WidgetBase, _TemplatedMixin,
+ on, mouse, query, xhr, topic, JSON,domConstruct,echarts) {
+ return declare([_WidgetBase, _TemplatedMixin], {
+
+ templateString: '<div style="width:100%;height:100%;"><div style="width:100%;height:100%;" >' +
+ '<div data-dojo-attach-point="boxNode" style="width:100%;height:285px;border-top:0px solid #caccdd" ></div>' +
+ '<a data-dojo-attach-point="down" download="downlaod.csv" style="position:absolute;right:10px;top:0;height:30px;border-top:0px solid #caccdd" >下载数据</a>' +
+ '</div>' +
+ '</div>',
+
+ constructor: function (options, dom) {
+
+ },
+ Rad:function(d){
+ return d * Math.PI / 180.0;//经纬度转换成三角函数中度分表形式。
+ },
+ //计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度
+ GetDistance:function(lat1,lng1,lat2,lng2){
+ var radLat1 = this.Rad(lat1);
+ var radLat2 = this.Rad(lat2);
+ var a = radLat1 - radLat2;
+ var b = this.Rad(lng1) - this.Rad(lng2);
+ var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
+ Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
+ s = s *6378.137 ;// EARTH_RADIUS;
+ s = Math.round(s * 10000) / 10000; //输出为公里
+ return s;
+ },
+ modifyT:function(number,level){
+ level = level||1;
+ try{
+ //判断正数负数
+ number = number.toString().replace(/\$|\,/g, '');
+ if (isNaN(number)){
+ number = "0";
+ }
+ }catch(e){
+ return '';
+ }
+ var sign = (number == (number = Math.abs(number)));
+ //返回的是K M G T
+ var valInfo = null;
+ if (number != null && typeof(number) != "undefined") {
+ var numInput = parseFloat(number);
+ valInfo = numInput/level;
+
+ } else {
+ return '';
+ }
+
+ if(valInfo>0&&valInfo<1){//小数
+ valInfo = valInfo.toPrecision(2);
+ }else{//大于1
+ if(valInfo>=1&&valInfo<100){
+ valInfo = Number(valInfo.toPrecision(3));
+ }else if(valInfo>=100&&valInfo<=1000){
+ valInfo = Number(valInfo.toPrecision(3));
+ }else {
+ valInfo = (valInfo+"");
+ valInfo = valInfo.split(".")[0];
+ }
+ }
+
+ return (sign?"":"-")+valInfo+"";
+
+ },
+ isResize:true,
+ postCreate: function () {
+ this.inherited(arguments);
+ this.query();
+
+ this.step = 0;
+ var lg = this.GetDistance(this.oList[0].lttd,this.oList[0].lgtd,this.oList[99].lttd,this.oList[99].lgtd);
+ this.step = lg/99;
+ this.step = Number(this.modifyT(this.step));
+ var str = "";
+ var sumDyp = 0;
+ for(var k=0;k<this.oList.length;k++){
+ var item = this.oList[k];
+ if(k==0){
+ str+= "0,"+item.lgtd+","+item.lttd+","+item.height+"\n";
+ }else{
+ sumDyp+=this.step;
+ str+= this.modifyT(sumDyp)+","+item.lgtd+","+item.lttd+","+item.height+"\n";
+ }
+
+ }
+
+ str = encodeURIComponent(str);
+
+ this.down.href = "data:text/csv;charset=utf-8,\ufeff"+str;
+
+ },
+
+ query: function () {
+ setTimeout(lang.hitch(this,function(){
+ this.createEChart(this.list);
+ }),1000);
+ },
+ startup: function () {
+ this.inherited(arguments);
+ },
+ createEChart: function (list) {
+ domConstruct.empty(this.boxNode);//清空子节点
+
+ if (list.length>0){
+
+ }else{
+ domConstruct.empty(this.boxNode);
+ var content = "暂无相关站点数据";
+ var label2 = html.create('div', {
+ 'class': 'paddCenter',
+ innerHTML: content
+ }, this.boxNode);
+
+ return;
+ }
+
+ var ids = [];
+ var heights = [];
+ var sumDyp = 0;
+ var index = 1;
+ for (var i = 2; i < list.length; i++) {
+ var item = list[i];
+ heights.push(item.toFixed(2));
+ if(i==2){
+ ids.push(0);
+ }else{
+ sumDyp+=this.step;
+ ids.push(this.modifyT(sumDyp));
+ }
+ i++;
+ i++;
+ index++;
+ }
+
+ // 基于准备好的dom,初始化echarts图表
+ var myChart = echarts.init(this.boxNode);
+
+ var option = {
+ title: {
+ x:"center",
+ text: "剖面图(m)",
+ textStyle:{
+ fontSize: 14,
+ fontWeight: 'bolder',
+ color:'gray'
+ },
+ subtextStyle:{
+ fontSize: 10
+ }
+ },
+ tooltip: {
+ trigger: 'axis'
+ },
+ dataZoom: {
+ show: false,
+ realtime: false,//true为拖动的时候就变化
+ start: 0,
+ end: 100//设置成整体样式的某个位置
+ },
+ grid:{
+ y2:25,y:25,x2:50,x:50
+ },
+
+ toolbox: {
+ show:false,
+ feature: {
+ mark : {show: true},
+ dataView : {show: true, readOnly: false},
+ magicType : {show: true, type: ['line', 'bar']},
+ restore : {show: true},
+ saveAsImage: {show: true}
+ }
+ },
+ calculable: true,
+ xAxis: [
+ {
+ type: 'category',
+ data: ids,
+ name: 'km'
+ }
+ ],
+ yAxis : {
+ type: 'value',
+ scale:true,
+ boundaryGap: [0, '100%']
+ },
+
+ series: [
+ {
+ name:'高程',
+ type:'line',
+ smooth:true,
+ symbol: 'none',
+ itemStyle: {
+ normal: {
+ color: 'rgb(255, 70, 131)'
+ }
+ },
+ areaStyle: {
+ normal: {
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+ offset: 0,
+ color: 'rgb(255, 158, 68)'
+ }, {
+ offset: 1,
+ color: 'rgb(255, 70, 131)'
+ }])
+ }
+ },
+ data: heights
+ }
+ ]
+ };
+
+ myChart.setOption(option);
+ }
+ });
+ });
+
diff --git a/widgets/MapSection/Widget.html b/widgets/MapSection/Widget.html
new file mode 100644
index 0000000..b2531a2
--- /dev/null
+++ b/widgets/MapSection/Widget.html
@@ -0,0 +1,6 @@
+<div>
+ <!-- <a class="fa fa-area-chart" style=" padding: 4px;
+ cursor: pointer;
+ font-size: 19px;
+ color: white;" title="获取剖面图" data-dojo-attach-event="click:click"></a> -->
+</div>
\ No newline at end of file
diff --git a/widgets/MapSection/Widget.js b/widgets/MapSection/Widget.js
new file mode 100644
index 0000000..a16643a
--- /dev/null
+++ b/widgets/MapSection/Widget.js
@@ -0,0 +1,257 @@
+///////////////////////////////////////////////////////////////////////////
+// Copyright © 2018 NarutoGIS. All Rights Reserved.
+// 模块描述:获取两点间地形剖面
+///////////////////////////////////////////////////////////////////////////
+define([
+ "dojo/_base/declare",
+ "dojo/_base/lang",
+ 'dojo/_base/html',
+ "dojo/_base/fx",
+ 'jimu/BaseWidget',
+ "dojo/topic",
+ "dojo/Deferred",
+ "dojo/on",
+ 'jimu/dijit/Popup',
+ "./SectionChart"
+
+],function(
+ declare,
+ lang,
+ html,
+ fx,
+ BaseWidget,
+ topic,
+ Deferred,
+ on,
+ Popup,
+ SectionChart
+
+){
+ return declare("MapSection", [BaseWidget],{
+ baseClass:"demo-widgets-MapSection",
+ postCreate:function(){
+ this.inherited(arguments);
+
+ this._tooltip = this.createTooltip(this.map.cesiumWidget.container);
+ },
+ createTooltip: function (frameDiv) {
+
+ var tooltip = function(frameDiv) {
+
+ var div = document.createElement('DIV');
+ div.className = "twipsy right";
+
+ var arrow = document.createElement('DIV');
+ arrow.className = "twipsy-arrow";
+ div.appendChild(arrow);
+
+ var title = document.createElement('DIV');
+ title.className = "twipsy-inner";
+ div.appendChild(title);
+
+ this._div = div;
+ this._title = title;
+
+ // add to frame div and display coordinates
+ frameDiv.appendChild(div);
+ }
+
+ tooltip.prototype.setVisible = function(visible) {
+ this._div.style.display = visible ? 'block' : 'none';
+ }
+
+ tooltip.prototype.showAt = function(position, message) {
+ if(position && message) {
+ this.setVisible(true);
+ this._title.innerHTML = message;
+ this._div.style.left = position.x + 10 + "px";
+ this._div.style.top = (position.y - this._div.clientHeight / 2) + "px";
+ }
+ }
+
+ return new tooltip(frameDiv);
+ },
+ destroy:function(){
+
+ this.inherited(arguments);
+ },
+ // click:function(){
+ // this.active = !this.active;
+ // if(this.active){
+ // this._tooltip.setVisible(true);
+ // }else{
+ // this._tooltip.setVisible(false);
+ // }
+ // this.clearEntity();
+ // },
+ onOpen: function () {
+ this.map.scene.globe.baseColor = Cesium.Color.BLACK;
+ $($('div.cesium-viewer').find('.cesium-baseLayerPicker-choices')[0]).children('div:eq(3)').trigger('click');
+ this.active = true;
+ this.clearEntity();
+ this._tooltip.setVisible(true);
+
+
+ },
+ onClose: function () {
+ this.active = false;
+ this.clearEntity();
+ this._tooltip.setVisible(false); },
+ active:false,
+ startup:function(){
+ this.inherited(arguments);
+
+ var handler = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas);
+
+ handler.setInputAction(
+ lang.hitch(this,function (movement) {
+ if(!this.active)return;
+ var ellipsoid = window.viewer.scene.globe.ellipsoid;
+ var ellipsoid = Cesium.Ellipsoid.WGS84;
+// var cartesian = window.viewer.scene.camera.pickEllipsoid(movement.position, ellipsoid);//两种的经纬度获取的不一样
+ var pickRay = window.viewer.scene.camera.getPickRay(movement.position);
+ var cartesian = window.viewer.scene.globe.pick(pickRay, window.viewer.scene);
+
+ if (cartesian) {
+
+ var cartographic = ellipsoid.cartesianToCartographic(cartesian);
+ var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);//.toFixed(2);
+ var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);//.toFixed(2);
+
+ this.points.push({"lgtd":longitudeString,"lttd":latitudeString});
+
+ if(this.points.length==2){
+ //计算
+ var points = this.createHundryPoints(this.points);
+ //弹出
+ this.getData(points);
+ this.points = [];
+ this.active = false;
+ this._tooltip.setVisible(false);
+ this.bill2 = window.viewer.entities.add({
+ position : Cesium.Cartesian3.fromDegrees(longitudeString, latitudeString ),
+ billboard : {
+ image : "images/marker_green.png",
+ pixelOffset: new Cesium.Cartesian2(0, 0),
+ heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+ disableDepthTestDistance: Number.POSITIVE_INFINITY
+ }
+ });
+ return;
+ }
+ this.bill1 = window.viewer.entities.add({
+ position : Cesium.Cartesian3.fromDegrees(longitudeString, latitudeString ),
+ billboard : {
+ image : "images/marker_green.png",
+ pixelOffset: new Cesium.Cartesian2(0, 0),
+ heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+ disableDepthTestDistance: Number.POSITIVE_INFINITY
+ }
+ });
+ }
+
+ }), Cesium.ScreenSpaceEventType.LEFT_CLICK);
+
+ handler.setInputAction(
+ lang.hitch(this,function (movement) {
+ if(!this.active)return;
+ if(this.points.length==0){
+ this._tooltip.showAt(movement.endPosition, "请获取起点");
+ return;
+ }
+ this._tooltip.showAt(movement.endPosition, "点击结束");
+
+ }), Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+ },
+ clearEntity:function(){
+ window.viewer.entities.remove(this.bill1);
+ window.viewer.entities.remove(this.bill2);
+ window.viewer.entities.remove(this.line);
+ },
+ createHundryPoints:function(list){
+
+ var lgtd1 = list[0].lgtd;
+ var lgtd100 = list[1].lgtd;
+ var lgtdStep = (lgtd100-lgtd1)/1000;
+
+ var lttd1 = list[0].lttd;
+ var lttd100 = list[1].lttd;
+ var lttdStep = (lttd100-lttd1)/1000;
+ var ary = [];
+ for(var i=0;i<1000;i++){
+ var lgtd = lgtd1 +(lgtdStep*i);
+ var lttd = lttd1 +(lttdStep*i);
+ ary.push({"id":i,"lgtd":lgtd,"lttd":lttd});
+ }
+
+ return ary;
+ },
+ points:[],
+ getData:function(ary){
+ var mappints = [];
+ for(var j=0;j<ary.length;j++){
+ var pt = ary[j];
+ mappints.push({lgtd:pt.lgtd,lttd:pt.lttd,height:0});
+ }
+ //获取高程去
+ this.makeChange(mappints).then(lang.hitch(this,function(list){
+ var ptsAry = [];
+ var numbers_lgtd=[];
+ var numbers_lttd=[];
+ for(var j=0;j<list.length;j++){
+ var pt = list[j];
+ ptsAry.push(Number(pt.lgtd));
+ ptsAry.push(Number(pt.lttd));
+ ptsAry.push(Number(pt.height));
+
+ numbers_lgtd.push(Number(pt.lgtd));
+ numbers_lttd.push(Number(pt.lttd));
+ }
+
+
+ this.line = window.viewer.entities.add({
+ polyline : {
+ positions : Cesium.Cartesian3.fromDegreesArrayHeights(ptsAry),
+ width : 3,
+ material : new Cesium.PolylineOutlineMaterialProperty({
+ color : Cesium.Color.ORANGE,
+ outlineWidth : 1,
+ outlineColor : Cesium.Color.BLACK
+ }),
+ clampToGround: true
+ }
+ });
+
+ var panel = new SectionChart({list:ptsAry,oList:list});
+ new Popup({
+ content: panel,
+ titleLabel: "地形剖面图",
+ width: 650,
+ height: 370,
+ buttons: [],
+ onClose:lang.hitch(this,function(){
+ return true;
+ })
+ });
+ }));
+ },
+ makeChange:function(datas){
+ var datas = datas;
+ var def = new Deferred();
+ var tIds = [];
+ var pos = [];
+ for(var i=0;i<datas.length;i++){
+ var item = datas[i];
+ tIds.push(item.id);
+ pos.push(Cesium.Cartographic.fromDegrees(item.lgtd, item.lttd));
+ }
+ Cesium.sampleTerrain(window.viewer.terrainProvider, 9, pos).then(function (pos) {//去获取高程
+ for (var i=0; i<tIds.length; i++) {
+ datas[i].height = pos[i].height;
+ }
+ def.resolve(datas);
+ });
+ return def;
+ }
+ });
+});
\ No newline at end of file
diff --git a/widgets/MapSection/css/style.css b/widgets/MapSection/css/style.css
new file mode 100644
index 0000000..aa79949
--- /dev/null
+++ b/widgets/MapSection/css/style.css
@@ -0,0 +1,61 @@
+.demo-widgets-MapSection {
+ width: 0!important;
+ height: 0 !important;
+ margin:2px;
+ background: #303336;
+ border: 1px solid #444;
+ text-align: center;
+ border-radius: 4px;
+ padding: 1px;
+}
+
+.twipsy {
+ display: block;
+ position: absolute;
+ visibility: visible;
+ max-width: 200px;
+ min-width: 100px;
+ padding: 5px;
+ font-size: 11px;
+ z-index: 1000;
+ opacity: 0.8;
+ -khtml-opacity: 0.8;
+ -moz-opacity: 0.8;
+ filter: alpha(opacity=80);
+}
+
+.twipsy.left .twipsy-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-top: 5px solid transparent;
+ border-bottom: 5px solid transparent;
+ border-left: 5px solid #000000;
+}
+
+.twipsy.right .twipsy-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-top: 5px solid transparent;
+ border-bottom: 5px solid transparent;
+ border-right: 5px solid #000000;
+}
+
+.twipsy-inner {
+ padding: 3px 8px;
+ background-color: #000000;
+ color: white;
+ text-align: center;
+ max-width: 200px;
+ text-decoration: none;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+.twipsy-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+}
\ No newline at end of file
diff --git a/widgets/MapSection/images/icon.png b/widgets/MapSection/images/icon.png
new file mode 100644
index 0000000..527ec04
--- /dev/null
+++ b/widgets/MapSection/images/icon.png
Binary files differ
diff --git a/widgets/MapSection/manifest.json b/widgets/MapSection/manifest.json
new file mode 100644
index 0000000..5f2a6b3
--- /dev/null
+++ b/widgets/MapSection/manifest.json
@@ -0,0 +1,18 @@
+{
+ "name": "MapSection",
+ "2D": true,
+ "3D": true,
+ "platform": "HTML",
+ "version": "2.10",
+ "wabVersion": "2.10",
+ "author": "NarutoGIS",
+ "description": "",
+ "copyright": "",
+ "license": "",
+ "properties": {
+ "inPanel": false,
+ "hasUIFile": true,
+ "hasConfig": false,
+ "supportMultiInstance": false
+ }
+}
\ No newline at end of file
diff --git a/widgets/MapSection/nls/es/strings.js b/widgets/MapSection/nls/es/strings.js
new file mode 100644
index 0000000..bdc0118
--- /dev/null
+++ b/widgets/MapSection/nls/es/strings.js
@@ -0,0 +1,5 @@
+define(
+ ({
+ _widgetLabel: "MapSection"
+ })
+);
\ No newline at end of file
diff --git a/widgets/MapSection/nls/strings.js b/widgets/MapSection/nls/strings.js
new file mode 100644
index 0000000..8849067
--- /dev/null
+++ b/widgets/MapSection/nls/strings.js
@@ -0,0 +1,7 @@
+define({
+ root: ({
+ _widgetLabel: "MapSection"
+ }),
+ "es": 1,
+ "zh-cn": 1
+});
\ No newline at end of file
diff --git a/widgets/MapSection/nls/zh-cn/strings.js b/widgets/MapSection/nls/zh-cn/strings.js
new file mode 100644
index 0000000..1addcc6
--- /dev/null
+++ b/widgets/MapSection/nls/zh-cn/strings.js
@@ -0,0 +1,5 @@
+define(
+ ({
+ _widgetLabel: "剖面分析"
+ })
+);
\ No newline at end of file
--
Gitblit v1.9.3