334 lines
14 KiB
HTML
334 lines
14 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>
|
|||
|
|
<script src="./js/CesiumPopup/CesiumPopup.js"></script>
|
|||
|
|
<link href="./js/CesiumPopup/custompopup.css" rel="stylesheet" />
|
|||
|
|
<style>
|
|||
|
|
@import url(./Build/Cesium/Widgets/widgets.css);
|
|||
|
|
html,
|
|||
|
|
body,
|
|||
|
|
#cesiumContainer {
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100%;
|
|||
|
|
margin: 0;
|
|||
|
|
padding: 0;
|
|||
|
|
overflow: hidden;
|
|||
|
|
}
|
|||
|
|
</style>
|
|||
|
|
</head>
|
|||
|
|
<body>
|
|||
|
|
<div id="cesiumContainer"></div>
|
|||
|
|
<script>
|
|||
|
|
Cesium.Ion.defaultAccessToken =
|
|||
|
|
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8";
|
|||
|
|
|
|||
|
|
var viewer = new Cesium.Viewer("cesiumContainer", {
|
|||
|
|
geocoder: false, //位置查找
|
|||
|
|
homeButton: false, //视图返回初始位置
|
|||
|
|
sceneModePicker: true, //视角选择器
|
|||
|
|
// baseLayerPicker:false,//底图选择器
|
|||
|
|
navigationHelpButton: false, //导航帮助按钮
|
|||
|
|
animation: false, //动画控制器
|
|||
|
|
// creditContainer:"credit",//版权显示
|
|||
|
|
timeline: false, //时间线
|
|||
|
|
fullscreenButton: false, //全屏控件
|
|||
|
|
vrButton: false,
|
|||
|
|
infoBox:false,
|
|||
|
|
selectionIndicator:false
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
var imageryLayers = viewer.scene.imageryLayers;
|
|||
|
|
//清除影像图层集合中的图层
|
|||
|
|
imageryLayers.removeAll();
|
|||
|
|
// 添加 Mapbox tile provider
|
|||
|
|
const mapboxAccess = "pk.eyJ1IjoicWl1c2hpamllIiwiYSI6ImNsMDNvdDRybDEyc2YzZG9kbWZoY2FuOW0ifQ.4FH-BUupi46Z0zQ-CEm_Ig";
|
|||
|
|
|
|||
|
|
// 样式id查看:https://docs.mapbox.com/api/maps/styles/
|
|||
|
|
// URL格式的 mapbox://styles/:owner/:style, 其中 :owner 是您的 Mapbox 账户名 :style 是样式 ID 。
|
|||
|
|
// 可选值:streets-v10、outdoors-v10 、light-v9、dark-v9、satellite-v9、satellite-streets-v10
|
|||
|
|
// const mapboxStyleImagery = new Cesium.MapboxStyleImageryProvider({
|
|||
|
|
// styleId: "satellite-streets-v10",
|
|||
|
|
// accessToken: mapboxAccess,
|
|||
|
|
// });
|
|||
|
|
// imageryLayers.addImageryProvider(mapboxStyleImagery);
|
|||
|
|
|
|||
|
|
// 加载mapbox中自定义的服务
|
|||
|
|
// https://studio.mapbox.com/tilesets/mapbox.satellite
|
|||
|
|
// mapbox://styles/qiushijie/ckayrgiu2160x1iooym5xshpb,mapbox://styles/qiushijie/clboooor3000714mi15y9j6ba
|
|||
|
|
var customMapboxIamgery = new Cesium.MapboxStyleImageryProvider({
|
|||
|
|
// url: "https://api.mapbox.com/styles/v1",
|
|||
|
|
username: "qiushijie",
|
|||
|
|
styleId: "clboooor3000714mi15y9j6ba",
|
|||
|
|
accessToken: mapboxAccess,
|
|||
|
|
scaleFactor: true,
|
|||
|
|
});
|
|||
|
|
imageryLayers.addImageryProvider(customMapboxIamgery);
|
|||
|
|
|
|||
|
|
// 调整整体的亮度
|
|||
|
|
var collection = viewer.scene.postProcessStages;
|
|||
|
|
var silhouette = collection.add(Cesium.PostProcessStageLibrary.createBrightnessStage());
|
|||
|
|
silhouette.enabled = true;
|
|||
|
|
silhouette.uniforms.brightness=0.7;
|
|||
|
|
|
|||
|
|
// 将三维球定位到汉江
|
|||
|
|
viewer.camera.flyTo({
|
|||
|
|
destination: Cesium.Cartesian3.fromDegrees(
|
|||
|
|
110.302,
|
|||
|
|
29.98,
|
|||
|
|
1785000
|
|||
|
|
),
|
|||
|
|
orientation: {
|
|||
|
|
heading: Cesium.Math.toRadians(0),
|
|||
|
|
pitch: Cesium.Math.toRadians(-60.74026687972041),
|
|||
|
|
roll: Cesium.Math.toRadians(0),
|
|||
|
|
},
|
|||
|
|
complete: function callback() {
|
|||
|
|
// 定位完成之后的回调函数
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
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)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取该位置的所有primitive集合
|
|||
|
|
let picks = viewer.scene.drillPick(evt.position);
|
|||
|
|
let bills = picks.filter(item=>item.primitive instanceof Cesium.Billboard);
|
|||
|
|
if(cartesian3&&bills.length){
|
|||
|
|
let item = JSON.parse(bills[0].id.id);
|
|||
|
|
if(!item.layer||item.layer!="poi") return;
|
|||
|
|
let position = new Cesium.Cartesian3.fromDegrees(item.lng, item.lat,100);
|
|||
|
|
var html = "<div>" +(item.abstract)+"</div>";
|
|||
|
|
// for(let key in fields){
|
|||
|
|
// html += "<div>" + key + " :"+ fields[key] + "</div>"
|
|||
|
|
// }
|
|||
|
|
var a = new CesiumPopup({
|
|||
|
|
title: "龙王庙<span class='location'>定位<i></i></span>",
|
|||
|
|
})
|
|||
|
|
.setPosition(position)
|
|||
|
|
.setHTML(html)
|
|||
|
|
.addTo(viewer)
|
|||
|
|
|
|||
|
|
a.on("close", function () {
|
|||
|
|
console.log("close");
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
a.on("open", function () {
|
|||
|
|
console.log("open");
|
|||
|
|
});
|
|||
|
|
a.removeClass("cesium-popup-panel").addClassName("cesium-popup-hanjiang")
|
|||
|
|
}
|
|||
|
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
|
|||
|
|
addHanRiver();
|
|||
|
|
// createPoiLabel("龙王庙")
|
|||
|
|
const pois=[
|
|||
|
|
{name:"龙王庙",abstract:"汉江上游全场956千米,集水面积95220平方千米,敢流呈东西走向,穿行于秦岭、大巴山之间,沿途峡谷盆地交替,河床多为卵石、砾石与基岩组成,河道比降大。",lng:114.285869 ,lat: 30.569577,icon:""},
|
|||
|
|
{name:"嶓冢山",abstract:"汉江上游全场956千米,集水面积95220平方千米,敢流呈东西走向,穿行于秦岭、大巴山之间,沿途峡谷盆地交替,河床多为卵石、砾石与基岩组成,河道比降大。",lng:106.24576 ,lat:33.07099,icon:""},
|
|||
|
|
{name:"上游段",abstract:"汉江上游全场956千米,集水面积95220平方千米,敢流呈东西走向,穿行于秦岭、大巴山之间,沿途峡谷盆地交替,河床多为卵石、砾石与基岩组成,河道比降大。",lng:1,lat:1,}
|
|||
|
|
]
|
|||
|
|
addPoiBill(pois[0])
|
|||
|
|
function addPoiBill(data){
|
|||
|
|
let image = createPoiLabel(data.name)
|
|||
|
|
let entity = viewer.entities.add({
|
|||
|
|
id:JSON.stringify({...data,layer:"poi"}),
|
|||
|
|
position: Cesium.Cartesian3.fromDegrees(data.lng, data.lat,0),
|
|||
|
|
billboard: {
|
|||
|
|
eyeOffset: new Cesium.Cartesian3(0.0, 1.0, 0.0),
|
|||
|
|
image: image, // default: undefined
|
|||
|
|
show: true, // default
|
|||
|
|
// pixelOffset:new Cesium.Cartesian2(-60, 0),
|
|||
|
|
width: 120, // default: undefined
|
|||
|
|
height: 80, // default: undefined
|
|||
|
|
disableDepthTestDistance : Number.POSITIVE_INFINITY,
|
|||
|
|
// distanceDisplayCondition: new Cesium.DistanceDisplayCondition(
|
|||
|
|
// 10.0,
|
|||
|
|
// 30000.0
|
|||
|
|
// ), //根据到相机的距离确定可见性。
|
|||
|
|
scaleByDistance: new Cesium.NearFarScalar(10, 1, 3000000, 0.0),
|
|||
|
|
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
|
|||
|
|
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
|
|||
|
|
heightReference :Cesium.HeightReference.CLAMP_TO_GROUND
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
viewer.flyTo(entity)
|
|||
|
|
}
|
|||
|
|
async function createPoiLabel(label){
|
|||
|
|
// 创建画布对象
|
|||
|
|
let canvas = document.createElement('canvas');
|
|||
|
|
let len = label.split("").length,width=120,height=80;
|
|||
|
|
canvas.width = 17*len>width?17*len:width;
|
|||
|
|
canvas.height = height;
|
|||
|
|
let ctx = canvas.getContext("2d");
|
|||
|
|
// ctx.fillStyle = '#000';
|
|||
|
|
// ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|||
|
|
|
|||
|
|
const url1 = 'http://127.0.0.1:5502/images/hanjiang/poi_label.png';
|
|||
|
|
const url2 = 'http://127.0.0.1:5502/images/hanjiang/poi_location.png'
|
|||
|
|
let image1 = await new Cesium.Resource.fetchImage(url1);
|
|||
|
|
ctx.drawImage(image1, 0, 0, 120, 32)//改变图片大小到1080*980
|
|||
|
|
ctx.fillStyle = "#CFF8FF";
|
|||
|
|
ctx.lineHeight = 17;
|
|||
|
|
ctx.font = '700 17px "fangsong"';
|
|||
|
|
ctx.textBaseline = "middle";
|
|||
|
|
ctx.fillText(label, 30, 15);
|
|||
|
|
|
|||
|
|
let image2 = await new Cesium.Resource.fetchImage(url2);
|
|||
|
|
ctx.drawImage(image2, 44, 37, 32, 42)
|
|||
|
|
return canvas;
|
|||
|
|
}
|
|||
|
|
function example(){
|
|||
|
|
const canvas = document.getElementById('canvas');
|
|||
|
|
const ctx = canvas.getContext('2d');
|
|||
|
|
const name = "龙王庙"
|
|||
|
|
canvas.width = 120;
|
|||
|
|
canvas.height = 80;
|
|||
|
|
|
|||
|
|
var img = new Image()
|
|||
|
|
img.src = 'http://127.0.0.1:5502/images/hanjiang/poi_label.png'
|
|||
|
|
//图片加载完后,将其显示在canvas中
|
|||
|
|
img.onload = function(){
|
|||
|
|
//context.drawImage(this, 0, 24)
|
|||
|
|
ctx.drawImage(this, 0, 0, 120, 32)//改变图片大小到1080*980
|
|||
|
|
ctx.fillStyle = "#CFF8FF";
|
|||
|
|
ctx.lineHeight = 17;
|
|||
|
|
ctx.font = '700 17px "fangsong"';
|
|||
|
|
|
|||
|
|
ctx.textBaseline = "middle";
|
|||
|
|
ctx.fillText(name, 30, 15);
|
|||
|
|
|
|||
|
|
var img2 = new Image()
|
|||
|
|
img2.src = 'http://127.0.0.1:5502/images/hanjiang/poi_location.png';
|
|||
|
|
img2.onload = function(){
|
|||
|
|
ctx.drawImage(this, 44, 37, 32, 42)//改变图片大小到1080*980
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
function combineIconAndLabel(url, label,width,height) {
|
|||
|
|
// 创建画布对象
|
|||
|
|
let canvas = document.createElement('canvas');
|
|||
|
|
let len = label.split("").length;
|
|||
|
|
canvas.width = 16*len>width?16*len:width;
|
|||
|
|
canvas.height = height + 22;
|
|||
|
|
let ctx = canvas.getContext("2d");
|
|||
|
|
|
|||
|
|
let promise = new Cesium.Resource.fetchImage(url).then(image => {
|
|||
|
|
// 异常判断
|
|||
|
|
try {
|
|||
|
|
ctx.drawImage(image, (canvas.width/2)-width/2, 20);
|
|||
|
|
} catch (e) {
|
|||
|
|
console.log(e);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 渲染字体
|
|||
|
|
// font属性设置顺序:font-style, font-variant, font-weight, font-size, line-height, font-family
|
|||
|
|
ctx.fillStyle = Cesium.Color.WHITE.toCssColorString();
|
|||
|
|
ctx.font="16px FANGSONG"
|
|||
|
|
ctx.fillText(label, 0, 15);
|
|||
|
|
|
|||
|
|
return canvas;
|
|||
|
|
});
|
|||
|
|
return promise;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function getHanData(){
|
|||
|
|
const url = "http://121.33.231.74:5097/geoserver/iot/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=iot%3Ahanjiang&maxFeatures=999&outputFormat=application%2Fjson";
|
|||
|
|
return await fetch(url).then(res=>res.json())
|
|||
|
|
}
|
|||
|
|
async function addHanRiver(){
|
|||
|
|
const result = await getHanData();
|
|||
|
|
console.log(result)
|
|||
|
|
let primitives = viewer.scene.primitives.add(
|
|||
|
|
new Cesium.PrimitiveCollection()
|
|||
|
|
);
|
|||
|
|
// primitives.show = false;
|
|||
|
|
window.primitives = primitives;
|
|||
|
|
result.features.forEach((feature) => {
|
|||
|
|
addWaterFeature(primitives,feature);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
function addWaterFeature(primitives,feature) {
|
|||
|
|
let geometryType = feature.geometry.type;
|
|||
|
|
let coord = feature.geometry.coordinates;
|
|||
|
|
let geometryName = feature.geometry_name;
|
|||
|
|
|
|||
|
|
if (geometryType == "MultiPolygon") {
|
|||
|
|
coord.forEach((polygon) => {
|
|||
|
|
let outBoundary = null;
|
|||
|
|
let holes = null;
|
|||
|
|
// if(polygon.length==1){
|
|||
|
|
outBoundary = new Cesium.PolygonHierarchy(
|
|||
|
|
Cesium.Cartesian3.fromDegreesArray(polygon[0].flat(2))
|
|||
|
|
);
|
|||
|
|
// }
|
|||
|
|
primitives.add(
|
|||
|
|
new Cesium.Primitive({
|
|||
|
|
geometryInstances: new Cesium.GeometryInstance({
|
|||
|
|
geometry: new Cesium.PolygonGeometry({
|
|||
|
|
polygonHierarchy: outBoundary,
|
|||
|
|
}),
|
|||
|
|
attributes: {
|
|||
|
|
// 通过attributes属性统一指定线段颜色
|
|||
|
|
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
|
|||
|
|
new Cesium.Color(1.0, 0, 0, 1.0)
|
|||
|
|
),
|
|||
|
|
},
|
|||
|
|
id: "面要素",
|
|||
|
|
}),
|
|||
|
|
appearance: new Cesium.EllipsoidSurfaceAppearance({
|
|||
|
|
material: new Cesium.Material({
|
|||
|
|
fabric: {
|
|||
|
|
type: "Water",
|
|||
|
|
uniforms: {
|
|||
|
|
// 水的基本颜色
|
|||
|
|
baseWaterColor: new Cesium.Color(
|
|||
|
|
64 / 255.0,
|
|||
|
|
157 / 255.0,
|
|||
|
|
253 / 255.0,
|
|||
|
|
0.5
|
|||
|
|
),
|
|||
|
|
// 水法向摄动的法线图
|
|||
|
|
normalMap:
|
|||
|
|
"./Build/Cesium/Assets/Textures/waterNormals.jpg",
|
|||
|
|
// 波纹数量
|
|||
|
|
frequency: 1000.0,
|
|||
|
|
// 动画速度
|
|||
|
|
animationSpeed: 0.002,
|
|||
|
|
// 振动的幅度
|
|||
|
|
amplitude: 150,
|
|||
|
|
// 镜面反射的强度
|
|||
|
|
specularIntensity: 1,
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
}),
|
|||
|
|
faceForward: true,
|
|||
|
|
}),
|
|||
|
|
})
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
</body>
|
|||
|
|
</html>
|