learning_cesium/湖北配图.html

388 lines
17 KiB
HTML
Raw Normal View History

2024-03-19 18:06:25 +08:00
<!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>
<script src="./js/turf.min.js"></script>
<style>
@import url(./Build/Cesium/Widgets/widgets.css);
html,
body,
#app,
#cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
</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 id="cesiumContainer"></div>
</div>
<script>
Cesium.Ion.defaultAccessToken =
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
var geoserverUrl = "http://121.33.231.74:5097/geoserver/"
var workspace = "iot";
new Vue({
el: "#app",
data: {
mapInfo:[
{name:"riverLevel1",url:geoserverUrl+workspace+"/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=iot:hubeilevel1&maxFeatures=9999&outputFormat=application/json"},
{name:"riverLevel2",url:geoserverUrl+workspace+"/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=iot:hubeilevel2&maxFeatures=9999&outputFormat=application/json"},
{name:"hubei_hyd1_4l",url:geoserverUrl+workspace+"/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=iot:hubei_hyd1_4l&maxFeatures=9999&outputFormat=application/json"},
{name:"hubei_hyd1_4p",url:geoserverUrl+workspace+"/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=iot:hubei_hyd1_4p&maxFeatures=9999&outputFormat=application/json"},
{name:"hubei_hyd2_4l",url:geoserverUrl+workspace+"/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=iot:hubei_hyd2_4l&maxFeatures=9999&outputFormat=application/json"},
{name:"hubei_hyd2_4p",url:geoserverUrl+workspace+"/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=iot:hubei_hyd2_4p&maxFeatures=9999&outputFormat=application/json"},
{name:"hubei_osm",url:geoserverUrl+workspace+"/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=iot:hubei_osm&maxFeatures=9999&outputFormat=application/json"},
],
colorMap:{
"长江干流流域":"rgb(247, 222, 120)",
"汉江流域":"rgb(162, 225, 211)",
"清江流域":"rgb(198, 221, 113)",
"乌江片区":"rgb(125, 174, 125)",
"清江片区":"rgb(141, 217, 152)",
"沅江片区":"rgb(166, 217, 122)",
"三峡库区":"rgb(224, 191, 148)",
"黄柏河片区":"rgb(240, 231, 192)",
"荆南四河片区":"rgb(239, 234, 138)",
"沮漳河片区":"rgb(246, 204, 188)",
"四湖片区":"rgb(246, 223 ,188)",
"鄂东南片区":"rgb(242, 196, 186)",
"富水片区":"rgb(209 ,145 ,135)",
"鄂东五河片区":"rgb(222, 191, 136)",
"府澴河片区":"rgb(226, 169, 165)",
"汉江下游片区":"rgb(145, 203, 247)",
"唐白河片区":"rgb(126, 229, 236)",
"汉江中游片区":"rgb(190, 216, 233)",
"汉江丹库以上片区":"rgb(168, 189, 241)",
},
outlineColor:"rgb( 142, 21, 21)",
water12:"rgb( 16, 101, 208 )",
water3:"rgb( 117, 167, 232 )",
regionMap:{
"长江干流流域":{coord:[],color:"rgb(247, 222, 120)"},
"汉江流域":{coord:[],color:"rgb(162, 225, 211)"},
"清江流域":{coord:[],color:"rgb(198, 221, 113)"},
"乌江片区":{coord:[108.870317,29.909681],color:"rgb(125, 174, 125)"},
"清江片区":{coord:[110.050511,29.912557],color:"rgb(141, 217, 152)"},
"沅江片区":{coord:[110.210396,30.451736],color:"rgb(166, 217, 122)"},
"三峡库区":{coord:[110.548268,31.133949],color:"rgb(224, 191, 148)"},
"黄柏河片区":{coord:[111.337632,30.918915],color:"rgb(240, 231, 192)"},
"荆南四河片区":{coord:[111.927106,30.038710],color:"rgb(239, 234, 138)"},
"沮漳河片区":{coord:[111.835033,31.079421],color:"rgb(246, 204, 188)"},
"四湖片区":{coord:[112.833908,30.004803],color:"rgb(246, 223 ,188)"},
"鄂东南片区":{coord:[114.246797,29.964106],color:"rgb(242, 196, 186)"},
"富水片区":{coord:[114.794233,29.674242],color:"rgb(209 ,145 ,135)"},
"鄂东五河片区":{coord:[115.316260,30.830389],color:"rgb(222, 191, 136)"},
"府澴河片区":{coord:[113.740907,31.576125],color:"rgb(226, 169, 165)"},
"汉江下游片区":{coord:[113.321659,30.668325],color:"rgb(145, 203, 247)"},
"唐白河片区":{coord:[112.329638,32.207771],color:"rgb(126, 229, 236)"},
"汉江中游片区":{coord:[111.721511,31.839883],color:"rgb(190, 216, 233)"},
"汉江丹库以上片区":{coord:[110.071016,32.370220],color:"rgb(168, 189, 241)"},
},
},
methods: {
initViewer() {
var viewer = new Cesium.Viewer("cesiumContainer", {
geocoder: false, //位置查找
homeButton: false, //视图返回初始位置
sceneModePicker: false, //视角选择器
baseLayerPicker:false,//底图选择器
navigationHelpButton: false, //导航帮助按钮
animation: false, //动画控制器
creditContainer:document.createElement("div"),//版权显示
timeline: false, //时间线
fullscreenButton: false, //全屏控件
vrButton: false,
infoBox: false,
selectionIndicator: false,
imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
url: 'http://t0.tianditu.gov.cn/vec_w/wmts?tk=ea3530e6803b44025cfa81500eaae01f',
layer:'vec',
style:'default',
tileMatrixSetID:'w',
format:'tiles',
maximumLevel: 18
})
});
window.viewer = viewer;
this.viewer = viewer;
// 创建数据源
this.boundaryCollection = new Cesium.PrimitiveCollection();
this.riverCollection = new Cesium.PrimitiveCollection();
this.labelCollection = new Cesium.LabelCollection();
viewer.scene.primitives.add(this.boundaryCollection);
viewer.scene.primitives.add(this.riverCollection);
viewer.scene.primitives.add(this.labelCollection);
// 自定义数据源( CustomDataSource ),其 entities 属性是一个 EntityCollection
this.boundaryDataSource = new Cesium.CustomDataSource("boundary");
viewer.dataSources.add(this.boundaryDataSource);
this.initEvent(viewer);
},
initEvent(viewer){
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (evt) {
//捕获椭球体,将笛卡尔二维平面坐标转为椭球体的笛卡尔三维坐标,返回球体表面的点
var cartesian3 = viewer.camera.pickEllipsoid(evt.position);
// let cartesian3 = viewer.scene.pickPosition(evt.position);
if (cartesian3) {
//将笛卡尔三维坐标转为地图坐标(弧度)
var cartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3);
//将地图坐标(弧度)转为十进制的度数
var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
var alti_String = (viewer.camera.positionCartographic.height / 1000).toFixed(2);
console.log(log_String+","+lat_String)
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
},
async initData(){
// 获取wfs矢量数据
let promiseArr = [];
this.mapInfo.forEach(item=>{
promiseArr.push(fetch(item.url).then(res=>res.json()))
})
let results = await Promise.allSettled(promiseArr);
// console.log(results)
this.mapData = {};
for(let i=0;i<results.length;i++){
this.mapData[this.mapInfo[i].name] = results[i].value;
}
},
drawShap(){
let level1Features = this.mapData["riverLevel1"];
let level2Features = this.mapData["riverLevel2"];
let hubei_hyd1_4l = this.mapData["hubei_hyd1_4l"];
let hubei_hyd1_4p = this.mapData["hubei_hyd1_4p"];
let hubei_hyd2_4l = this.mapData["hubei_hyd2_4l"];
let hubei_hyd2_4p = this.mapData["hubei_hyd2_4p"];
let hubei_osm = this.mapData["hubei_osm"];
if(level2Features&&level2Features.features.length){
level2Features.features.forEach(feature=>{
// console.log(feature)
// 绘制面
this.createOutlinePolygon(
this.boundaryEntities,
feature.geometry,
this.regionMap[feature.properties.region]["color"],
this.outlineColor,
0.8,
true
)
// 添加标注
this.createFeatureLabel(
this.labelCollection,
feature.geometry,
feature.properties.region
)
})
}
if(level1Features&&level1Features.features.length){
level1Features.features.forEach(feature=>{
// 绘制面
this.createOutlinePolygon(
this.riverCollection,
feature.geometry,
"#fff",
this.outlineColor,
2,
false
)
})
}
if(hubei_hyd1_4p&&hubei_hyd1_4p.features.length){
hubei_hyd1_4p.features.forEach(feature=>{
this.addPolygonFeature(
this.riverCollection,
feature.geometry,
this.water12,
feature.properties
)
})
}
if(hubei_hyd2_4p&&hubei_hyd2_4p.features.length){
hubei_hyd2_4p.features.forEach(feature=>{
this.addPolygonFeature(
this.riverCollection,
feature.geometry,
this.water12,
feature.properties
)
})
}
if(hubei_osm&&hubei_osm.features.length){
hubei_osm.features.forEach(feature=>{
this.addPolygonFeature(
this.riverCollection,
feature.geometry,
this.water3,
feature.properties
)
})
}
},addPolygonFeature(source,geometry,colorStr,id){
let geometryType = geometry.type;
let coord = geometry.coordinates;
if(geometryType == "MultiPolygon"){
let polygon = coord[0];
let outBoundary = new Cesium.PolygonHierarchy( Cesium.Cartesian3.fromDegreesArray(polygon[0].flat(2)))
source.add(new Cesium.Primitive({
geometryInstances : new Cesium.GeometryInstance({
geometry: new Cesium.PolygonGeometry({
polygonHierarchy : outBoundary
}),
id:id
}),
appearance : new Cesium.EllipsoidSurfaceAppearance({
material: new Cesium.Material({
fabric : {
type : 'Color',
uniforms : {
color : Cesium.Color.fromCssColorString(colorStr?colorStr:"red")
}
}
}),
faceForward : true
})
}));
}
},
createGeometryPolygon(source,geometry,colorStr,id){
let polygon = null;
if(geometry.type=="MultiPolygon"){
// 目前只取外环
polygon = new Cesium.PolygonGeometry({
polygonHierarchy : new Cesium.PolygonHierarchy(
Cesium.Cartesian3.fromDegreesArray(geometry.coordinates[0].flat(2))
),
width:100
});
}else{
polygon = new Cesium.PolygonGeometry({
polygonHierarchy : new Cesium.PolygonHierarchy(
Cesium.Cartesian3.fromDegreesArray(geometry.coordinates.flat(2))
)
});
}
const polygonGeometry = Cesium.PolygonGeometry.createGeometry(polygon);
source.add(new Cesium.Primitive({
geometryInstances : new Cesium.GeometryInstance({
geometry:polygonGeometry,
id:id
}),
appearance : new Cesium.MaterialAppearance({
material : new Cesium.Material({
fabric : {
type : 'Color',
uniforms : {
color : Cesium.Color.fromCssColorString(colorStr?colorStr:"red")
}
}
}),
faceForward : true
})
}));
},
//创建轮廓线使用Entity实现
createOutlinePolygon(source,geometry,colorStr,outlineColorStr,outlineWidth,isFill){
// 目前MultiPolygon只取外环
let coords = geometry.type=="MultiPolygon"?geometry.coordinates[0]:geometry.coordinates;
let entity = this.boundaryDataSource.entities.add({
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray(coords.flat(2)),
material: Cesium.Color.fromCssColorString(colorStr?colorStr:"red"),
},
});
entity.polygon.fill = isFill;
entity.polygon.outlineWidth = outlineWidth;
entity.polygon.outline = false;
entity.polygon.outlineColor = Cesium.Color.RED;
entity.polyline = {
positions: entity.polygon.hierarchy._value.positions,
width: entity.polygon.outlineWidth,
material: Cesium.Color.fromCssColorString(outlineColorStr?outlineColorStr:"red"),
}
},
createFeatureLabel(source,geometry,labelText){
// console.log(labelText)
// 计算中心点
// let centroid = turf.center(geometry)
let coord = this.regionMap[labelText]["coord"]
this.labelCollection.add({
position : Cesium.Cartesian3.fromDegrees(coord[0],coord[1]),
text : labelText,
font : "14px Arial Bolder",
fillColor: Cesium.Color.BLACK,
horizontalOrigin :Cesium.HorizontalOrigin.CENTER,
verticalOrigin:Cesium.VerticalOrigin.CENTER,
// showBackground : true,
// backgroundColor : new Cesium.Color(0.165, 0.165, 0.165, 0.8),
// backgroundPadding : new Cesium.Cartesian2(1, 1),
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2,
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
})
}
},
created(){
// this.initData();
},
async mounted() {
this.initViewer();
await this.initData();
this.drawShap();
viewer.zoomTo(this.boundaryDataSource)
},
});
</script>
</body>
</html>