仅显示某个行政区划(cesium 挖孔)
580 字
3 分钟
仅显示某个行政区划(cesium 挖孔)
添加polygon, 中间挖孔, 仅显示某个区域
GeoJSON为 GeoJSON , 行政区划下载
// 3.1. 定义一个矩形作为遮罩的“外环”, 大致覆盖整个中国 // 格式:[lng, lat, lng, lat, ...] const worldRectangle = [73.5, 4.5, 73.5, 53.5, 135.5, 53.5, 135.5, 4.5]
// 3.2. 从 lt.json 中提取理塘县的边界作为“孔洞” // lt.json 是一个 FeatureCollection,我们获取第一个 feature const litangFeature = (GeoJSON as any).features[0] const litangPolygons = litangFeature.geometry.coordinates console.log(litangPolygons) // 3.3. 创建遮罩多边形的层级 // Cesium 的 PolygonHierarchy 需要一个外环和一组内环(孔洞) const holes: Cesium.PolygonHierarchy[] = [] let holeCoords: number[] = [] // lt.json 是 MultiPolygon,所以需要遍历它包含的每一个 Polygon litangPolygons.forEach((polygon: number[][][]) => { // 每个 Polygon 又是环的数组(第一个是外环,后面是内环) // 在我们的遮罩中,理塘的*所有*环都是孔洞 polygon.forEach((ring: number[][]) => { // Cesium.Cartesian3.fromDegreesArray 需要一个扁平的 [lng, lat, lng, lat, ...] 数组 holeCoords = ring.flat() holes.push(new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray(holeCoords))) }) }) // 3.4. 创建最终的遮罩层级 const maskHierarchy = new Cesium.PolygonHierarchy( Cesium.Cartesian3.fromDegreesArray(worldRectangle), // 全球外环 holes // 理塘县孔洞 ) // 3.5. 将遮罩添加到地球上 viewer.entities.add({ name: 'Litang Mask', polygon: { hierarchy: maskHierarchy, perPositionHeight: false, // material: Cesium.Color.fromCssColorString('#071B32'), material: '/bg.png', // material: 'https://p8.itc.cn/images01/20200723/b48a6c775c944f7d89043ab8e0154197.jpeg', // fill: true, // 默认 // outline: false, // 默认 }, })
Array.prototype.flat()flat() 创建一个新的数组,并根据指定深度递归地将所有子数组元素拼接到新的数组中。const arr2 = [0, 1, [2, [3, [4, 5]]]];console.log(arr2.flat());// expected output: Array [0, 1, 2, Array [3, Array [4, 5]]]console.log(arr2.flat(2));// expected output: Array [0, 1, 2, 3, Array [4, 5]]console.log(arr2.flat(Infinity));// expected output: Array [0, 1, 2, 3, 4, 5]
限制camera视角范围
遍历GeoJSON获取边界矩形, 返回 new Cesium.Rectangle(west, south, east, north)
const getLitangBoundingBox = (geoJson: any): Cesium.Rectangle => { let minLng = 180, minLat = 90, maxLng = -180, maxLat = -90
// 遍历 lt.json 的坐标 const polygons = geoJson.features[0].geometry.coordinates polygons.forEach((polygon: number[][][]) => { polygon.forEach((ring: number[][]) => { ring.forEach((point: number[]) => { const lng = point[0] const lat = point[1] minLng = Math.min(minLng, lng) maxLng = Math.max(maxLng, lng) minLat = Math.min(minLat, lat) maxLat = Math.max(maxLat, lat) }) }) }) return Cesium.Rectangle.fromDegrees(minLng, minLat, maxLng, maxLat)}初始化时, camera定位到该区域
const MAX_ALTITUDE = 500000 // 500km (最远) const MIN_ALTITUDE = 1000 // 1km (最近)
// 将地球背景和天空盒设置为透明 viewer.scene.backgroundColor = Cesium.Color.TRANSPARENT viewer.scene.globe.baseColor = Cesium.Color.TRANSPARENT
viewer._cesiumWidget._creditContainer.style.display = 'none' viewer.scene.globe.depthTestAgainstTerrain = false
// --- 设置相机缩放和倾斜限制 --- viewer.scene.screenSpaceCameraController.minimumZoomDistance = MIN_ALTITUDE viewer.scene.screenSpaceCameraController.maximumZoomDistance = MAX_ALTITUDE viewer.scene.screenSpaceCameraController.enableTilt = false // 2D 模式下禁止倾斜
// 设置camera const litangBoundsDeg = getLitangBoundingBox(GeoJSON) viewer.camera.setView({ destination: litangBoundsDeg, })文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
关于 cesium 在 micro-app 下无法显示的问题
cesium基座:vite + vue3 子应用:vite + vue3 micro app v1.0.0 rc.29, cesium v1.135 子应用包含一个 cesium map,在基座打开子应用时,cesium 无法显示地图,但是 sence, sky box, model 都能正常显示,唯独地图不显…
2
第一个cesium项目
cesium这里使用vite搭建demo, 选择 Vanilla (代表原生 JS)
3
react-hooks
reactReact 的核心是组件。v16.8 版本之前,组件的标准写法是类(class)。 任何一个组件,可以用类来写,也可以用钩子来写。下面是类的写法。 再来看钩子的写法,也就是函数。 官方推荐使用钩子(函数),而不是类。因为钩子更简洁,代码量少,用起来比较"轻",而类比较"重"。而且,钩子是函数,更符合…
4
TypeScript 进阶
TypeScript数组合并了相同类型的对象,而元组(Tuple)合并了不同类型的对象。 元组起源于函数编程语言(如 F ),这些语言中会频繁使用元组。 元组是⼀种特殊的数组类型,可以存储固定数量的元素,并且每个元素的类型是已知的且可以不同。元组⽤于精确描述⼀组值的类型, ? 表示可选元素。 定义一对值分别为 stri…
5
TypeScript 基础
TypeScriptJavaScript 的类型分为两种:原始数据类型(Primitive data types)和对象类型(Object types)。 原始数据类型包括:布尔值、数值、字符串、 null 、 undefined 以及 ES6 中的新类型 Symbol 和 ES10 中的新类型 BigInt 。
随机文章随机推荐














