仅显示某个行政区划(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,
})

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

仅显示某个行政区划(cesium 挖孔)
https://sukksa.github.io/posts/jin-xian-shi-mou-ge-xing-zheng-qu-hua-cesium-wa-kong/
作者
Sukksa
发布于
2025-11-25
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
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 。
随机文章随机推荐
Profile Image of the Author
Sukksa
记录前端学习与日常
公告
博客刚刚上线,内容还在慢慢补齐。欢迎随便逛逛~
分类
标签
最新动态
站点统计
文章
69
分类
16
标签
17
总字数
178,517
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0

当前页面没有目录

文章目录

当前页面没有目录