123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- import {
- Entity,
- Ellipsoid,
- Cartesian3,
- PolylineOutlineMaterialProperty,
- Color,
- ScreenSpaceEventType,
- HeightReference,
- Cartesian2,
- LabelStyle,
- VerticalOrigin,
- ScreenSpaceEventHandler,
- handler,
- defined,
- CallbackProperty,
- Cartographic,
- EllipsoidGeodesic
- } from 'cesium/Cesium'
- /******************************************* */
- //测量空间直线距离
- /******************************************* */
- var measureLineSpace = function (cb) {
- var handler = new ScreenSpaceEventHandler(viewer.scene._imageryLayerCollection);
- var positions = [];
- var poly = null;
- var tooltip = document.getElementById("toolTip");
- var distance = 0;
- var cartesian = null;
- var floatingPoint;
- handler.setInputAction(function (movement) {
- tooltip.style.left = movement.endPosition.x + 3 + "px";
- tooltip.style.top = movement.endPosition.y - 25 + "px";
- tooltip.innerHTML = '<p>单击开始,双击结束</p>';
- ///////=================================
- cartesian = viewer.scene.pickPosition(movement.endPosition);
- /////==================================
- //cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
- if (positions.length >= 2) {
- if (!defined(poly)) {
- poly = new PolyLinePrimitive(positions);
- } else {
- positions.pop();
- // cartesian.y += (1 + Math.random());
- positions.push(cartesian);
- }
- distance = getSpaceDistance(positions);
- // console.log("distance: " + distance);
- // tooltip.innerHTML='<p>'+distance+'米</p>';
- }
- }, ScreenSpaceEventType.MOUSE_MOVE);
- handler.setInputAction(function (movement) {
- // cartesian = viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
- cartesian = viewer.scene.pickPosition(movement.position);
- if (positions.length == 0) {
- positions.push(cartesian.clone());
- }
- positions.push(cartesian);
- //在三维场景中添加Label
- // var cartographic = Cartographic.fromCartesian(cartesian);
- var textDisance = distance + "米";
- // console.log(textDisance + ",lng:" + cartographic.longitude/Math.PI*180.0);
- floatingPoint = viewer.entities.add({
- name: '空间直线距离',
- // position: Cartesian3.fromDegrees(cartographic.longitude / Math.PI * 180, cartographic.latitude / Math.PI * 180,cartographic.height),
- position: positions[positions.length - 1],
- point: {
- pixelSize: 5,
- color: Color.RED,
- outlineColor: Color.WHITE,
- outlineWidth: 2,
- heightReference: HeightReference.NONE
- },
- label: {
- text: textDisance,
- font: '18px sans-serif',
- fillColor: Color.GOLD,
- style: LabelStyle.FILL_AND_OUTLINE,
- outlineWidth: 2,
- verticalOrigin: VerticalOrigin.BOTTOM,
- pixelOffset: new Cartesian2(20, -20),
- heightReference: HeightReference.NONE
- }
- });
- }, ScreenSpaceEventType.LEFT_CLICK);
- handler.setInputAction(function (movement) {
- handler.destroy();//关闭事件句柄
- positions.pop();//最后一个点无效
- viewer.entities.remove(floatingPoint);
- cb()
- }, ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
- var PolyLinePrimitive = (function () {
- function _(positions) {
- this.options = {
- name: '直线',
- polyline: {
- show: true,
- positions: [],
- material: Color.CHARTREUSE,
- width: 2
- }
- };
- this.positions = positions;
- this._init();
- }
- _.prototype._init = function () {
- var _self = this;
- var _update = function () {
- return _self.positions;
- };
- //实时更新polyline.positions
- this.options.polyline.positions = new CallbackProperty(_update, false);
- viewer.entities.add(this.options);
- };
- return _;
- })();
- };
- //空间两点距离计算函数
- function getSpaceDistance(positions) {
- var distance = 0;
- for (var i = 0; i < positions.length - 1; i++) {
- var point1cartographic = Cartographic.fromCartesian(positions[i]);
- var point2cartographic = Cartographic.fromCartesian(positions[i + 1]);
- /**根据经纬度计算出距离**/
- var geodesic = new EllipsoidGeodesic();
- geodesic.setEndPoints(point1cartographic, point2cartographic);
- var s = geodesic.surfaceDistance;
- //console.log(Math.sqrt(Math.pow(distance, 2) + Math.pow(endheight, 2)));
- //返回两点之间的距离
- s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic.height, 2));
- distance = distance + s;
- }
- return distance.toFixed(2);
- }
- export default measureLineSpace
|