深色模式
GeoJSON 与地理要素
一个站点不只是空间中的一个点,还可能有名称、海拔、观测时间和状态。GeoJSON 用 Geometry 描述形状,用 Feature 将形状与属性结合,用 FeatureCollection 组织多个要素。Cesium 的 GeoJsonDataSource 负责把这些数据转换为可显示的实体集合。
坐标中的“度”和“米”分别表示什么,可先看角度与单位;第三分量的高度参考见地球与高度。
坐标顺序先于样式
按 RFC 7946,GeoJSON 位置顺序是经度、纬度,角度用十进制度;可选第三分量是相对 WGS84 参考椭球的高度,单位为米。不要把投影平面的米制 X/Y 或海拔值未经转换直接放进去。把纬度写在前面不会触发所有场景下的显式错误,却可能让要素落到完全不同的位置。先加载一个位置已知的点,是比一次导入全国数据更有效的定位方式。
以下是接在第二课初始化之后的功能片段,沿用已经导入的 Cesium 命名空间和已创建的 viewer,省略容器与初始化代码。其中的 await 需要放在 async 函数内,或支持顶层 await 的 ES 模块中。
js
const data = {
type: 'Feature',
properties: { name: '示例站', kind: 'synthetic' },
geometry: { type: 'Point', coordinates: [114, 22, 1000] },
};
const source = await Cesium.GeoJsonDataSource.load(data, {
markerColor: Cesium.Color.TEAL,
clampToGround: false,
});
await viewer.dataSources.add(source);
await viewer.flyTo(source);这里的坐标与属性仅用于教学。下载同一份 GeoJSON后,也可以将 load(data, …) 的第一个参数改成本站地址 /data/teaching-station.geojson,观察“内联对象”和“请求文件”两条加载路径。在自己的应用中,应把文件复制到相应的公开资源目录;本站路径不是任意项目都会自带的文件。加载是异步过程,因此应等待数据源准备好后再定位相机。业务属性也不应被误认为几何参数:properties 里一个名为 height 的字段,不会自动成为点的第三个坐标。
贴地不是给所有数据加零高度
贴地表示把对象与地形表面联系起来。它适合边界、路线等地表要素;空中航迹和气压面数据则需要保留自己的高度含义。若地形后来加载得更精细,贴地表达可能随之调整,而固定椭球高的对象保持自己的地理高度。
多边形(polygon)还要检查闭合环(closed ring,首尾位置相同)、孔洞(hole,外轮廓内排除的区域)、跨日界线与边界顶点密度。两个端点之间究竟沿地表弧线还是走三维直线,会影响长距离线段的位置。不能只凭二维预览正确,就断定球面上的连接方式正确。
加载之后,数据源可以整体显示、隐藏或移除,也可以逐个修改实体。清理时应从所属集合删除数据源;只删掉页面上的按钮,不会清除已经加入场景的对象。
对象如何被画出
比较 Entity 与 Primitive,查看几何与材质的边界。
在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放
底图:Natural Earth II(公共领域);其余几何和地形为教学合成。 数据说明
查看运行源码
此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。
读取源码…上方实验用简单盒子观察空间关系;前面的 GeoJSON 片段则演示数据接入。
观察任务: 将“几何数量”调到 1,从俯视转为斜视,观察盒子与地表的关系。假设把一个地表边界抬高十千米,这只是样式变化,还是改变了空间表达?
展开解释
抬高改变了几何位置,也改变遮挡与拾取结果。为了避免重叠闪烁而增加的显示偏移,应与真实高度分开记录。地理边界仍然表示地表范围,不能因显示偏移而被解释成空中的业务对象。