一.使用分析
//缓冲区分析
bufferAnalysis: {
//点
point: {
//点
pointHandler: null,
//点画半径展示的线
pointPolylineHandler: null,
//圆心
pointCircleCenter: null,
//半径
pointCircleRadius: null,
//点击数量
clickCount: 0,
//需要分析的实体
pointService: [],
//点加载的实体id
pointEntities: [],
//缓冲区实体集合
bufferEntityList: [],
/**
* 销毁点
*/
destory: function () {
supperMap.bufferAnalysis.point.pointHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
supperMap.bufferAnalysis.point.pointPolylineHandler.deactivate();
supperMap.bufferAnalysis.point.pointCircleCenter = null;
supperMap.bufferAnalysis.point.pointCircleRadius = null;
supperMap.bufferAnalysis.point.clickCount = 0;
supperMap.bufferAnalysis.point.pointService.length = 0;
supperMap.bufferAnalysis.point.pointEntities.forEach(item => {
console.log(item)
supperMap.removeEntity(item);
});
supperMap.bufferAnalysis.point.bufferEntityList.forEach(item => {
console.log(item)
supperMap.removeEntity(item);
});
}
},
/**
* 点初始化
* @param PointList(点集合)
*/
pointInit: function () {
this.point.pointHandler = new Cesium.ScreenSpaceEventHandler(supperMap.scene.canvas);
this.point.pointPolylineHandler = new Cesium.DrawHandler(supperMap.viewer, Cesium.DrawMode.Line);
this.point.pointHandler.setInputAction(function (evt) {
var position = supperMap.scene.pickPosition(evt.position);
supperMap.bufferAnalysis.point.clickCount++;
if (supperMap.bufferAnalysis.point.clickCount == 2) {
//半径
supperMap.bufferAnalysis.point.pointCircleRadius = supperMap.getDisTance({
lon: supperMap.bufferAnalysis.point.pointCircleCenter[0],
lat: supperMap.bufferAnalysis.point.pointCircleCenter[1],
height: supperMap.bufferAnalysis.point.pointCircleCenter[2]
}, {
lon: supperMap.cartesian2toDegrees(position)[0],
lat: supperMap.cartesian2toDegrees(position)[1],
height: supperMap.cartesian2toDegrees(position)[1]
}) / 1000
//缓冲区位置
let turfPositions = turf.point([supperMap.bufferAnalysis.point.pointCircleCenter[0], supperMap.bufferAnalysis.point.pointCircleCenter[1]])
//创建缓冲区
supperMap.bufferAnalysis.point.bufferEntityList.push(supperMap.bufferAnalysis.createGraphicsBuffer({
viewer: supperMap.viewer,
animation: false,
turfPositions: turfPositions,
radius: supperMap.bufferAnalysis.point.pointCircleRadius,
height: supperMap.bufferAnalysis.point.pointCircleCenter[2],
entityList: supperMap.bufferAnalysis.point.pointService
}))
//重置点击事件
supperMap.bufferAnalysis.point.clickCount = 0;
supperMap.bufferAnalysis.point.pointPolylineHandler.deactivate();
supperMap.bufferAnalysis.point.pointPolylineHandler.clear();
} else {
//设置圆心
supperMap.bufferAnalysis.point.pointCircleCenter = supperMap.cartesian2toDegrees(position);
//开启画线
supperMap.bufferAnalysis.point.pointPolylineHandler.activate();
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
},
//销毁
destory: function () {
//销毁点
supperMap.bufferAnalysis.point.destory();
},
/**
* 创建缓冲区
* @param params
* @returns {*}
*/
createGraphicsBuffer: function (params = {}) {
let _turfPositions = params.turfPositions || [];
//材质
let _material = params.material || [];
//动画
let _animation = params.animation || false;
//缓冲区实体
let _bufferEntity = new Cesium.Entity();
//绘制的缓冲区多边形
let _hierarchy = new Cesium.PolygonHierarchy()
//半径
let _radius = params.radius || 0.1;
//半径
let radius = 0;
//高度
let height = params.height;
//被分析的集合
let entityList = params.entityList;
//缓冲区的id
let bufferId = generateUUID();
/**
* 转换函数
* @param arr
* @returns {Array}
*/
const parse = (arr) => {
var buffered = [];
for (var i = 0; i < arr.length; i++) {
buffered = buffered.concat(arr[i]);
}
return buffered
}
//缓冲区id
_bufferEntity.id = bufferId;
_bufferEntity.animation = _animation;
_bufferEntity.polygon = {
material: Cesium.Color.SKYBLUE.withAlpha(0.5),
hierarchy: new Cesium.CallbackProperty(function (time, result) {
if (_bufferEntity.animation === undefined || _bufferEntity.animation) { // 动画
if (radius <= _radius) {
radius += 0.02
} else {
radius = 0.02
}
} else {
radius = _radius
}
let buffered = parse(
turf.buffer(_turfPositions, radius, {units: 'kilometers'}).geometry
.coordinates[0]
)
_hierarchy.positions = Cesium.Cartesian3.fromDegreesArray(buffered, Cesium.Ellipsoid.WGS84, result)
return _hierarchy;
}, false),
}
let buffer = {
id: bufferId,
animation: _animation,
polygon: {
height: height,
material: Cesium.Color.SKYBLUE.withAlpha(0.5),
hierarchy: new Cesium.CallbackProperty(function (time, result) {
if (_bufferEntity.animation === undefined || _bufferEntity.animation) { // 动画
if (radius <= _radius) {
radius += 0.02
} else {
radius = 0.02
}
} else {
radius = _radius
}
let buffered = parse(
turf.buffer(_turfPositions, radius, {units: 'kilometers'}).geometry
.coordinates[0]
)
_hierarchy.positions = Cesium.Cartesian3.fromDegreesArray(buffered, Cesium.Ellipsoid.WGS84, result)
return _hierarchy;
}, false),
}
}
//添加缓冲区
supperMap.viewer.entities.add(buffer)
//创建分析面
var poly = turf.circle([supperMap.bufferAnalysis.point.pointCircleCenter[0], supperMap.bufferAnalysis.point.pointCircleCenter[1]], supperMap.bufferAnalysis.point.pointCircleRadius, {units: 'kilometers'});
//循环实体集合
entityList.forEach(item => {
let pointPosition = supperMap.cartesian2toDegrees(item);
let point = turf.point(pointPosition);
if (turf.booleanPointInPolygon(point, poly)) {
console.log(item)
let pointId = supperMap.createPoint(item, Cesium.Color.RED);
supperMap.bufferAnalysis.point.pointEntities.push(pointId);
// data.push(pointId);
}
});
return bufferId;
},
/**
* 读取geojson
*/
getGEOJSONData: function (url) {
// Seed the random number generator for repeatable results.
supperMap.Cesium.Math.setRandomNumberSeed(0);
var promise = supperMap.Cesium.GeoJsonDataSource.load(
url
);
promise.then(function (dataSource) {
// supperMap.viewer.dataSources.add(dataSource);
dataSource.entities.values.forEach(function (item, index) {
//判断是点
if (item.billboard) {
supperMap.bufferAnalysis.point.pointService.push(item.position._value);
}
});
}).otherwise(function (error) {
console.log(error)
});
}
},
//挖方分析
excavationAnalysis:{
//默认空间模式
clampMode:0,
//挖方点击
handlerPolygon:null,
//工具条
tooltip:null,
//高度
dep:0,
//面点击事件
handlerArea:null,
//体积
volume:null,
//回调函数
callback:null,
clickCount:null,
positions:null,
//用户画的面
polyData: [],
//初始化任意绘制挖方
init:function(){
this.handlerPolygon=new Cesium.DrawHandler(supperMap.viewer, Cesium.DrawMode.Polygon, this.clampMode);
this.tooltip = createTooltip(document.body);
this.handlerPolygon.drawEvt.addEventListener(function (result) {
supperMap.excavationAnalysis.handlerPolygon.polygon.show = false;
supperMap.excavationAnalysis.handlerPolygon.deactivate();
supperMap.excavationAnalysis.tooltip.setVisible(false);
var array = [].concat(result.object.positions);
var positions = [];
var positionsii = [];
for (var i = 0, len = array.length; i < len; i++) {
var cartographic = Cesium.Cartographic.fromCartesian(array[i]);
var longitude = Cesium.Math.toDegrees(cartographic.longitude);
var latitude = Cesium.Math.toDegrees(cartographic.latitude);
if (positions.indexOf(longitude) == -1 && positions.indexOf(latitude) == -1) {
positions.push(longitude);
positions.push(latitude);
positions.push(supperMap.excavationAnalysis.dep);
positionsii.push({
x: longitude,
y: latitude
});
}
}
//此处用的地形修改 而不是地形开挖
supperMap.viewer.scene.globe.removeAllModifyRegion();
supperMap.viewer.scene.globe.addModifyRegion({
name: 'ggg',
position: positions
});
var length = [];
length.push(positionsii.length);
});
this.handlerArea = new Cesium.MeasureHandler(supperMap.viewer, Cesium.MeasureMode.Area, 1);
this.handlerArea.measureEvt.addEventListener(function (result) {
var mj = Number(result.area);
var selOptV = $("#selOpt").val();
var positions = result.positions;
if (selOptV == 3 || selOptV == 4) {
mj = Number(supperMap.calcClampValue(positions));
} else if (selOptV == 5) {
mj = Number(supperMap.calcAreaWithoutHeight(positions));
}
var area = mj > 1000000 ? (mj / 1000000).toFixed(2) : mj.toFixed(2);
supperMap.excavationAnalysis.volume=Math.abs(supperMap.excavationAnalysis.dep)*Number(area);
if(supperMap.excavationAnalysis.callback){
supperMap.excavationAnalysis.callback();
}
supperMap.excavationAnalysis.handlerArea.clear();
});
//选中
this.handlerArea && this.handlerArea.activate();
},
//初始化矩形绘制挖方
initRectangle:function(){
this.tooltip = createTooltip(document.body);
this.clickCount = 0;
this.positions = [];
this.screenSpaceEventHandler = new Cesium.ScreenSpaceEventHandler(supperMap.scene.canvas);
this.handlerPolygon = new Cesium.DrawHandler(supperMap.viewer, Cesium.DrawMode.Line);
this.handlerPolygon.activate();
this.screenSpaceEventHandler.setInputAction(function (evt) {
var position = supperMap.scene.pickPosition(evt.position);
supperMap.excavationAnalysis.positions.push(position);
supperMap.excavationAnalysis.clickCount++;
//判断点击了几下
if (supperMap.excavationAnalysis.clickCount === 2 && supperMap.excavationAnalysis.positions.length === 2) {
supperMap.excavationAnalysis.handlerPolygon.drawEvt.raiseEvent(supperMap.excavationAnalysis.positions);
supperMap.excavationAnalysis.polyData = [];
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
this.handlerPolygon.drawEvt.addEventListener(function (result) {
// // console.log(result);
supperMap.excavationAnalysis.handlerPolygon.deactivate();
supperMap.excavationAnalysis.handlerPolygon.polyline.show = false;
//标注点重构
let point1 = {x:result[0].x, y:result[0].y,z:result[1].z};
let point2 = {x:result[0].x, y:result[1].y,z:result[0].z};
let point3 = {x:result[1].x, y:result[1].y,z:result[0].z};
let point4 = {x:result[1].x, y:result[0].y,z:result[1].z};
var array = [];
array.push(point1, point2, point3, point4);
//矢量转为经纬度坐标
var dian1 = supperMap.cartesian2toDegrees(result[0]);
var dian2 = supperMap.cartesian2toDegrees(result[1]);
var weiduMi = Math.abs((dian1[1]-dian2[1])*1111000); //纬度米
var jingduMi = Math.abs((dian1[0]-dian2[0])*91.00779212050698783); //经度米
supperMap.excavationAnalysis.volume = Math.abs(weiduMi*jingduMi*supperMap.excavationAnalysis.dep);//体积
if(supperMap.excavationAnalysis.callback){
supperMap.excavationAnalysis.callback();
}
// let postiontList = [];
// var height = '';
// for (var i = 0; i < array.length; i++) {
// // console.log(supperMap.cartesian2toDegrees(aaa)[0]);
// postiontList.push(Number(supperMap.cartesian2toDegrees(array[i])[0]));
// postiontList.push(Number(supperMap.cartesian2toDegrees(array[i])[1]));
// height = 0;
// }
// window.supperMap.createPolygon(postiontList, height);
var positions = [];
var positionsii = [];
for (var i = 0, len = array.length; i < len; i++) {
var cartographic = Cesium.Cartographic.fromCartesian(array[i]);
var longitude = Cesium.Math.toDegrees(cartographic.longitude);
var latitude = Cesium.Math.toDegrees(cartographic.latitude);
if (positions.indexOf(longitude) == -1 && positions.indexOf(latitude) == -1) {
positions.push(longitude);
positions.push(latitude);
positions.push(supperMap.excavationAnalysis.dep);
positionsii.push({
x: longitude,
y: latitude
});
}
}
//此处用的地形修改 而不是地形开挖
supperMap.viewer.scene.globe.removeAllModifyRegion();
supperMap.viewer.scene.globe.addModifyRegion({
name: 'ggg',
position: positions
});
var length = [];
length.push(positionsii.length);
supperMap.excavationAnalysis.clickCount = 0;
supperMap.excavationAnalysis.positions = [];
supperMap.excavationAnalysis.handlerPolygon.activate();
});
},
begin:function(){
this.handlerPolygon.activate();
},
destory:function(){
if(this.handlerArea){
this.handlerArea.clear();
this.handlerArea.deactivate();
}
supperMap.viewer.scene.globe.removeAllModifyRegion();
if(this.handlerPolygon){
this.handlerPolygon.clear();
}
if (supperMap.excavationAnalysis.handlerPolygon) {
supperMap.excavationAnalysis.handlerPolygon.polyline.show = true;
supperMap.excavationAnalysis.handlerPolygon.clear();
}
if (supperMap.excavationAnalysis.screenSpaceEventHandler) {
supperMap.excavationAnalysis.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
supperMap.excavationAnalysis.screenSpaceEventHandler = null;
}
supperMap.excavationAnalysis.polyData = [];
supperMap.excavationAnalysis.pts = null;
supperMap.removeCameraEventListener();
},
},
//挖方测量
measure: {
type: '',
//初始化画高
handlerHeight: null,
//初始化画面
handlerArea: null,
//初始化测量距离
handlerDis: null,
// 空间模式
clampMode: 0,
/**
* 初始化高度测量
*/
initHeight: function () {
//初始化画高
this.handlerHeight = new Cesium.MeasureHandler(supperMap.viewer, Cesium.MeasureMode.DVH);
this.handlerHeight.measureEvt.addEventListener(function (result) {
var distance = result.distance > 1000 ? (result.distance / 1000).toFixed(2) + 'km' : result.distance + 'm';
var vHeight = result.verticalHeight > 1000 ? (result.verticalHeight / 1000).toFixed(2) + 'km' : result.verticalHeight + 'm';
var hDistance = result.horizontalDistance > 1000 ? (result.horizontalDistance / 1000).toFixed(2) + 'km' : result.horizontalDistance + 'm';
supperMap.measure.handlerHeight.disLabel.text = '空间距离:' + distance;
supperMap.measure.handlerHeight.vLabel.text = '垂直高度:' + vHeight;
supperMap.measure.handlerHeight.hLabel.text = '水平距离:' + hDistance;
});
this.handlerHeight.activeEvt.addEventListener(function (isActive) {
if (isActive == true) {
supperMap.viewer.enableCursorStyle = false;
supperMap.viewer._element.style.cursor = '';
$('body').removeClass('measureCur').addClass('measureCur');
}
else {
supperMap.viewer.enableCursorStyle = true;
$('body').removeClass('measureCur');
}
});
//选中
supperMap.measure.handlerHeight && supperMap.measure.handlerHeight.activate();
},
/**
* 初始化画面
*/
initArea: function () {
this.handlerArea = new Cesium.MeasureHandler(supperMap.viewer, Cesium.MeasureMode.Area, supperMap.measure.clampMode);
this.handlerArea.measureEvt.addEventListener(function (result) {
var mj = Number(result.area);
var selOptV = $("#selOpt").val();
var positions = result.positions;
if (selOptV == 3 || selOptV == 4) {
mj = Number(supperMap.calcClampValue(positions));
} else if (selOptV == 5) {
mj = Number(supperMap.calcAreaWithoutHeight(positions));
}
var area = mj > 1000000 ? (mj / 1000000).toFixed(2) + 'km²' : mj.toFixed(2) + '㎡'
supperMap.measure.handlerArea.areaLabel.text = '面积:' + area;
});
this.handlerArea.activeEvt.addEventListener(function (isActive) {
if (isActive == true) {
supperMap.viewer.enableCursorStyle = false;
supperMap.viewer._element.style.cursor = '';
$('body').removeClass('measureCur').addClass('measureCur');
}
else {
supperMap.viewer.enableCursorStyle = true;
$('body').removeClass('measureCur');
}
});
//选中
supperMap.measure.handlerArea && supperMap.measure.handlerArea.activate();
},
/**
* 初始化距离
*/
initDis: function () {
this.handlerDis = new Cesium.MeasureHandler(supperMap.viewer, Cesium.MeasureMode.Distance, supperMap.measure.clampMode);
//注册测距功能事件
this.handlerDis.measureEvt.addEventListener(function (result) {
var dis = Number(result.distance);
var selOptV = $("#selOpt").val();
var positions = result.positions;
if (selOptV == 3 || selOptV == 4) {
dis = Number(supperMap.calcClampDistance(positions));
}
var distance = dis > 1000 ? (dis / 1000).toFixed(2) + 'km' : dis.toFixed(2) + 'm';
supperMap.measure.handlerDis.disLabel.text = '距离:' + distance;
});
this.handlerDis.activeEvt.addEventListener(function (isActive) {
if (isActive == true) {
supperMap.viewer.enableCursorStyle = false;
supperMap.viewer._element.style.cursor = '';
$('body').removeClass('measureCur').addClass('measureCur');
}
else {
supperMap.viewer.enableCursorStyle = true;
$('body').removeClass('measureCur');
}
});
//选中
supperMap.measure.handlerDis && supperMap.measure.handlerDis.activate();
},
/**
* 清除
*/
clear: function () {
this.handlerDis && this.handlerDis.clear();
this.handlerArea && this.handlerArea.clear();
this.handlerHeight && this.handlerHeight.clear();
},
/**
* 销毁函数
*/
destory: function () {
this.type = '';
this.handlerDis && this.handlerDis.deactivate();
this.handlerArea && this.handlerArea.deactivate();
this.handlerHeight && this.handlerHeight.deactivate();
this.handlerDis && this.handlerDis.clear();
this.handlerArea && this.handlerArea.clear();
this.handlerHeight && this.handlerHeight.clear();
}
},
二.小功能
/**
* 两点之间算距离
* @param begin
* @param end
* @returns {number}
*/
getDisTance: function (begin, end) {
var satrtPoint = Cesium.Cartographic.fromDegrees(Number(begin.lon), Number(begin.lat), Number(begin.height))
var endPoint = Cesium.Cartographic.fromDegrees(Number(end.lon), Number(end.lat), Number(end.height))
var geodesic = new Cesium.EllipsoidGeodesic();
geodesic.setEndPoints(satrtPoint, endPoint);
var a = geodesic.surfaceDistance;
let b = Math.abs(satrtPoint.height - endPoint.height);
let distance = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
return distance;
},
/**
let point1 = supperMap.calculatingTargetPoints(treeService.cameraTree.buffer.centerPosition[0], treeService.cameraTree.buffer.centerPosition[1], treeService.cameraTree.buffer.centerPosition[2], 2 * 3.14 / 360 * 30, 500);(2 * 3.14 / 360 * 30为30°)
* 根据距离方向和观察点计算目标点(109.878321 19.963493 82 0 500)
* @param {Object} lon 经度
* @param {Object} lat 维度
* @param {Object} height 高度
* @param {Object} direction 方向
* @param {Object} radius 可视距离
*/
calculatingTargetPoints: function (lon, lat, height, direction, radius) {
// 观察点
var viewPoint = Cesium.Cartesian3.fromDegrees(lon, lat, height);
// 世界坐标转换为投影坐标
var webMercatorProjection = new Cesium.WebMercatorProjection(supperMap.viewer.scene.globe.ellipsoid);
var viewPointWebMercator = webMercatorProjection.project(Cesium.Cartographic.fromCartesian(viewPoint));
// 计算目标点
var toPoint = new Cesium.Cartesian3(viewPointWebMercator.x + radius * Math.cos(direction), viewPointWebMercator.y +
radius * Math.sin(direction), 0);
// 投影坐标转世界坐标
toPoint = webMercatorProjection.unproject(toPoint);
toPoint = Cesium.Cartographic.toCartesian(toPoint.clone());
// 世界坐标转地理坐标
var cartographic = Cesium.Cartographic.fromCartesian(toPoint);
var point = [Cesium.Math.toDegrees(cartographic.longitude), Cesium.Math.toDegrees(cartographic.latitude)];
return point;
},
/**
* 根据id找图片图层
* @param id
* @returns {*}
*/
getImagesLayerInView: function (id) {
var imageryLayersCoc = supperMap.viewer.imageryLayers
var imageryLayers = imageryLayersCoc._layers
var layer = null
for (var i = 0; i < imageryLayers.length; i++) {
console.log(imageryLayers[i].imageryProvider._layer)
if (imageryLayers[i].imageryProvider._layer === id) {
layer = imageryLayersCoc.get(i)
break
}
}
return layer
},
/**
* 椭球贴地面积
* @param positions
* @returns {number}
*/
calcClampValue: function (positions) {
var lonlat = [];
var value = 0;
for (var i = 0; i < positions.length; i++) {
var cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
var lon = Cesium.Math.toDegrees(cartographic.longitude);
var lat = Cesium.Math.toDegrees(cartographic.latitude);
lonlat.push(lon, lat);
}
var gemetry = new Cesium.PolygonGeometry.fromPositions({
positions: Cesium.Cartesian3.fromDegreesArray(lonlat)
});
var selOptV = $("#selOpt").val();
if (selOptV == 3) {
value = scene.globe.computeSurfaceArea(gemetry, Cesium.Ellipsoid.CGCS2000);
} else if (selOptV == 4) {
value = scene.globe.computeSurfaceArea(gemetry, Cesium.Ellipsoid.XIAN80);
}
return value;
},
/**
* 椭球贴地距离
* @param positions
* @returns {number}
*/
calcClampDistance: function (positions) {
var lonlat = [];
var value = 0;
for (var i = 0; i < positions.length; i++) {
var cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
var lon = Cesium.Math.toDegrees(cartographic.longitude);
var lat = Cesium.Math.toDegrees(cartographic.latitude);
lonlat.push(lon, lat);
}
var gemetry = new Cesium.PolylineGeometry({
positions: Cesium.Cartesian3.fromDegreesArray(lonlat)
});
var selOptV = $("#selOpt").val();
if (selOptV == 3) {
value = scene.globe.computeSurfaceDistance(gemetry, Cesium.Ellipsoid.CGCS2000);
} else if (selOptV == 4) {
value = scene.globe.computeSurfaceDistance(gemetry, Cesium.Ellipsoid.XIAN80);
}
return value;
},
/**
* 椭球贴地高度
* @param positions
* @returns {*}
*/
calcAreaWithoutHeight: function (positions) {
var totalLon = 0;
for (var i = 0; i < positions.length; i++) {
var cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
var lon = Cesium.Math.toDegrees(cartographic.longitude);
totalLon += lon;
}
var dh = Math.round((totalLon / positions.length + 6) / 6);//带号
var centralMeridian = dh * 6 - 3;
//高斯投影
var projection = new Cesium.CustomProjection({
name: "tmerc",
centralMeridian: centralMeridian,
primeMeridian: 0,
standardParallel_1: 0,
standardParallel_2: 0,
eastFalse: 500000.0,
northFalse: 0.0,
semimajorAxis: 6378137,
inverseFlattening: 298.257222101
});
var cartesians = [];
for (var i = 0; i < positions.length; i++) {
var cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
var cartesian = projection.project(cartographic);
cartesians.push(cartesian);
}
cartesians.push(cartesians[0]);//首尾相接
var value = Cesium.getPreciseArea(cartesians, "China2000", centralMeridian, dh, 1);
return value;
},