矢量数据由于包含确定的坐标信息,通常用于表达准确的空间位置实体,在cesium中,不支持对shp进行加载,而是需要对shp数据进行转换,一般cesium支持的shp格式如下:
通常来说,对于简单的shp数据,最常规的处理方式是通过geojson格式在cesium中进行加载,而cesium也为加载geojson及后续操作提供了丰富的api。链接
const viewer = new Cesium.Viewer('cesiumContainer');
viewer.dataSources.add(Cesium.GeoJsonDataSource.load('../../SampleData/ne_10m_us_states.topojson', {
stroke: Cesium.Color.HOTPINK,
fill: Cesium.Color.PINK,
strokeWidth: 3,
markerSymbol: '?'
}));
//读取geojson中的每个feature
for (var i = 0; i < geojson.features.length; i++) {
var ifeature = boundary.features[i];
let coordinates = [];
ifeature.geometry.coordinates[0].forEach(lnglat => {
coordinates.push(lnglat[0]);
coordinates.push(lnglat[1]);
});
let positions2 = Cesium.Cartesian3.fromDegreesArray(coordinates);
viewer.entities.add({
polyline: {
positions: positions2,
clampToGround: true,
width: 5,
material: new Cesium.PolylineOutlineMaterialProperty({
color: Cesium.Color.ORANGE,
outlineWidth: 2,
outlineColor: Cesium.Color.BLACK
})
}
});
}
Cesium为开发者提供了丰富的图形绘制和空间数据管理的API,可以分为两类,一类是面向图形开发人员的低层次API,通常被称为Primitive API,另一类是用于驱动数据可视化的高层次API,称为Entity API
for (let i = 0; i < features.length; i++) {
const coordinates = features[i].geometry.coordinates[0];
const lineArray = coordinates[0].slice(0, 2).concat(coordinates[1].slice(0, 2));
const polyline = new Cesium.SimplePolylineGeometry({
positions: Cesium.Cartesian3.fromDegreesArray(lineArray),
// width: 3.0,
// vertexFormat: Cesium.PolylineMaterialAppearance.VERTEX_FORMAT,
});
instances.push(
new Cesium.GeometryInstance({
geometry: polyline,
id: `${name}-${i}`, //记录索引
attributes: {
color: new Cesium.ColorGeometryInstanceAttribute(
76 / 255,
57 / 255,
38 / 255,
1,
),
},
}),
);
//改成LineString类型
features[i].geometry.coordinates = coordinates;
features[i].geometry.type = 'LineString';
}
const primitive = new Cesium.Primitive({
geometryInstances: instances, //合并
appearance: new Cesium.PerInstanceColorAppearance({
flat: true,
renderState: {
lineWidth: Math.min(3.0, self._viewer.scene.maximumAliasedLineWidth),
},
}),
});
cesium支持矢量切片的加载在其论坛里呼声很高,但是ceisum依然坚持3dtiles的标准。
mapbox.BasicRenderer类不存在
。
_requestTransformFn未定义
。
。至此,引入MVTImageryProvider
进行实例化,加载到cesium中即可实现矢量瓦片的加载。
onMounted(() => {
const cesiumViewer = new Cesium.Viewer('cesiumContainer', {
infoBox: false
})
const provider = new MVTImageryProvider({
style: sx,//mapbox风格自定义样式
});
provider.readyPromise.then(()=>{
cesiumViewer.imageryLayers.addImageryProvider(provider)
})
}