541 lines
21 KiB
HTML
541 lines
21 KiB
HTML
<!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>
|