learning_cesium/在线编辑.html

541 lines
21 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<!-- Use correct character set. -->
<meta charset="utf-8" />
<!-- Tell IE to use the latest, best version. -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
/>
<title>Learning Cesium!</title>
<script src="./Build/Cesium/Cesium.js"></script>
<style>
@import url(./Build/Cesium/Widgets/widgets.css);
html,
body,
#app,
#cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
.menu-container {
position: absolute;
top: 30px;
left: 100px;
z-index: 9999;
}
</style>
<!-- 引入样式 -->
<link rel="stylesheet" href="./js/elementui/index.css" />
<!-- import Vue before Element -->
<script src="./js/vue2710.js"></script>
<!-- import JavaScript -->
<script src="./js/elementui/index.js"></script>
</head>
<body>
<div id="app">
<div class="menu-container">
<el-button
v-if="isEditStatus"
class="custom green button map-btn"
@click="editPoint"
>编辑范围</el-button
>
<el-button v-else class="custom green button map-btn" @click="addPoint"
>添加范围</el-button
>
<el-button class="custom green button map-btn" @click="savePoint"
>保存范围</el-button
>
</div>
<div id="cesiumContainer"></div>
</div>
<script>
Cesium.Ion.defaultAccessToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
new Vue({
el: "#app",
data() {
return {
polygonPointsEntities: [], // 区域的点位集合
polygonPointsEntitiesLine: [], // 连线的多点
polygonPointsEntitiesEntity: [], // 区域查询所画线实体
pointPositionList: [], // 画点的经纬度集合
editPoints: [], // 编辑时编辑点集合,删除点用
isAddStatus: false, // 是否是添加区域
isEditStatus: false, // 是否是编辑区域
spaceArea: "", // 区域范围坐标
polygonEntity: null, // 区域面实体
isSaved: false, // 保存状态
viewer: null, // 地图实例化
curBillboard: null, // 当前高亮的广告牌
entityMarkerList: [], // 地图上点的资源实体对象集合
companyPoint: [], // 企业上点数据
// 标注图层
tdtImgAnnoLayerProvider:
new Cesium.WebMapTileServiceImageryProvider({
url: "http://t6.tianditu.com/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=b6b320a7ccfabfdc30536330efc07f3e",
layer: "tdtImgAnnoLayer",
style: "default",
format: "image/jpeg",
tileMatrixSetID: "GoogleMapsCompatible",
}),
};
},
mounted() {
this.initMap(119.666612, 34.249119, 40000);
// if (this.parentRow.id) {
// this.getGridDetail();
// }
},
methods: {
// 获取网格信息
getGridDetail() {
this.axios
.get(`${gridSettingManagement.detail}/${this.parentRow.id}`)
.then((res) => {
if (
res.data.returnCode === "0000000" &&
res.data.data.coordinate
) {
let path = [];
this.pointPositionList = res.data.data.coordinate.split(",");
this.pointPositionList.map((item) => {
path.push(Number(item));
});
this.polygonEntity = this.viewer.entities.add({
name: "polygon",
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray(path),
material: new Cesium.Color.fromCssColorString(
"#4296FF"
).withAlpha(0.4),
},
range: path,
});
this.isEditStatus = true;
}
});
},
// 保存范围
savePoint() {
let poinstArrString = this.pointPositionList.join(",");
let query = {
streetId: "12",
coordinate: poinstArrString,
};
this.axios
.post(gridSettingManagement.saveSpace, query)
.then((res) => {
if (res.data.returnCode === "0000000") {
this.$message({ type: "success", message: "保存成功!" });
this.$emit("hideDialog");
}
});
},
// 编辑范围
editPoint() {
this.polygonEntity.polygon.hierarchy._value.positions.forEach(
(item) => {
let cartesian = new Cesium.Cartesian3(
item.x,
item.y,
item.z,
item.z
);
let point = this.viewer.entities.add({
name: "gon_point",
position: cartesian,
point: {
color: Cesium.Color.WHITE,
pixelSize: 10,
outlineColor: Cesium.Color.BLACK,
outlineWidth: 1,
},
});
this.editPoints.push(point);
this.polygonPointsEntities.push(cartesian);
this.viewer.scene.screenSpaceCameraController.enableRotate = false;
this.viewer.scene.screenSpaceCameraController.enableZoom = false;
}
);
},
// 添加范围
addPoint() {
if (this.polygonEntity && !this.isSaved) {
this.$message({
type: "warning",
message: "请先保存勾画的范围!",
});
return;
}
this.isSaved = false;
this.isAddStatus = true;
},
// 初始化地图(根据当前企业所在位置初始化中心位置)
initMap(longitude, latitude, height) {
Cesium.Ion.defaultAccessToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJmNjJkN2ZjNC04OTYxLTQyZmItYmM5Mi0yOTgyMzQxMjEzZGQiLCJpZCI6MTg5NTIsInNjb3BlcyI6WyJhc2wiLCJhc3IiLCJhc3ciLCJnYyIsInByIl0sImlhdCI6MTU4OTYyODkwMn0.ibuCu13_8ksLkyimUHR4e1LrWRb-_sfZrPMhSWSzJBg";
let viewer = new Cesium.Viewer("cesiumContainer", {
baseLayerPicker: false,
geocoder: false, // 是否显示地名查找控件
homeButton: false,
sceneModePicker: false, // 是否显示投影方式控件
selectionIndicator: false,
baseLayerPicker: false, // 是否显示图层选择控件
navigationHelpButton: false, // 是否显示帮助信息控件
animation: false, // 是否显示动画控件
// creditContainer: "credit",
timeline: false, // 是否显示时间线控件
fullscreenButton: false,
vrButton: false,
infoBox: false, // 是否显示点击要素之后显示的信息
// requestRenderMode: true, // 启用请求渲染模式
scene3DOnly: true, // 每个几何实例将只能以3D渲染以节省GPU内存
sceneMode: 3, // 初始场景模式 1 2D模式 2 2D循环模式 3 3D模式 Cesium.SceneMode
imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
url: "http://t0.tianditu.gov.cn/img_w/wmts?tk=b6b320a7ccfabfdc30536330efc07f3e",
layer: "img",
style: "default",
tileMatrixSetID: "w",
format: "tiles",
maximumLevel: 18,
}),
});
this.viewer = viewer;
this.viewer._cesiumWidget._creditContainer.style.display = "none";
this.viewer.scene.globe.depthTestAgainstTerrain = false; // 图标被遮挡
this.viewer.scene.fxaa = false;
// 设置后当相机高度达到设置的最大和最小高度时将不再放大和缩小
this.viewer.scene.screenSpaceCameraController.minimumZoomDistance = 0; // 相机的高度的最小值
this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = 20000000; // 相机高度的最大值
// 天地图矢量标注图层
this.tdtImgAnnoLayer = this.viewer.imageryLayers.addImageryProvider(
this.tdtImgAnnoLayerProvider
);
this.viewer.imageryLayers.raiseToTop(this.tdtImgAnnoLayer);
// 定位到中心点
// this.flyTo([Number(longitude), Number(latitude)], height,0);
this.setQiantang();
// 关闭双击事件
this.viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
);
this.addMouseListener(); // 地图鼠标移动事件
this.addMouseClick(); // 地图鼠标左键单击事件
this.addMouseRightClick(); // 地图鼠标右键点击事件
this.addMouseLeftDown(); // 地图鼠标左键压下事件
},
// 设置区域范围
async setQiantang() {
let url = "https://geo.datav.aliyun.com/areas_v3/bound/320921.json";
let xiangshuiJson = await fetch(url).then((res) => res.json());
let pointArr = xiangshuiJson.features[0].geometry.coordinates[0][0];
let polygonArr = [];
for (let i = 0; i < pointArr.length; i++) {
polygonArr.push(pointArr[i][0]);
polygonArr.push(pointArr[i][1]);
}
// let materialPoline = colorRgba("#6495ED", 0.6);
let materialPoline = new Cesium.Color.fromCssColorString(
"#6495ED"
).withAlpha(0.6);
// 创建线实例
let polyline = {
type: "quyuPolyline",
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray(polygonArr),
width: 6,
material: new Cesium.Color(
Number(materialPoline[0] / 255),
Number(materialPoline[1] / 255),
Number(materialPoline[2] / 255),
Number(materialPoline[3])
),
},
};
this.viewer.entities.add(polyline);
this.flyTo([Number(119.666612), Number(34.249119)], 100000, 0);
},
// 类数组转化
listToArray(likeArray) {
var ary = [];
try {
ary = Array.prototype.slice.call(likeArray);
} catch (e) {
for (var i = 0; i < likeArray.length; i++) {
ary[ary.length] = likeArray[i];
}
}
return ary;
},
// 鼠标左键压下事件
addMouseLeftDown() {
let that = this;
let currentPoint = null;
const handler = new Cesium.ScreenSpaceEventHandler(
that.viewer.scene.canvas
);
handler.setInputAction((event) => {
let windowPosition = event.position;
let pickedObject = that.viewer.scene.pick(windowPosition);
if (Cesium.defined(pickedObject)) {
let entity = pickedObject.id;
if (entity.name === "gon_point") {
currentPoint = entity;
}
}
}, Cesium.ScreenSpaceEventType.LEFT_DOWN);
// 对鼠标移动事件的监听
handler.setInputAction((event) => {
if (currentPoint) {
let cartesian = that.viewer.camera.pickEllipsoid(
event.startPosition,
that.viewer.scene.globe.ellipsoid
);
let points = [],
gon = null;
if (!cartesian) {
return;
}
currentPoint.position = cartesian;
for (let point of that.editPoints) {
points.push(point.position._value);
}
that.polygonPointsEntities = points;
that.polygonEntity.polygon.hierarchy =
new Cesium.CallbackProperty(() => {
return new Cesium.PolygonHierarchy(points);
}, false);
that.pointPositionList = that.getLolat(points);
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
// 对鼠标抬起事件的监听
handler.setInputAction((event) => {
currentPoint = null;
}, Cesium.ScreenSpaceEventType.LEFT_UP);
},
// cesium 笛卡尔坐标系转WGS84坐标系
getLolat(position) {
if (position) {
let gonPoints = [];
position.forEach((point, index) => {
var cartesian = new Cesium.Cartesian3(
point.x,
point.y,
point.z
);
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(
6
);
var lng = Cesium.Math.toDegrees(cartographic.longitude).toFixed(
6
);
var alt = cartographic.height;
gonPoints.push(lng);
gonPoints.push(lat);
});
return gonPoints;
} else {
return [];
}
},
// 鼠标右键点击事件
addMouseRightClick() {
let that = this;
that.viewer.screenSpaceEventHandler.setInputAction(function (
movement
) {
// 结束区域查询
that.isAddStatus = false;
for (let point of that.editPoints) {
// 去除白点
that.viewer.entities.remove(point);
}
let newpolygonPointsEntitiesLine = [];
// 闭合
newpolygonPointsEntitiesLine =
that.polygonPointsEntitiesLine.push(
that.polygonPointsEntitiesLine[0]
);
newpolygonPointsEntitiesLine = that.listToArray(
that.polygonPointsEntitiesLine
);
let polylineLast = that.viewer.entities.add({
name: "线几何对象",
polyline: {
positions: newpolygonPointsEntitiesLine,
width: 3,
material: new Cesium.PolylineGlowMaterialProperty({
color: Cesium.Color.GOLD,
}),
depthFailMaterial: new Cesium.PolylineGlowMaterialProperty({
color: Cesium.Color.GOLD,
}),
},
});
that.polygonPointsEntitiesEntity.push(polylineLast);
},
Cesium.ScreenSpaceEventType.RIGHT_CLICK);
},
// 鼠标左键点击事件
addMouseClick() {
let that = this;
that.viewer.screenSpaceEventHandler.setInputAction(function (
movement
) {
// 添加区域情况
if (that.isAddStatus) {
// 平面坐标(x,y)
let windowPosition = movement.position;
// 三维坐标x,y,z
let ellipsoid = that.viewer.scene.globe.ellipsoid;
let cartesian = that.viewer.camera.pickEllipsoid(
windowPosition,
that.viewer.scene.globe.ellipsoid
);
// 坐标转换:世界坐标转换为经纬度
let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度
let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
// 经度在前纬度在后
that.pointPositionList.push(lng.toFixed(6));
that.pointPositionList.push(lat.toFixed(6));
if (!cartesian) {
return;
}
// 实例化点实体
let point = that.viewer.entities.add({
name: "gon_point",
position: cartesian,
point: {
color: Cesium.Color.WHITE,
pixelSize: 10,
outlineColor: Cesium.Color.BLACK,
outlineWidth: 1,
},
});
// 存储点的实体,用于下图
that.editPoints.push(point);
that.polygonPointsEntities.push(cartesian);
that.polygonPointsEntitiesLine = that.listToArray(
that.polygonPointsEntities
);
if (that.editPoints.length > 0) {
if (that.polygonPointsEntitiesLine.length < 1) return;
let polyline = that.viewer.entities.add({
name: "线几何对象",
polyline: {
positions: that.polygonPointsEntitiesLine,
width: 3,
material: new Cesium.PolylineGlowMaterialProperty({
color: Cesium.Color.GOLD,
}),
depthFailMaterial:
new Cesium.PolylineGlowMaterialProperty({
color: Cesium.Color.GOLD,
}),
},
});
// 存储线的实体,用于下图
that.polygonPointsEntitiesEntity.push(polyline);
}
// 大于三个点开始画面
if (that.polygonPointsEntities.length >= 3) {
if (!that.polygonEntity) {
that.polygonEntity = that.viewer.entities.add({
name: "polygon",
polygon: {
hierarchy: new Cesium.CallbackProperty(() => {
return new Cesium.PolygonHierarchy(
that.polygonPointsEntities
);
}, false),
material: new Cesium.Color.fromCssColorString(
"#4296FF"
).withAlpha(0.4),
},
});
} else {
that.polygonEntity.polygon.hierarchy =
new Cesium.CallbackProperty(() => {
return new Cesium.PolygonHierarchy(
that.polygonPointsEntities
);
}, false);
}
}
}
},
Cesium.ScreenSpaceEventType.LEFT_CLICK);
},
// 鼠标移入事件
addMouseListener() {
let that = this;
const handler = new Cesium.ScreenSpaceEventHandler(
that.viewer.scene.canvas
);
handler.setInputAction(function (movement) {
if (that.isEditStatus || that.isAddStatus) {
document.getElementsByTagName("body").item(0).style.cursor =
"pointer";
} else {
document.getElementsByTagName("body").item(0).style.cursor =
"default";
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
},
// 地图移动
flyTo(coord = [116.405285, 40.123456], height = 450000, time = 0) {
this.viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(
coord[0],
coord[1],
height
),
orientation: {
heading: Cesium.Math.toRadians(0.0),
roll: 0.0,
},
duration: time,
});
},
},
});
</script>
</body>
</html>