ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CesiumJS 实操:在 3D 地球上还原一片保护区的物种分布

CesiumJS 实操:在 3D 地球上还原一片保护区的物种分布 CesiumJS 实操在 3D 地球上还原一片保护区的物种分布【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium你手上有一批物种观测记录GeoJSON 点位和一个保护区边界文件目标是把它们叠到带真实地形的 3D 地球上点位按物种区分、边界贴合地表、分布能按季节切换。读完这篇你可以独立完成一条 CesiumJS 物种分布可视化的完整链路数据清洗到时间序列动画。整理输入物种点位与保护区边界的格式清洗观测记录通常散落在 CSV 或巡护表格里先转成标准 GeoJSON FeatureCollection每个 feature 一个 Point 几何体properties 里放 species、date、count 三个字段。仓库里的现成样例可以参考 Apps/SampleData/simplestyles.geojson它演示了用 simplestyle 规范给点做颜色编码。边界文件常见两种来源GeoJSON 的 Polygon或巡护团队导出的 KML。注意Apps/SampleData/ne_10m_us_states.topojson这类 TopoJSON 不是 GeoJSONGeoJsonDataSource不会直接接受它需要先用 topojson 库做一次坐标展开转换。把观测记录整理成 feature 的最小结构下面这个结构是后续所有渲染代码的输入一条观测对应一个 feature{ type: Feature, geometry: { type: Point, coordinates: [104.06, 30.66] }, properties: { species: Ibis, date: 2026-04, count: 12 } }本地跑之前克隆仓库并装依赖git clone https://gitcode.com/GitHub_Trending/ce/cesium然后执行npm install。把物种点位画到 3D 地球上GeoJsonDataSource 加载配置点位渲染入口是GeoJsonDataSource.load它的样式选项都在第二个参数里不需要逐个创建 Entity。源码在 GeoJsonDataSource.jsmarkerSize、markerColor、markerSymbol、clampToGround都是它直接支持的字段。下面这段把全部观测点加载进来点符号用不同字形区分物种类别clampToGround让点贴在地表而不是悬在椭球面上。viewer.dataSources.add( Cesium.GeoJsonDataSource.load(species.geojson, { markerSymbol: ★, markerSize: 28, markerColor: Cesium.Color.fromCssColorString(#e8b931), clampToGround: true, }) );加载完成后相机对准保护区点位即出现在对应经纬度上点位很多时几千个观测点用markerColor按物种分组着色比换图标更实用颜色承载物种维度符号保持统一放大后读 Label 再看 details。叠加保护区边界并开启地形边界贴合地表的两种做法只有点位没有地形物种分布和山地、河谷的空间关系是看不清的。地形用Terrain.fromWorldTerrain一行挂上requestWaterMask和requestVertexNormals决定水域渲染与山体光照是否生效。const viewer new Cesium.Viewer(cesiumContainer, { terrain: Cesium.Terrain.fromWorldTerrain({ requestWaterMask: true, requestVertexNormals: true, }), }); viewer.scene.globe.enableLighting true;开启光照后坡向会影响明暗山脊线在图里一眼可辨边界 Polygon 的填充建议压低fillMaterialProperty的透明度约 0.3描边用不透明颜色保证边界下方的点位依然可见。边界贴地的两种方案对比方案写法适用贴地渲染clampToGround: true点位、线、面都压在地表之上最省事指定高度给 Polygon 的heightReference留空并配合地形采样需要悬浮展示或避免贴地接缝如果边界是 KML 文件用Cesium.KmlDataSource.load替代 GeoJSON 通道即可后面的点位叠加逻辑不受影响。让分布跟着季节走CZML 时间序列静态点位回答不了春季在哪里、冬季在哪里。CZML 文档支持sampling采样位置同一个物种在不同时间段出现在不同点位shouldAnimate打开后底部时间轴可以拖动回放。仓库自带的 Apps/SampleData/ClampToGround.czml 是一个贴地时间序列的参考样例。加载方式和 GeoJSON 完全一致多出的只是时间轴控制const viewer new Cesium.Viewer(cesiumContainer, { shouldAnimate: true, }); viewer.dataSources.add(Cesium.CzmlDataSource.load(seasons.czml)); viewer.clock.currentTime Cesium.JulianDate.fromIso8601(2026-04-01);约定一套 CZML 写法每个物种一个 entityposition用sampling按季度给位置availability限定有效区间。时间轴每跳一格点位随迁移路径整体位移季节对比就出来了。坑缩小后点位糊成一团瓦片二次访问变慢现象相机拉远到全球视角几万个观测点叠成一张色块切走页面再回来地形加载明显变慢。原因每个点位都是独立绘制对象没有屏幕空间聚合地形瓦片请求虽然会落盘缓存但会话间没有复用内存重新解析开销大。网络面板里能看到大量.pnts、.terrain请求命中 disk cache 而非 memory cache解法打开内置实体聚簇。聚簇在屏幕空间按pixelRange合并 billboard、label、point 三类对象默认 80 像素、最少 2 个成簇缩小后点位自动收拢成簇放大再散开。瓦片侧则保持requestWaterMask等选项稳定避免每次改配置触发全量重请求。可直接复用的最小配置以下片段是上面四个环节合并后的最小可运行配置替换两个数据 URL 即可上线一个物种分布页面const viewer new Cesium.Viewer(cesiumContainer, { shouldAnimate: true, terrain: Cesium.Terrain.fromWorldTerrain({ requestWaterMask: true, requestVertexNormals: true }), }); viewer.scene.globe.enableLighting true; viewer.dataSources.add( Cesium.GeoJsonDataSource.load(species.geojson, { markerSymbol: ★, markerSize: 28, clampToGround: true }) ); viewer.dataSources.add(Cesium.CzmlDataSource.load(seasons.czml)); viewer.dataSources.clustering.enabled true; viewer.dataSources.clustering.pixelRange 60; viewer.dataSources.clustering.minimumClusterSize 5; viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(104.0, 30.6, 1200000) });把species.geojson和seasons.czml换成你的数据文件调整camera.setView到保护区经纬度页面就能直接交付给保护团队使用。【免费下载链接】cesiumAn open-source JavaScript library for world-class 3D globes and maps :earth_americas:项目地址: https://gitcode.com/GitHub_Trending/ce/cesium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表