书接上回
一加载服务
/**
* 加载scp
* @param model url:地址,name:名称,appid:token
*/
loadSCP: function (model) {
let entity = null;
if (model.appid) {
entity = {
name: model.name,
cullEnabled: false,
MinHeight: 30,
customRequestHeaders: {appid: model.appid}
}
} else {
entity = {
name: model.name,
MinHeight: 30,
cullEnabled: false
}
}
let scpPromise = supperMap.scene.addS3MTilesLayerByScp(model.url, entity)
Cesium.when.all([scpPromise], function (layers) {
layers.forEach(function (layer) {
layer._visibleDistanceMax = 2000;
});
}, function (e) {
if (supperMap.widget._showRenderLoopErrors) {
var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';
supperMap.widget.showErrorPanel(title, undefined, e);
}
});
},
/**
* 移除scp
* @param name
*/
removeScp: function (name) {
let layers = window.supperMap.scene.layers.layerQueue;
if (layers && layers.length > 0) {
// console.log(name)
layers.forEach(item => {
// console.log(item)
if (item.name == name) {
item.style3D.fillForeColor.alpha = parseFloat(0);
}
})
}
},
/**
* 加载3dtiles
* @param model {模型地址:modelUrl,模型位置:cameraPosition,模型俯仰角:cameraOrientation}
*/
load3Dtiles: function (url, func) {
// var tileset=supperMap.viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
// url:url
//
// }))
// console.log(tileset)
try {
//添加S3M图层服务
var promise = supperMap.scene.open(url);
Cesium.when(promise, function (layers) {
if (func) {
func(layers);
}
}, function (e) {
if (supperMap.widget._showRenderLoopErrors) {
var title = '渲染时发生错误,已停止渲染。';
supperMap.widget.showErrorPanel(title, undefined, e);
}
});
} catch (e) {
if (supperMap.widget._showRenderLoopErrors) {
var title = '渲染时发生错误,已停止渲染。';
supperMap.widget.showErrorPanel(title, undefined, e);
}
}
},
/**
* 移除3dtiles
*/
remove3Dtiles: function (url) {
for (let i = 0; i < supperMap.viewer.scene.primitives._primitives.length; i++) {
// supperMap.viewer.scene.primitives._primitives[i].show=false;
supperMap.viewer.scene.primitives._primitives[i]._context._clearColor.alpha = 0
supperMap.viewer.scene.primitives._primitives[i]._visible = true
}
console.log(supperMap.viewer.scene.primitives._primitives[0]._visible = true);
},
/**
* 加载wfs
* @param url
*/
loadWFS: function (url, id) {
var wfsKist = []
$.ajax({
url: url,
async: false, //改为同步
success: function (returnMap) {
returnMap.features.forEach(item => {
switch (item.geometry.type) {
case 'Point':
let entity = {
position: supperMap.Cesium.Cartesian3.fromDegrees(Number(item.geometry.coordinates[0]), Number(item.geometry.coordinates[1]), 0),
billboard: {
image: '../static/images/icons/binancs.png',
width: 30,
height: 40,
},
name: '',
id: item.id
}
wfsKist.push(entity.id);
// supperMap.wfsList.push(entity);
supperMap.viewer.entities.add(entity);
break;
case 'Polygon':
let list=[];
item.geometry.coordinates[0].forEach(item=>{
list.push(item[0]);
list.push(item[1]);
});
try {
let polygonId=supperMap.createPolygon(list,1,'#afca1a');
wfsKist.push(polygonId);
}catch (e) {
console.log(e)
}
break;
case 'LineString':
item.geometry.coordinates.forEach(position=>{
});
for(let i=1;i<item.geometry.coordinates.length;i++){
let polylineId=supperMap.createPolyLine(new Cesium.Cartesian3.fromDegrees(item.geometry.coordinates[i-1][0], item.geometry.coordinates[i-1][1], 2),new Cesium.Cartesian3.fromDegrees(item.geometry.coordinates[i][0], item.geometry.coordinates[i][1], 2));
wfsKist.push(polylineId);
}
break;
default :
console.log(item)
break;
}
});
},
error:function(){
console.log(e)
},
});
wfsKist.push(id)
window.treeService.localTree.wfsKists.push(wfsKist);
},
/**
* 移出WFS
* @param url
*/
removeWFS: function (id) {
if (window.treeService.localTree.wfsKists.length > 0) {
console.log(window.treeService.localTree.wfsKists)
for (var i = 0; i < window.treeService.localTree.wfsKists.length; i++) {
console.log(window.treeService.localTree.wfsKists[i][window.treeService.localTree.wfsKists[i].length - 1])
if (window.treeService.localTree.wfsKists[i][window.treeService.localTree.wfsKists[i].length - 1] == id) {
for (var j = 0; j < window.treeService.localTree.wfsKists[i].length; j++) {
console.log(window.treeService.localTree.wfsKists[i][j]);
window.supperMap.removeEntity(window.treeService.localTree.wfsKists[i][j]);
}
}
}
}
},
/**
* 加载wms
*/
loadWMS: function (url, viewFunc) {
let wmsProvider = null;
$.ajax({
url: url,
async: false,
success: function (response) {
let imageryLayers = supperMap.viewer.imageryLayers;
let obj = (JSON.parse(convertToJSON(response))).WMT_MS_Capabilities;
let list = [];
findWmsLayerList(obj.Capability, list);
wmsProvider = new Cesium.WebMapServiceImageryProvider({
url: url,
layers: list,
proxy: new Cesium.DefaultProxy('/proxy/'),
parameters: {
service: 'WMS',
format: 'image/png',
transparent: true
}
});
const layer = imageryLayers.addImageryProvider(wmsProvider, (imageryLayers._layers.length))
}
});
if (typeof viewFunc === 'function') {
//定位函数
viewFunc();
}
return wmsProvider;
},
/**
* 移除wms
*/
removeWMS: function (url) {
var layer = null;
var imageryLayersCoc = supperMap.viewer.imageryLayers
var imageryLayers = imageryLayersCoc._layers
for (let i = 0, j = imageryLayers.length; i < j; i++) {
const baseurl = imageryLayers[i].imageryProvider._baseUrl;
if (baseurl && baseurl == url) {
layer = imageryLayersCoc.get(i)
break;
}
}
if (layer) {
imageryLayersCoc.remove(layer, true)
}
},
/**
* 加载wmts
*/
loadWMTS: function (url, viewFunc) {
let layer;
$.ajax({
url: url,
async: false,
success: function (response) {
let imageryLayers = supperMap.viewer.imageryLayers;
// console.log()
let obj = (JSON.parse(convertToJSON(response)));
// console.log(obj)
const identifier = obj.Capabilities.Contents.Layer["ows:Identifier"];
const tileMatrixSet = obj.Capabilities.Contents.Layer.TileMatrixSetLink.TileMatrixSet;
const style = obj.Capabilities.Contents.Layer.Style["ows:Identifier"];
const formate = obj.Capabilities.Contents.Layer.Format;
const tileMatrix = obj.Capabilities.Contents.TileMatrixSet.TileMatrix;
const maximumLevel = obj.Capabilities.Contents.TileMatrixSet.TileMatrix["ows:Identifier"];
var tileMatrixLabels = [];
for (let i = 0; i <= Number(maximumLevel); i++) {
tileMatrixLabels.push(i)
}
var provider = new Cesium.WebMapTileServiceImageryProvider({
url: url,
layer: identifier,
style: style,
tileMatrixSetID: tileMatrixSet,
format: formate,
tilingScheme: new Cesium.GeographicTilingScheme(),
maximumLevel: maximumLevel,
tileMatrixLabels: tileMatrixLabels
});
layer = imageryLayers.addImageryProvider(provider, imageryLayers._layers.length);
}
});
if (typeof viewFunc === 'function') {
//定位函数
viewFunc();
}
return layer;
},
/**
* 移除wmts
* @param id
* @param url
*/
removeWMTS: function (id) {
var imageryLayers = supperMap.viewer.imageryLayers;
var layer = supperMap.getImagesLayerInView(id)
if (layer != null) {
imageryLayers.remove(layer, true)
}
},
/**
* 根据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
},
/**
* 加载地形
* 地址,定位函数
*/
loadTerrain: function (url, viewFunc) {
var terrainProvider = new Cesium.CesiumTerrainProvider({
url: url,
requestWaterMask: true,
requestVertexNormals: true,
//超图格式
isSct: false
})
supperMap.viewer.terrainProvider = terrainProvider;
supperMap.viewer.scene.globe.depthTestAgainstTerrain = false;
if (typeof viewFunc === 'function') {
//定位函数
viewFunc();
}
},
/**
* 移除地形
*/
removeTerrain: function () {
// console.log(supperMap.viewer.terrainProvider)
supperMap.viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider({});
;
},
/**
* 加载shp
* @param url
*/
loadShp: function (url, id, color) {
//设shp的数据结构为数组
let data = [];
shapefile.open(url)
.then(function (source) {
source.read().then(function log(result) {
let feature = result.value;
if (feature == undefined) {
return;
}
let geometry = feature.geometry;
switch (geometry.type) {
case 'Point':
//生成id
let pointId = window.supperMap.createPoint(new Cesium.Cartesian3.fromDegrees(Number(geometry.coordinates[0]), Number(geometry.coordinates[1]), 0), Cesium.Color.fromCssColorString(color));
//判断
if (window.treeService.localTree.shpMap.get(id)) {
window.treeService.localTree.shpMap.get(id).push(pointId);
} else {
//数组直接插入实体id
data.push(pointId);
window.treeService.localTree.shpMap.set(id, data)
}
break;
case 'LineString':
// console.log(JSON.stringify(result))
let startPosition = new Cesium.Cartesian3.fromDegrees(Number(geometry.coordinates[0][0]), Number(geometry.coordinates[0][1]), 0);
let endPosition = new Cesium.Cartesian3.fromDegrees(Number(geometry.coordinates[1][0]), Number(geometry.coordinates[1][1]), 0);
let lineId = window.supperMap.createPolyLine(startPosition, endPosition, Cesium.Color.fromCssColorString(color));
//判断集合里是否有该shp集合
if (window.treeService.localTree.shpMap.get(id)) {
window.treeService.localTree.shpMap.get(id).push(lineId);
} else {
//数组直接插入实体id
data.push(lineId);
window.treeService.localTree.shpMap.set(id, data)
}
break;
case 'Polygon':
let postiontList = [];
(geometry.coordinates[0]).forEach(function (item) {
postiontList.push(Number(item[0]));
postiontList.push(Number(item[1]));
});
let polygonId = window.supperMap.createPolygon(postiontList);
//判断集合里是否有该shp集合
if (window.treeService.localTree.shpMap.get(id)) {
window.treeService.localTree.shpMap.get(id).push(polygonId);
} else {
//数组直接插入实体id
data.push(polygonId);
window.treeService.localTree.shpMap.set(id, data)
}
break;
}
return source.read().then(log);
})
})
.catch(error => console.error(error.stack));
},
/**
* 移除shp
* @param name
*/
removeShp: function (name) {
window.treeService.localTree.shpMap.get(name).forEach(function (item, index) {
window.supperMap.removeEntity(item);
if (name == item) {
//移除实体
window.treeService.localTree.shpMap.get(name).remove(item);
//移除集合
window.treeService.localTree.shpMap.get(name).splice(index, 1);
}
})
},
/**
* 修改shp颜色
* @param name
*/
changeShpColor: function (name, color) {
// console.log(color)
// console.log(name)
window.treeService.localTree.shpMap.get(name).forEach(function (item, index) {
if (supperMap.viewer.entities.getById(item)._point) {
supperMap.viewer.entities.getById(item)._point._color._value = Cesium.Color.fromCssColorString(color);
return;
} else if (supperMap.viewer.entities.getById(item)._polyline) {
supperMap.viewer.entities.getById(item)._polyline._material._color._value = Cesium.Color.fromCssColorString(color)
return;
} else {
supperMap.viewer.entities.getById(item)._polygon._material._color._value = Cesium.Color.fromCssColorString(color)
return;
}
})
},
/**
* 加载kml文件
* @param url
*/
loadKML: function (url) {
var kmlOptions = {
camera: supperMap.viewer.scene.camera,
canvas: supperMap.viewer.scene.canvas,
clampToGround: true
};
supperMap.viewer.dataSources.add(Cesium.KmlDataSource.load(url, kmlOptions));
},
/**
* 移除kml,传入kml的文件名称,带后缀名
*/
removeKML: function (kmlName) {
window.supperMap.viewer.dataSources._dataSources.forEach(function (item, index) {
console.log(kmlName)
console.log(item);
if (item._name == kmlName) {
window.supperMap.viewer.dataSources.remove(item, true);
}
});
},
/**
* 加载geojson
* @param url
*/
loadGEOJSON: function (url, id) {
// Seed the random number generator for repeatable results.
supperMap.Cesium.Math.setRandomNumberSeed(0);
var promise = supperMap.Cesium.GeoJsonDataSource.load(
url
);
promise.then(function (dataSource) {
let data = [];
// supperMap.viewer.dataSources.add(dataSource);
dataSource.entities.values.forEach(function (item, index) {
// console.log(item)
//判断是点
if (item.billboard) {
let pointId = supperMap.createPoint(item._position._value, Cesium.Color.RED);
data.push(pointId);
} else if (item._polyline) {
let polylineId = supperMap.createPolyLineWithPositions(item._polyline._positions._value, Cesium.Color.RED);
data.push(polylineId);
} else if (item.polygon) {
supperMap.viewer.entities.add(item);
data.push(item.id)
}
});
window.treeService.localTree.GEOJSONMap.set(id, data);
}).otherwise(function (error) {
console.log(error)
});
},
/**
* 移除geojson
*/
removeGEOJSON: function (id) {
window.treeService.localTree.GEOJSONMap.get(id).forEach(function (item, index) {
window.supperMap.removeEntity(item);
if (id == item) {
//移除实体
window.treeService.localTree.GEOJSONMap.get(id).remove(item);
//移除集合
window.treeService.localTree.GEOJSONMap.get(id).splice(index, 1);
}
})
},
/**
* 改变geojson颜色
* @param name
* @param color
*/
changeGEOJSONColor: function (name, color) {
window.treeService.localTree.GEOJSONMap.get(name).forEach(function (item, index) {
if (supperMap.viewer.entities.getById(item)._point) {
supperMap.viewer.entities.getById(item)._point._color._value = Cesium.Color.fromCssColorString(color);
return;
} else if (supperMap.viewer.entities.getById(item)._polyline) {
supperMap.viewer.entities.getById(item)._polyline._material._color._value = Cesium.Color.fromCssColorString(color)
return;
} else {
supperMap.viewer.entities.getById(item)._polygon._material._color._value = Cesium.Color.fromCssColorString(color)
return;
}
})
},
二.小功能
/**
* 笛卡尔转换为经纬度
* @param position 例如 supperMap.cartesian2toDegrees(supperMap.viewer.camera.position):相机经纬度
* @returns {*[]}
*/
cartesian2toDegrees: function (position) {
var cartographic = Cesium.Cartographic.fromCartesian(position);
var longitude = Cesium.Math.toDegrees(cartographic.longitude);
var latitude = Cesium.Math.toDegrees(cartographic.latitude);
var height = cartographic.height;
return [longitude, latitude, height];
},
/**
* 相机默认监听事件 func为函数对象,当相机移动完成后执行改函数
*/
cameraEventListener: function (func) {
//先清空之前的监听事件
supperMap.viewer.scene.camera.moveEnd.addEventListener(function () {
if (func) {
func();
}
});
},
/**
* 移除相机默认监听事件 清空相机监听事件数组
*/
removeCameraEventListener: function () {
supperMap.viewer.scene.camera.moveEnd._listeners.length = 0
},
/**
* 根据id移除模型
* @param id
*/
removeEntity: function (id) {
// console.log(supperMap.viewer.entities.getById(id))
if (supperMap.viewer.entities.getById(id)) {
supperMap.viewer.entities.remove(supperMap.viewer.entities.getById(id));
}
},