mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-03 16:54:16 +00:00 
			
		
		
		
	
		
			
	
	
		
			539 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			539 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								var util = {};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								util.isNumber = function (obj) {
							 | 
						|||
| 
								 | 
							
								    return (typeof obj == 'number') && obj.constructor == Number;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								util.isString = function (str) {
							 | 
						|||
| 
								 | 
							
								    return (typeof str == 'string') && str.constructor == String;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * @function Util.extend
							 | 
						|||
| 
								 | 
							
								 * @description 对象拷贝赋值。
							 | 
						|||
| 
								 | 
							
								 * @param {Object} dest - 目标对象。
							 | 
						|||
| 
								 | 
							
								 * @param {Object} arguments - 待拷贝的对象。
							 | 
						|||
| 
								 | 
							
								 * @returns {Object} 赋值后的目标对象。
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								util.extend = function (dest) {
							 | 
						|||
| 
								 | 
							
								    for (var index = 0; index < Object.getOwnPropertyNames(arguments).length; index++) {
							 | 
						|||
| 
								 | 
							
								        var arg = Object.getOwnPropertyNames(arguments)[index];
							 | 
						|||
| 
								 | 
							
								        if (arg == "caller" || arg == "callee" || arg == "length" || arg == "arguments") {
							 | 
						|||
| 
								 | 
							
								            continue;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        var obj = arguments[arg];
							 | 
						|||
| 
								 | 
							
								        if (obj) {
							 | 
						|||
| 
								 | 
							
								            for (var j = 0; j < Object.getOwnPropertyNames(obj).length; j++) {
							 | 
						|||
| 
								 | 
							
								                var key = Object.getOwnPropertyNames(obj)[j];
							 | 
						|||
| 
								 | 
							
								                if (arg == "caller" || arg == "callee" || arg == "length" || arg == "arguments") {
							 | 
						|||
| 
								 | 
							
								                    continue;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                dest[key] = obj[key];
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    return dest;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								//url参数获取
							 | 
						|||
| 
								 | 
							
								util.getRequest = function () {
							 | 
						|||
| 
								 | 
							
								    var url = location.search; //获取url中"?"符后的字串   
							 | 
						|||
| 
								 | 
							
								    var theRequest = new Object();
							 | 
						|||
| 
								 | 
							
								    if (url.indexOf("?") != -1) {
							 | 
						|||
| 
								 | 
							
								        var str = url.substr(1);
							 | 
						|||
| 
								 | 
							
								        var strs = str.split("&");
							 | 
						|||
| 
								 | 
							
								        for (var i = 0; i < strs.length; i++) {
							 | 
						|||
| 
								 | 
							
								            theRequest[strs[i].split("=")[0]] = decodeURI(strs[i].split("=")[1]);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    return theRequest;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								util.getRequestByName = function (name) {
							 | 
						|||
| 
								 | 
							
								    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
							 | 
						|||
| 
								 | 
							
								    var r = window.location.search.substr(1).match(reg);
							 | 
						|||
| 
								 | 
							
								    if (r != null) return decodeURI(r[2]);
							 | 
						|||
| 
								 | 
							
								    return null;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								util.clone = function (obj) {
							 | 
						|||
| 
								 | 
							
								    if (null == obj || "object" != typeof obj) return obj;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    // Handle Date
							 | 
						|||
| 
								 | 
							
								    if (obj instanceof Date) {
							 | 
						|||
| 
								 | 
							
								        var copy = new Date();
							 | 
						|||
| 
								 | 
							
								        copy.setTime(obj.getTime());
							 | 
						|||
| 
								 | 
							
								        return copy;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    // Handle Array
							 | 
						|||
| 
								 | 
							
								    if (obj instanceof Array) {
							 | 
						|||
| 
								 | 
							
								        var copy = [];
							 | 
						|||
| 
								 | 
							
								        for (var i = 0, len = obj.length; i < len; ++i) {
							 | 
						|||
| 
								 | 
							
								            copy[i] = clone(obj[i]);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        return copy;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    // Handle Object
							 | 
						|||
| 
								 | 
							
								    if (typeof obj === 'object') {
							 | 
						|||
| 
								 | 
							
								        var copy = {};
							 | 
						|||
| 
								 | 
							
								        for (var attr in obj) {
							 | 
						|||
| 
								 | 
							
								            if (attr == "_layer" || attr == "_layers" || attr == "_parent") continue;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (obj.hasOwnProperty(attr))
							 | 
						|||
| 
								 | 
							
								                copy[attr] = clone(obj[attr]);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        return copy;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    return obj;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								util.isPCBroswer = function () {
							 | 
						|||
| 
								 | 
							
								    var sUserAgent = navigator.userAgent.toLowerCase();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
							 | 
						|||
| 
								 | 
							
								    var bIsIphoneOs = sUserAgent.match(/iphone/i) == "iphone";
							 | 
						|||
| 
								 | 
							
								    var bIsMidp = sUserAgent.match(/midp/i) == "midp";
							 | 
						|||
| 
								 | 
							
								    var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
							 | 
						|||
| 
								 | 
							
								    var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
							 | 
						|||
| 
								 | 
							
								    var bIsAndroid = sUserAgent.match(/android/i) == "android";
							 | 
						|||
| 
								 | 
							
								    var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
							 | 
						|||
| 
								 | 
							
								    var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
							 | 
						|||
| 
								 | 
							
								    if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) {
							 | 
						|||
| 
								 | 
							
								        return false;
							 | 
						|||
| 
								 | 
							
								    } else {
							 | 
						|||
| 
								 | 
							
								        return true;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								//检测浏览器webgl支持
							 | 
						|||
| 
								 | 
							
								util.webglreport = function () {
							 | 
						|||
| 
								 | 
							
								    var exinfo = getExplorerInfo();
							 | 
						|||
| 
								 | 
							
								    if (exinfo.type == "IE" && exinfo.version < 11) {
							 | 
						|||
| 
								 | 
							
								        return false;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    try {
							 | 
						|||
| 
								 | 
							
								        var glContext;
							 | 
						|||
| 
								 | 
							
								        var canvas = document.createElement('canvas');
							 | 
						|||
| 
								 | 
							
								        var requestWebgl2 = (typeof WebGL2RenderingContext !== 'undefined');
							 | 
						|||
| 
								 | 
							
								        if (requestWebgl2) {
							 | 
						|||
| 
								 | 
							
								            glContext = canvas.getContext('webgl2') || canvas.getContext('experimental-webgl2') || undefined;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        if (glContext == null) {
							 | 
						|||
| 
								 | 
							
								            glContext = canvas.getContext('webgl') || canvas.getContext('experimental-webgl') || undefined;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        if (glContext == null) {
							 | 
						|||
| 
								 | 
							
								            return false;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    } catch (e) {
							 | 
						|||
| 
								 | 
							
								        return false;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    return true;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								//计算贴地路线
							 | 
						|||
| 
								 | 
							
								util.terrainPolyline = function (params) {
							 | 
						|||
| 
								 | 
							
								    var viewer = params.viewer;
							 | 
						|||
| 
								 | 
							
								    var positions = params.positions;
							 | 
						|||
| 
								 | 
							
								    if (positions == null || positions.length == 0) {
							 | 
						|||
| 
								 | 
							
								        if (params.calback)
							 | 
						|||
| 
								 | 
							
								            params.calback(positions);
							 | 
						|||
| 
								 | 
							
								        return;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    var flatPositions = Cesium.PolylinePipeline.generateArc({
							 | 
						|||
| 
								 | 
							
								        positions: positions,
							 | 
						|||
| 
								 | 
							
								        granularity: params.granularity || 0.00001
							 | 
						|||
| 
								 | 
							
								    });
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    var cartographicArray = [];
							 | 
						|||
| 
								 | 
							
								    var ellipsoid = viewer.scene.globe.ellipsoid;
							 | 
						|||
| 
								 | 
							
								    for (var i = 0; i < flatPositions.length; i += 3) {
							 | 
						|||
| 
								 | 
							
								        var cartesian = Cesium.Cartesian3.unpack(flatPositions, i);
							 | 
						|||
| 
								 | 
							
								        cartographicArray.push(ellipsoid.cartesianToCartographic(cartesian));
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    //用于缺少地形数据时,赋值的高度
							 | 
						|||
| 
								 | 
							
								    var tempHeight = Cesium.Cartographic.fromCartesian(positions[0]).height;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    Cesium.when(Cesium.sampleTerrainMostDetailed(viewer.terrainProvider, cartographicArray), function (samples) {
							 | 
						|||
| 
								 | 
							
								        var noHeight = false;
							 | 
						|||
| 
								 | 
							
								        var offset = params.offset || 2; //增高高度,便于可视
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        for (var i = 0; i < samples.length; ++i) {
							 | 
						|||
| 
								 | 
							
								            if (samples[i].height == null) {
							 | 
						|||
| 
								 | 
							
								                noHeight = true;
							 | 
						|||
| 
								 | 
							
								                samples[i].height = tempHeight;
							 | 
						|||
| 
								 | 
							
								            } else {
							 | 
						|||
| 
								 | 
							
								                samples[i].height = offset + (samples[i].height * viewer.scene._terrainExaggeration);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        var raisedPositions = ellipsoid.cartographicArrayToCartesianArray(samples);
							 | 
						|||
| 
								 | 
							
								        if (params.calback)
							 | 
						|||
| 
								 | 
							
								            params.calback(raisedPositions, noHeight);
							 | 
						|||
| 
								 | 
							
								        else if (positions.setValue)
							 | 
						|||
| 
								 | 
							
								            positions.setValue(raisedPositions);
							 | 
						|||
| 
								 | 
							
								    });
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								//地形构造
							 | 
						|||
| 
								 | 
							
								var _ellipsoid = new Cesium.EllipsoidTerrainProvider({
							 | 
						|||
| 
								 | 
							
								    ellipsoid: Cesium.Ellipsoid.WGS84
							 | 
						|||
| 
								 | 
							
								});
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								util.getEllipsoidTerrain = function () {
							 | 
						|||
| 
								 | 
							
								    return _ellipsoid;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								util.getTerrainProvider = function (cfg) {
							 | 
						|||
| 
								 | 
							
								    if (!cfg.hasOwnProperty("requestWaterMask")) cfg.requestWaterMask = true;
							 | 
						|||
| 
								 | 
							
								    if (!cfg.hasOwnProperty("requestVertexNormals")) cfg.requestVertexNormals = true;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    var terrainProvider;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    if (cfg.url == "" || cfg.url == null || cfg.url == "cesium") {
							 | 
						|||
| 
								 | 
							
								        terrainProvider = new Cesium.CesiumTerrainProvider({
							 | 
						|||
| 
								 | 
							
								            url: Cesium.IonResource.fromAssetId(1)
							 | 
						|||
| 
								 | 
							
								        })
							 | 
						|||
| 
								 | 
							
								    } else if (cfg.url == "ellipsoid" || cfg.url == "null") {
							 | 
						|||
| 
								 | 
							
								        terrainProvider = _ellipsoid;
							 | 
						|||
| 
								 | 
							
								    } else {
							 | 
						|||
| 
								 | 
							
								        terrainProvider = new Cesium.CesiumTerrainProvider(cfg);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    return terrainProvider;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								//创建模型
							 | 
						|||
| 
								 | 
							
								util.createModel = function (cfg, viewer) {
							 | 
						|||
| 
								 | 
							
								    cfg = viewer.globe.point2map(cfg); //转换坐标系
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    var position = Cesium.Cartesian3.fromDegrees(cfg.x, cfg.y, cfg.z || 0);
							 | 
						|||
| 
								 | 
							
								    var heading = Cesium.Math.toRadians(cfg.heading || 0)
							 | 
						|||
| 
								 | 
							
								    var pitch = Cesium.Math.toRadians(cfg.pitch || 0)
							 | 
						|||
| 
								 | 
							
								    var roll = Cesium.Math.toRadians(cfg.roll || 0);
							 | 
						|||
| 
								 | 
							
								    var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
							 | 
						|||
| 
								 | 
							
								    var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    var model = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								        name: cfg.name || "",
							 | 
						|||
| 
								 | 
							
								        position: position,
							 | 
						|||
| 
								 | 
							
								        orientation: orientation,
							 | 
						|||
| 
								 | 
							
								        model: cfg,
							 | 
						|||
| 
								 | 
							
								        tooltip: cfg.tooltip,
							 | 
						|||
| 
								 | 
							
								        popup: cfg.popup,
							 | 
						|||
| 
								 | 
							
								    });
							 | 
						|||
| 
								 | 
							
								    return model;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								util.formatDegree = function (value) {
							 | 
						|||
| 
								 | 
							
								    value = Math.abs(value);
							 | 
						|||
| 
								 | 
							
								    var v1 = Math.floor(value); //度  
							 | 
						|||
| 
								 | 
							
								    var v2 = Math.floor((value - v1) * 60); //分  
							 | 
						|||
| 
								 | 
							
								    var v3 = Math.round((value - v1) * 3600 % 60); //秒  
							 | 
						|||
| 
								 | 
							
								    return v1 + '° ' + v2 + '\'  ' + v3 + '"';
							 | 
						|||
| 
								 | 
							
								};
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								function getExplorerInfo() {
							 | 
						|||
| 
								 | 
							
								    var explorer = window.navigator.userAgent.toLowerCase();
							 | 
						|||
| 
								 | 
							
								    //ie 
							 | 
						|||
| 
								 | 
							
								    if (explorer.indexOf("msie") >= 0) {
							 | 
						|||
| 
								 | 
							
								        var ver = Number(explorer.match(/msie ([\d]+)/)[1]);
							 | 
						|||
| 
								 | 
							
								        return {
							 | 
						|||
| 
								 | 
							
								            type: "IE",
							 | 
						|||
| 
								 | 
							
								            version: ver
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    //firefox 
							 | 
						|||
| 
								 | 
							
								    else if (explorer.indexOf("firefox") >= 0) {
							 | 
						|||
| 
								 | 
							
								        var ver = Number(explorer.match(/firefox\/([\d]+)/)[1]);
							 | 
						|||
| 
								 | 
							
								        return {
							 | 
						|||
| 
								 | 
							
								            type: "Firefox",
							 | 
						|||
| 
								 | 
							
								            version: ver
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    //Chrome
							 | 
						|||
| 
								 | 
							
								    else if (explorer.indexOf("chrome") >= 0) {
							 | 
						|||
| 
								 | 
							
								        var ver = Number(explorer.match(/chrome\/([\d]+)/)[1]);
							 | 
						|||
| 
								 | 
							
								        return {
							 | 
						|||
| 
								 | 
							
								            type: "Chrome",
							 | 
						|||
| 
								 | 
							
								            version: ver
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    //Opera
							 | 
						|||
| 
								 | 
							
								    else if (explorer.indexOf("opera") >= 0) {
							 | 
						|||
| 
								 | 
							
								        var ver = Number(explorer.match(/opera.([\d]+)/)[1]);
							 | 
						|||
| 
								 | 
							
								        return {
							 | 
						|||
| 
								 | 
							
								            type: "Opera",
							 | 
						|||
| 
								 | 
							
								            version: ver
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    //Safari
							 | 
						|||
| 
								 | 
							
								    else if (explorer.indexOf("Safari") >= 0) {
							 | 
						|||
| 
								 | 
							
								        var ver = Number(explorer.match(/version\/([\d]+)/)[1]);
							 | 
						|||
| 
								 | 
							
								        return {
							 | 
						|||
| 
								 | 
							
								            type: "Safari",
							 | 
						|||
| 
								 | 
							
								            version: ver
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    return {
							 | 
						|||
| 
								 | 
							
								        type: explorer,
							 | 
						|||
| 
								 | 
							
								        version: -1
							 | 
						|||
| 
								 | 
							
								    };
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								//解决浮点问题
							 | 
						|||
| 
								 | 
							
								function floatObj() {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /*
							 | 
						|||
| 
								 | 
							
								     * 判断obj是否为一个整数
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    function isInteger(obj) {
							 | 
						|||
| 
								 | 
							
								        return Math.floor(obj) === obj
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /*
							 | 
						|||
| 
								 | 
							
								     * 将一个浮点数转成整数,返回整数和倍数。如 3.14 >> 314,倍数是 100
							 | 
						|||
| 
								 | 
							
								     * @param floatNum {number} 小数
							 | 
						|||
| 
								 | 
							
								     * @return {object}
							 | 
						|||
| 
								 | 
							
								     *   {times:100, num: 314}
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    function toInteger(floatNum) {
							 | 
						|||
| 
								 | 
							
								        var ret = {
							 | 
						|||
| 
								 | 
							
								            times: 1,
							 | 
						|||
| 
								 | 
							
								            num: 0
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								        if (isInteger(floatNum)) {
							 | 
						|||
| 
								 | 
							
								            ret.num = floatNum;
							 | 
						|||
| 
								 | 
							
								            return ret
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        var strfi = floatNum + '';
							 | 
						|||
| 
								 | 
							
								        var dotPos = strfi.indexOf('.');
							 | 
						|||
| 
								 | 
							
								        var len = strfi.substr(dotPos + 1).length;
							 | 
						|||
| 
								 | 
							
								        var times = Math.pow(10, len);
							 | 
						|||
| 
								 | 
							
								        var intNum = parseInt(floatNum * times + 0.5, 10);
							 | 
						|||
| 
								 | 
							
								        ret.times = times;
							 | 
						|||
| 
								 | 
							
								        ret.num = intNum;
							 | 
						|||
| 
								 | 
							
								        return ret
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /*
							 | 
						|||
| 
								 | 
							
								     * 核心方法,实现加减乘除运算,确保不丢失精度
							 | 
						|||
| 
								 | 
							
								     * 思路:把小数放大为整数(乘),进行算术运算,再缩小为小数(除)
							 | 
						|||
| 
								 | 
							
								     *
							 | 
						|||
| 
								 | 
							
								     * @param a {number} 运算数1
							 | 
						|||
| 
								 | 
							
								     * @param b {number} 运算数2
							 | 
						|||
| 
								 | 
							
								     * @param op {string} 运算类型,有加减乘除(add/subtract/multiply/divide)
							 | 
						|||
| 
								 | 
							
								     *
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    function operation(a, b, op) {
							 | 
						|||
| 
								 | 
							
								        var o1 = toInteger(a);
							 | 
						|||
| 
								 | 
							
								        var o2 = toInteger(b);
							 | 
						|||
| 
								 | 
							
								        var n1 = o1.num;
							 | 
						|||
| 
								 | 
							
								        var n2 = o2.num;
							 | 
						|||
| 
								 | 
							
								        var t1 = o1.times;
							 | 
						|||
| 
								 | 
							
								        var t2 = o2.times;
							 | 
						|||
| 
								 | 
							
								        var max = t1 > t2 ? t1 : t2;
							 | 
						|||
| 
								 | 
							
								        var result = null;
							 | 
						|||
| 
								 | 
							
								        switch (op) {
							 | 
						|||
| 
								 | 
							
								            case 'add':
							 | 
						|||
| 
								 | 
							
								                if (t1 === t2) { // 两个小数位数相同
							 | 
						|||
| 
								 | 
							
								                    result = n1 + n2
							 | 
						|||
| 
								 | 
							
								                } else if (t1 > t2) { // o1 小数位 大于 o2
							 | 
						|||
| 
								 | 
							
								                    result = n1 + n2 * (t1 / t2)
							 | 
						|||
| 
								 | 
							
								                } else { // o1 小数位 小于 o2
							 | 
						|||
| 
								 | 
							
								                    result = n1 * (t2 / t1) + n2
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                return result / max;
							 | 
						|||
| 
								 | 
							
								            case 'subtract':
							 | 
						|||
| 
								 | 
							
								                if (t1 === t2) {
							 | 
						|||
| 
								 | 
							
								                    result = n1 - n2
							 | 
						|||
| 
								 | 
							
								                } else if (t1 > t2) {
							 | 
						|||
| 
								 | 
							
								                    result = n1 - n2 * (t1 / t2)
							 | 
						|||
| 
								 | 
							
								                } else {
							 | 
						|||
| 
								 | 
							
								                    result = n1 * (t2 / t1) - n2
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                return result / max;
							 | 
						|||
| 
								 | 
							
								            case 'multiply':
							 | 
						|||
| 
								 | 
							
								                result = (n1 * n2) / (t1 * t2);
							 | 
						|||
| 
								 | 
							
								                return result;
							 | 
						|||
| 
								 | 
							
								            case 'divide':
							 | 
						|||
| 
								 | 
							
								                result = (n1 / n2) * (t2 / t1);
							 | 
						|||
| 
								 | 
							
								                return result
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    // 加减乘除的四个接口
							 | 
						|||
| 
								 | 
							
								    function add(a, b) {
							 | 
						|||
| 
								 | 
							
								        return operation(a, b, 'add')
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    function subtract(a, b) {
							 | 
						|||
| 
								 | 
							
								        return operation(a, b, 'subtract')
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    function multiply(a, b) {
							 | 
						|||
| 
								 | 
							
								        return operation(a, b, 'multiply')
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    function divide(a, b) {
							 | 
						|||
| 
								 | 
							
								        return operation(a, b, 'divide')
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    // exports
							 | 
						|||
| 
								 | 
							
								    return {
							 | 
						|||
| 
								 | 
							
								        add: add,
							 | 
						|||
| 
								 | 
							
								        subtract: subtract,
							 | 
						|||
| 
								 | 
							
								        multiply: multiply,
							 | 
						|||
| 
								 | 
							
								        divide: divide
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								};
							 | 
						|||
| 
								 | 
							
								util.floatObj = floatObj();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								//生成多边形范围内随机点polygon:折点集合
							 | 
						|||
| 
								 | 
							
								util.randomPointsWithinPolygon = function (polygon, num, type) {
							 | 
						|||
| 
								 | 
							
								    var xmin = 1000000000,
							 | 
						|||
| 
								 | 
							
								        xmax = -1000000000,
							 | 
						|||
| 
								 | 
							
								        ymin = 1000000000,
							 | 
						|||
| 
								 | 
							
								        ymax = -1000000000;
							 | 
						|||
| 
								 | 
							
								    //获取面的矩形
							 | 
						|||
| 
								 | 
							
								    for (var i = 0; i < polygon.length; i++) {
							 | 
						|||
| 
								 | 
							
								        xmin = Math.min(xmin, polygon[i].x);
							 | 
						|||
| 
								 | 
							
								        xmax = Math.max(xmax, polygon[i].x);
							 | 
						|||
| 
								 | 
							
								        ymin = Math.min(ymin, polygon[i].y);
							 | 
						|||
| 
								 | 
							
								        ymax = Math.max(ymax, polygon[i].y);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    var points = [];
							 | 
						|||
| 
								 | 
							
								    if (type && type == "geojson") {
							 | 
						|||
| 
								 | 
							
								        points = {
							 | 
						|||
| 
								 | 
							
								            "type": "FeatureCollection",
							 | 
						|||
| 
								 | 
							
								            "features": []
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    for (var j = 0; j < num; j++) {
							 | 
						|||
| 
								 | 
							
								        var point = util.randomPointsWithinBbox(xmin, xmax, ymin, ymax, 1)[0];
							 | 
						|||
| 
								 | 
							
								        if (!util.isDotInPolygon(point, polygon)) {
							 | 
						|||
| 
								 | 
							
								            j--;
							 | 
						|||
| 
								 | 
							
								        } else {
							 | 
						|||
| 
								 | 
							
								            if (type == "geojson") {
							 | 
						|||
| 
								 | 
							
								                var p = {
							 | 
						|||
| 
								 | 
							
								                    "type": "Feature",
							 | 
						|||
| 
								 | 
							
								                    "properties": {
							 | 
						|||
| 
								 | 
							
								                        "value": parseInt(Math.random() * 10000000)
							 | 
						|||
| 
								 | 
							
								                    },
							 | 
						|||
| 
								 | 
							
								                    "geometry": {
							 | 
						|||
| 
								 | 
							
								                        "type": "Point",
							 | 
						|||
| 
								 | 
							
								                        "coordinates": [point.x, point.y]
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                points.features.push(p);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            } else {
							 | 
						|||
| 
								 | 
							
								                points.push(point);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    return points;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								//生成矩形范围类随机点
							 | 
						|||
| 
								 | 
							
								util.randomPointsWithinBbox = function (xmin, xmax, ymin, ymax, num, type) {
							 | 
						|||
| 
								 | 
							
								    if (type && type == "geojson") {
							 | 
						|||
| 
								 | 
							
								        var points = {
							 | 
						|||
| 
								 | 
							
								            "type": "FeatureCollection",
							 | 
						|||
| 
								 | 
							
								            "features": []
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								        for (var i = 0; i < num; i++) {
							 | 
						|||
| 
								 | 
							
								            var point = {
							 | 
						|||
| 
								 | 
							
								                "type": "Feature",
							 | 
						|||
| 
								 | 
							
								                "properties": {
							 | 
						|||
| 
								 | 
							
								                    "value": parseInt(Math.random() * 10000000)
							 | 
						|||
| 
								 | 
							
								                },
							 | 
						|||
| 
								 | 
							
								                "geometry": {
							 | 
						|||
| 
								 | 
							
								                    "type": "Point",
							 | 
						|||
| 
								 | 
							
								                    "coordinates": [(Math.random() * (xmax - xmin) + xmin), (Math.random() * (ymax - ymin) + ymin)]
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            points.features.push(point);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        return points;
							 | 
						|||
| 
								 | 
							
								    } else {
							 | 
						|||
| 
								 | 
							
								        var points = [];
							 | 
						|||
| 
								 | 
							
								        for (var i = 0; i < num; i++) {
							 | 
						|||
| 
								 | 
							
								            var point = {
							 | 
						|||
| 
								 | 
							
								                x: (Math.random() * (xmax - xmin) + xmin),
							 | 
						|||
| 
								 | 
							
								                y: (Math.random() * (ymax - ymin) + ymin)
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            points.push(point);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        return points;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								//判断点在多边形上(平面)point:{x,y},polygonPoints:[{x,y},{x,y},{x,y}]
							 | 
						|||
| 
								 | 
							
								util.isDotInPolygon = function (point, polygonPoints, onborder = true) {
							 | 
						|||
| 
								 | 
							
								    var flag = false,
							 | 
						|||
| 
								 | 
							
								        p1,
							 | 
						|||
| 
								 | 
							
								        p2;
							 | 
						|||
| 
								 | 
							
								    if (!point.x) {
							 | 
						|||
| 
								 | 
							
								        point.x = point[0];
							 | 
						|||
| 
								 | 
							
								        point.y = point[1];
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    for (var i = 0, j = polygonPoints.length - 1; i < polygonPoints.length; j = i++) {
							 | 
						|||
| 
								 | 
							
								        p1 = polygonPoints[i];
							 | 
						|||
| 
								 | 
							
								        p2 = polygonPoints[j];
							 | 
						|||
| 
								 | 
							
								        p1 = p1.x ? {
							 | 
						|||
| 
								 | 
							
								            x: p1.x,
							 | 
						|||
| 
								 | 
							
								            y: p1.y
							 | 
						|||
| 
								 | 
							
								        } : {
							 | 
						|||
| 
								 | 
							
								            x: p1[0],
							 | 
						|||
| 
								 | 
							
								            y: p1[1]
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								        p2 = p2.x ? {
							 | 
						|||
| 
								 | 
							
								            x: p2.x,
							 | 
						|||
| 
								 | 
							
								            y: p2.y
							 | 
						|||
| 
								 | 
							
								        } : {
							 | 
						|||
| 
								 | 
							
								            x: p2[0],
							 | 
						|||
| 
								 | 
							
								            y: p2[1]
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								        if (onborder) {
							 | 
						|||
| 
								 | 
							
								            // 这里判断是否刚好被测点在多边形的边上
							 | 
						|||
| 
								 | 
							
								            if (util.onSegment(p1, p2, point)) return true;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        if ((p1.y > point.y != p2.y > point.y) && (point.x < (point.y - p1.y) * (p1.x - p2.x) / (p1.y - p2.y) +
							 | 
						|||
| 
								 | 
							
								                p1.x)) {
							 | 
						|||
| 
								 | 
							
								            flag = !flag;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    return flag;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								//判断点在线段上(平面)Pi:{x,y},Pj{x,y},Q{x,y}
							 | 
						|||
| 
								 | 
							
								util.onSegment = function (Pi, Pj, Q) {
							 | 
						|||
| 
								 | 
							
								    if ((Q.x - Pi.x) * (Pj.y - Pi.y) == (Pj.x - Pi.x) * (Q.y - Pi.y) //叉乘 
							 | 
						|||
| 
								 | 
							
								        //保证Q点坐标在pi,pj之间 
							 | 
						|||
| 
								 | 
							
								        &&
							 | 
						|||
| 
								 | 
							
								        Math.min(Pi.x, Pj.x) <= Q.x && Q.x <= Math.max(Pi.x, Pj.x) &&
							 | 
						|||
| 
								 | 
							
								        Math.min(Pi.y, Pj.y) <= Q.y && Q.y <= Math.max(Pi.y, Pj.y))
							 | 
						|||
| 
								 | 
							
								        return true;
							 | 
						|||
| 
								 | 
							
								    else
							 | 
						|||
| 
								 | 
							
								        return false;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								//获取json文件
							 | 
						|||
| 
								 | 
							
								util.getJSON = function (url, callback) {
							 | 
						|||
| 
								 | 
							
								    const xhr = new XMLHttpRequest();
							 | 
						|||
| 
								 | 
							
								    xhr.responseType = 'json';
							 | 
						|||
| 
								 | 
							
								    xhr.open('get', url, true);
							 | 
						|||
| 
								 | 
							
								    xhr.onload = function () {
							 | 
						|||
| 
								 | 
							
								        if (xhr.status >= 200 && xhr.status < 300) {
							 | 
						|||
| 
								 | 
							
								            callback(xhr.response);
							 | 
						|||
| 
								 | 
							
								        } else {
							 | 
						|||
| 
								 | 
							
								            throw new Error(xhr.statusText);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    };
							 | 
						|||
| 
								 | 
							
								    xhr.send();
							 | 
						|||
| 
								 | 
							
								}
							 |