Geoserver发布WFS(Web Feature Service)服务
数据准备第二种方式加载数据,利用for循环加载多个图层。首先将获取数据(每获取一次获得pomise,将其加入数组中),其次利用Promise.all()异步加载所有图层
- loadVideoLayers(indexes) {
- let that = this;
- try {
- let proArr=[];
- // 添加视频监测图层
- for (const index of indexes) {
- // console.log(index)
- // 2. WMS服务 江苏省视频监
- let pro = axios({
- url: '/api' + this.videoLayer[index],
- method: 'get',
- })
- proArr.push(pro)
- }
- Promise.all(proArr).then(function(resolve) {
- console.log("resolve--", resolve);
- resolve.map(async(item, index) => {
- //返回promise
- let ds = Cesium.GeoJsonDataSource.load(item.data)
- let layer = await that.viewer.dataSources.add(ds)
- that.videoLayers.push(layer);
- })
- })
- }
- }
在Cesium中,修改点实体的样式可以通过使用billboard
属性来设置自定义图标。为了使用自定义的Ant Design或Vue Icon库中的图标,需要先将图标转换成可以在Cesium中使用的格式,例如Canvas或者Data URL。
以下是一个示例,展示了如何使用Ant Design图标库中的图标并将其设置为Cesium中的点实体的样式:
安装必要的库
首先,确保安装了Cesium和Ant Design图标库。如果使用Vue,则还需要安装Vue的依赖。
npm install cesium @ant-design/icons
创建一个Ant Design图标的Canvas绘制函数
使用Canvas API来绘制Ant Design图标,并将其转换为Data URL。这个Data URL可以直接用作Cesium点实体的billboard
图像。
- <template>
- <a-icon type="video-camera" theme="filled" style="color:darkgray;" ref="lev1"/>
- </template>
- <script>
- export default{
- methods:{
- findSVGEkement(){
- let refName=lev1
-
- //vue中实现
- const iconElement = this.$refs[refName].$el; // 获取<a-icon>组件的DOM元素
- // 查询SVG元素
- let svg = iconElement.querySelector('svg')
- console.log(svg.outerHTML); // 输出SVG元素或进行其他操作
- return svg;
-
- //html中实现
- // console.log(element)
- // if (element.tagName.toLowerCase() === 'svg') {
- // return element;
- // }
- // for (let child of element.children) {
- // const found = this.findSVGElement(child);
- // if (found) return found;
- // }
- // return null;
- }
- }
-
- },
-
- }
- </script>
- async getIconAsDataURL(index) {
- //递归获取svg标签
- //0-2=>1-3
- index=index+1;
- //通过变量动态地访问对象的属性
- let refName='lev'+index
- const svgElement = this.findSVGElement(this.$refs[refName]);
- if (!svgElement) {
- console.error('SVG element not found');
- return null;
- }
- if (index === 1){
- svgElement.style.fill = "darkgray";
- }
- else if(index===2) {
- svgElement.style.fill = "orange"
-
- }else {
- svgElement.style.fill ="red"
- }
-
- const svgString = new XMLSerializer().serializeToString(svgElement);
- const canvas = document.createElement('canvas');
- canvas.width = 64;
- canvas.height = 64;
- const ctx = canvas.getContext('2d');
-
- const img = new Image();
- img.src = 'data:image/svg+xml;base64,' + btoa(svgString);
- return new Promise((resolve) => {
- img.onload = () => {
-
- ctx.drawImage(img, 0, 0, 64, 64);
- resolve(canvas.toDataURL('image/png'));
- };
- });
- }
一旦我们有了图标的Data URL,可以将其用于Cesium实体的billboard
属性。
- loadVideoLayers(indexes) {
- let that = this;
- try {
- let proArr=[];
- // 添加视频监测图层
- for (const index of indexes) {
- // console.log(index)
- // 2. WMS服务 江苏省视频监
- let pro = axios({
- url: '/api' + this.videoLayer[index],
- method: 'get',
- })
- proArr.push(pro)
- }
- Promise.all(proArr).then(function(resolve) {
- console.log("resolve--", resolve);
- resolve.map(async(item, index) => {
- //返回promise
- let ds = Cesium.GeoJsonDataSource.load(item.data)
- let layer = await that.viewer.dataSources.add(ds)
- that.videoLayers.push(layer);
- ds.then(datasource=>{
- datasource.entities.values.forEach(entity=>{
- let promiseRes = that.getIconAsDataURL(index)
- promiseRes.then(url=>{
- entity.billboard = {
- image: url,
- width: 12,
- height:12
- }
- })
- })
- })
- })
- })
-
- // //show属性控制图层是否可见
- // // layer.show=false
- // })
- }catch (e){
- console.log(e)
- }
- },