181 lines
8.0 KiB
JavaScript
181 lines
8.0 KiB
JavaScript
|
var SysMathTool = (
|
|||
|
function () {
|
|||
|
var DeltaDegree = 0.00001;//插值间隔 单位度
|
|||
|
var DeltaRadian = 0.00001 * Math.PI / 180.0; //Cesium.Math.RADIANS_PER_DEGREE
|
|||
|
|
|||
|
function CheckLonDegree(value) {
|
|||
|
if (value > 180 || value < -180) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
function CheckLonRadian(value) {
|
|||
|
if (value > Math.PI || value < -Math.PI) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
function CheckLatDegree(value) {
|
|||
|
if (value > 90 || value < -90) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
function CheckLatRadian(value) {
|
|||
|
if (value > Math.PI / 2.0 || value < -Math.PI / 2.0) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
function _() {
|
|||
|
}
|
|||
|
_.GetDeltaDegree = function () {
|
|||
|
return DeltaDegree;
|
|||
|
}
|
|||
|
_.GetDeltaRadian = function () {
|
|||
|
return DeltaRadian;
|
|||
|
}
|
|||
|
/*
|
|||
|
线段插值
|
|||
|
经纬度坐标插值
|
|||
|
start.lon start.lat 单位:度
|
|||
|
return [[lon,lat],...]
|
|||
|
*/
|
|||
|
_.InterpolateLineLonlat = function (start, end) {
|
|||
|
if (start && end) { } else { return null; }
|
|||
|
if (start.lon && start.lat && end.lon && end.lat) { } else { return null; }
|
|||
|
if (CheckLonDegree(start.lon) && CheckLonDegree(end.lon) && CheckLatDegree(start.lat) && CheckLatDegree(end.lat)) { } else { return null; }
|
|||
|
var result = [];
|
|||
|
result.push([start.lon, start.lat]);
|
|||
|
var interval = Math.sqrt(Math.pow((end.lon - start.lon), 2) + Math.pow((end.lat - start.lat), 2));
|
|||
|
if (interval <= DeltaDegree) {
|
|||
|
//小于最小间隔
|
|||
|
result.push([end.lon, end.lat]);
|
|||
|
return result;
|
|||
|
} else {
|
|||
|
var num = interval / DeltaDegree;
|
|||
|
var stepLon = (end.lon - start.lon) / num;
|
|||
|
var stepLat = (end.lat - start.lat) / num;
|
|||
|
for (var i = 0; i < num; i++) {
|
|||
|
var lon = start.lon + (i + 1) * stepLon;
|
|||
|
var lat = start.lat + (i + 1) * stepLat;
|
|||
|
result.push([lon, lat]);
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
/*
|
|||
|
线段插值
|
|||
|
经纬度坐标插值
|
|||
|
Cartographic start.longitude start.latitude 单位:弧度
|
|||
|
return [Cartographic,...]
|
|||
|
*/
|
|||
|
_.InterpolateLineCartographic = function (start, end, _Delta) {
|
|||
|
if (start && end) { } else { return null; }
|
|||
|
if (start.longitude && start.latitude && end.longitude && end.latitude) { } else { return null; }
|
|||
|
var result = [];
|
|||
|
//开始点
|
|||
|
result.push(new Cesium.Cartographic(start.longitude, start.latitude));
|
|||
|
var interval = Math.sqrt(Math.pow((end.longitude - start.longitude), 2) + Math.pow((end.latitude - start.latitude), 2));
|
|||
|
var delta = _Delta && (typeof _Delta === 'number') ? _Delta : DeltaRadian;
|
|||
|
if (interval <= delta) {
|
|||
|
//小于最小间隔
|
|||
|
result.push(new Cesium.Cartographic(end.longitude, end.latitude));
|
|||
|
return result;
|
|||
|
} else {
|
|||
|
var num = interval / delta;
|
|||
|
var stepLon = (end.longitude - start.longitude) / num;
|
|||
|
var stepLat = (end.latitude - start.latitude) / num;
|
|||
|
for (var i = 0; i < num; i++) {
|
|||
|
var lon = start.longitude + (i + 1) * stepLon;
|
|||
|
var lat = start.latitude + (i + 1) * stepLat;
|
|||
|
result.push(new Cesium.Cartographic(lon, lat));//与最后一个点有偏差
|
|||
|
}
|
|||
|
result.push(new Cesium.Cartographic(end.longitude, end.latitude, end.height));
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
线段插值
|
|||
|
经纬度高程插值
|
|||
|
Cartographic start.longitude start.latitude 单位:弧度 start.height 高程单位m
|
|||
|
return [Cartographic,...]
|
|||
|
*/
|
|||
|
_.InterpolateLineHeightCartographic = function (start, end) {
|
|||
|
if (start && end) { } else { return null; }
|
|||
|
if (start.longitude && start.latitude && end.longitude && end.latitude) { } else { return null; }
|
|||
|
var result = [];
|
|||
|
result.push(new Cesium.Cartographic(start.longitude, start.latitude, start.height));
|
|||
|
var interval = Math.sqrt(Math.pow((end.longitude - start.longitude), 2) + Math.pow((end.latitude - start.latitude), 2));
|
|||
|
if (interval <= DeltaRadian) {
|
|||
|
//小于最小间隔
|
|||
|
result.push(new Cesium.Cartographic(end.longitude, end.latitude, end.height));
|
|||
|
return result;
|
|||
|
} else {
|
|||
|
var num = interval / DeltaRadian;
|
|||
|
var stepLon = (end.longitude - start.longitude) / num;
|
|||
|
var stepLat = (end.latitude - start.latitude) / num;
|
|||
|
var stepHeight = (end.height - start.height) / num;
|
|||
|
for (var i = 0; i < num; i++) {
|
|||
|
var lon = start.longitude + (i + 1) * stepLon;
|
|||
|
var lat = start.latitude + (i + 1) * stepLat;
|
|||
|
var hieght = start.height + (i + 1) * stepHeight;
|
|||
|
result.push(new Cesium.Cartographic(lon, lat, hieght));
|
|||
|
}
|
|||
|
result.push(new Cesium.Cartographic(end.longitude, end.latitude, end.height));
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
线段插值
|
|||
|
经纬度高程插值
|
|||
|
Cartographic start.longitude start.latitude 单位:弧度 start.height 高程单位m
|
|||
|
num:分总段数 传入数组长度-1
|
|||
|
index:获取到第index点的所有插值 0点是开始点
|
|||
|
return [Cartographic,...]
|
|||
|
*/
|
|||
|
_.Interpolate2IndexLineHeightCartographic = function (start, end, num, curIndex) {
|
|||
|
if (start && end) { } else { return null; }
|
|||
|
if (start.longitude && start.latitude && end.longitude && end.latitude) { } else { return null; }
|
|||
|
var result = [];
|
|||
|
result.push(new Cesium.Cartographic(start.longitude, start.latitude, start.height));
|
|||
|
var stepLon = (end.longitude - start.longitude) / num;
|
|||
|
var stepLat = (end.latitude - start.latitude) / num;
|
|||
|
var stepHeight = (end.height - start.height) / num;
|
|||
|
for (var i = 0; i < curIndex; i++) {
|
|||
|
var lon = start.longitude + (i + 1) * stepLon;
|
|||
|
var lat = start.latitude + (i + 1) * stepLat;
|
|||
|
var hieght = start.height + (i + 1) * stepHeight;
|
|||
|
result.push(new Cesium.Cartographic(lon, lat, hieght));
|
|||
|
}
|
|||
|
//result.push(new Cesium.Cartographic(end.longitude, end.latitude, end.height));
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
线段插值 指定第index值
|
|||
|
经纬度高程插值
|
|||
|
Cartographic start.longitude start.latitude 单位:弧度 start.height 高程单位m
|
|||
|
num:分总段数 传入数组长度-1
|
|||
|
index:获取第index个插值点 0点是开始点
|
|||
|
return Cartographic
|
|||
|
*/
|
|||
|
_.InterpolateIndexLineHeightCartographic = function (start, end, num, index) {
|
|||
|
if (start && end) { } else { return null; }
|
|||
|
if (start.longitude && start.latitude && end.longitude && end.latitude) { } else { return null; }
|
|||
|
//var delta = _Delta && (typeof _Delta === 'number') ? _Delta : DeltaRadian;
|
|||
|
var stepLon = (end.longitude - start.longitude) / num;
|
|||
|
var stepLat = (end.latitude - start.latitude) / num;
|
|||
|
var stepHeight = (end.height - start.height) / num;
|
|||
|
var lon = start.longitude + index * stepLon;
|
|||
|
var lat = start.latitude + index * stepLat;
|
|||
|
var hieght = start.height + index * stepHeight;
|
|||
|
var result = new Cesium.Cartographic(lon, lat, hieght);
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
return _;
|
|||
|
})();
|