/////////////////////////////////////////////////////////////////////////// // 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}); } //获取高程去 var datas = mappints; 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; } var list = datas; 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; } }); });