Cesium 日常问题整理

目录

一、 vue项目中使用cesium且使用geoserver服务

二、 vue项目中使用cesium且使用geoserver服务,实现条件查询及拿到过滤之后的json数据

三、 cql_filter中文字段名问题

四、 铁路样式以及在小比例尺下样式变形问题

五、 广告牌billboard

 (1)新建广告牌

(2)清除模型

(3)billboard贴地形表

(4)设置透明度


一、 vue项目中使用cesium且使用geoserver服务

geoserver上有自带查询功能,我们使用cesium之后,搭配geoserver的瓦片服务,

wfs是发布在地图服务器上矢量数据的要素服务类型,可以对wfs进行查询、新增、更新、删除等操作。

axios({
        method:'get',
        url:'http://localhost:8899/geoserver/xxxxxx/wfs?',  // 服务链接,图层发布的地址
        params:{
          service: 'WFS',  // 服务类型
          version: '1.0.0',  // 版本号
          request: 'GetFeature',
          typeName: 'xxxxxx:xxx',  // 工作空间:图层名称
          maxFeatures: 50,  // 指定返回的数据数量
          outputFormat: 'application/json',  // 输出格式
        },
      }).then(res => {
        //拿到数据之后,你要执行的操作
      })

二、 vue项目中使用cesium且使用geoserver服务,实现条件查询及拿到过滤之后的json数据

对WFS服务进行过滤-基于cql_filter,

CQL(通用查询语言)是为OGC目录规范创建的纯文本语言。GeoServer已将其调整为易于使用的过滤机制。GeoServer实际上实现了一个名为ECQL(Extended CQL)的功能更强大的扩展,它允许表达OGC Filter1.1可以编码的所有过滤器

axios({
        method:'get',
        url:'http://localhost:8899/geoserver/xxxxxx/wfs?',  // 服务链接,图层发布的地址
        params:{
          service: 'WFS',  // 服务类型
          version: '1.0.0',  // 版本号
          request: 'GetFeature',
          typeName: 'xxxxxx:xxx',  // 工作空间:图层名称
          maxFeatures: 50,  // 指定返回的数据数量
          outputFormat: 'application/json',  // 输出格式
          cql_filter: "name like '%" + [查询条件] + "%'",   // cql模式过滤  模糊查询
        },
      }).then(res => {
        //拿到数据之后,你要执行的操作
      })

三、 cql_filter中文字段名问题

问题:URL请求将会在浏览器中进行请求,需要对中文字符进行URLEncoder编码,否则无法查询,

对cql_filter参数进行转码操作,将其转为Unicode编码,

使用方式 :str2Unicode("要转换的字符串")

var str2Unicode = function(str) { 
    var es=[]; 
    for(var i=0;i < str.length;i++) 
        es[i]=("00"+str.charCodeAt(i).toString(16)).slice(-4); 
    return "\\u"+es.join("\\u"); 
} 

 完美解决。

四、 铁路样式以及在小比例尺下样式变形问题

铁路样式采用遮盖的方式实现,既底下放一层灰色的较粗线,上面再放一条较细的白线,控制白线的显示隐藏,就能形成铁路的样式

采用分级渲染的方式,

<?xml version="1.0" encoding="UTF-8"?><sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" version="1.0.0">
    <sld:UserLayer>
        <sld:LayerFeatureConstraints>
            <sld:FeatureTypeConstraint/>
        </sld:LayerFeatureConstraints>
        <sld:UserStyle>
            <sld:Name>Default Styler</sld:Name>
            <sld:IsDefault>1</sld:IsDefault>
            <sld:FeatureTypeStyle>
                <sld:Name>simple</sld:Name>
                <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
                <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
                <sld:SemanticTypeIdentifier>simple</sld:SemanticTypeIdentifier>
                <sld:Rule>
            <!-- 配置灰色底,颜色是#7F7F7F,宽度是3 -->
                    <sld:LineSymbolizer>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#7F7F7F</sld:CssParameter>
                           <sld:CssParameter name="stroke-width">3</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
            <!-- 配置白色层的显示和隐藏,同样设置颜色为#FFFFFF(白色),宽度为1,dashoffset和dasharray控制显示和隐藏 -->
                    <sld:LineSymbolizer>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#FFFFFF</sld:CssParameter>
                           <sld:CssParameter name="stroke-width">1.0</sld:CssParameter>
                            <sld:CssParameter name="stroke-dashoffset">13</sld:CssParameter>
                            <sld:CssParameter name="stroke-dasharray">16</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
                    <!-- 分级渲染 -->
                   <sld:MinScaleDenominator>279936</sld:MinScaleDenominator>
                </sld:Rule>
              <sld:Rule>
                    <sld:LineSymbolizer>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#7F7F7F</sld:CssParameter>
                           <sld:CssParameter name="stroke-width">3</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
               
                    <sld:LineSymbolizer>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#FFFFFF</sld:CssParameter>
                           <sld:CssParameter name="stroke-width">1.0</sld:CssParameter>
                            <sld:CssParameter name="stroke-dashoffset">13</sld:CssParameter>
                            <sld:CssParameter name="stroke-dasharray">20</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
                    <!-- 分级渲染 -->
                   <sld:MinScaleDenominator>150000</sld:MinScaleDenominator>
                <sld:MaxScaleDenominator>279936</sld:MaxScaleDenominator>
                </sld:Rule>
               <sld:Rule>
                    <sld:LineSymbolizer>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#7F7F7F</sld:CssParameter>
                           <sld:CssParameter name="stroke-width">4</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
               
                    <sld:LineSymbolizer>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#FFFFFF</sld:CssParameter>
                           <sld:CssParameter name="stroke-width">2.0</sld:CssParameter>
                            <sld:CssParameter name="stroke-dashoffset">13</sld:CssParameter>
                            <sld:CssParameter name="stroke-dasharray">20</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
                   <sld:MinScaleDenominator>30000</sld:MinScaleDenominator>
                <sld:MaxScaleDenominator>150000</sld:MaxScaleDenominator>
                </sld:Rule>
               <sld:Rule>
                    <sld:LineSymbolizer>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#7F7F7F</sld:CssParameter>
                           <sld:CssParameter name="stroke-width">6</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
               
                    <sld:LineSymbolizer>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#FFFFFF</sld:CssParameter>
                           <sld:CssParameter name="stroke-width">3.0</sld:CssParameter>
                            <sld:CssParameter name="stroke-dashoffset">13</sld:CssParameter>
                            <sld:CssParameter name="stroke-dasharray">20</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
                    <!-- 分级渲染 -->
                   <sld:MinScaleDenominator>8000</sld:MinScaleDenominator>
                <sld:MaxScaleDenominator>30000</sld:MaxScaleDenominator>
                </sld:Rule>
               <sld:Rule>
                    <sld:LineSymbolizer>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#7F7F7F</sld:CssParameter>
                           <sld:CssParameter name="stroke-width">6</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
               
                    <sld:LineSymbolizer>
                        <sld:Stroke>
                            <sld:CssParameter name="stroke">#FFFFFF</sld:CssParameter>
                           <sld:CssParameter name="stroke-width">4.0</sld:CssParameter>
                            <sld:CssParameter name="stroke-dashoffset">13</sld:CssParameter>
                            <sld:CssParameter name="stroke-dasharray">20</sld:CssParameter>
                        </sld:Stroke>
                    </sld:LineSymbolizer>
                <!-- 分级渲染 -->
                <sld:MaxScaleDenominator>8000</sld:MaxScaleDenominator>
                </sld:Rule>
            </sld:FeatureTypeStyle>
        </sld:UserStyle>
    </sld:UserLayer>
</sld:StyledLayerDescriptor>

五、 广告牌billboard

billboard也叫广告牌,用图片标注的形式表示地理点位信息。是一种特别简单的模型(D3D里面好像是这么说的),它会自动计算,使图片下面始终面向摄像机,这种技术也叫广告牌技术。

代码中常用到的属性有以下几个:

  • pixelOffset,设置图片的偏移,按屏幕坐标来偏移。
  • pixelOffsetScaleByDistance:设置距离方位内,Billboard或Label的偏移量比例。

  • translucencyByDistance :设置距离方位内,Billboard或Label的半透明度比例。

  • horizontalOrigin(水平对齐)和 verticalOrigin(垂直对齐),代码中设置为左下角,也就是图片的左下角对齐中心点。
  • scaleByDistance:new Cesium.NearFarScalar(1.5e2, 1, 1.5e7, 0.3):按距离缩放,根据摄像机的距离改变实体的scale(缩放比)。
    •  距离大于10000米时,图标不显示,
    •  N earFarScalar:可以用于translucencyByDistance,即按距离设置图标透明度,可以实现渐入渐出效果。
      •  near:摄像机范围的下限,
      • nearValue:摄像机范围下限的值,
      • far:摄像机范围的上限,
      • farValue:摄像机范围上限的值
  • distanceDisplayCondition:获取或设置条件指定在什么距离相机这个广告牌将显示出来。
  • heightReference:获取或设置高度引用的广告牌

  • position:经纬度信息。

 (1)新建广告牌

方法一:在Cesium JS中创建billboardCollection,将创建的两个广告牌添加到billboardColletion中,然后将billboardCollection放在entity中,

let billboards = new Cesium.BillboardCollection(scene:viewer.scene);
let billboard1 = billboards.add({
    image: "img/white.png",
    horizontalOrigin: Cesium.HorizontalOrigin.CENTER, // default
    verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // default: CENTER
    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,  //广告牌贴地
    distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 20000),
    position: new Cesium.Cartesian3.fromDegrees(125.1641667, 39.9522222),
});
let billboard2 = billboards.add({
    image: "img/white.png",
    // pixelOffset: new Cesium.Cartesian2(0, 0),
    position: new Cesium.Cartesian3.fromDegrees(121.1643367, 39.97),
    horizontalOrigin: Cesium.HorizontalOrigin.CENTER, // default
    verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // default: CENTER
    distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 20000)
    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,  //广告牌贴地
});

viewer.scene.primitives.add(billboards);

方法二:以entity方式加载billboard,

// 创建一个billboard广告牌
viewer.entities.add({
    name:"自定义billboard",
    position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
    billboard:{
        image: "image.jpg",
        show: true, // default
        eyeOffset: new Cesium.Cartesian3(0.0, 0.0, 0.0), // default
        horizontalOrigin: Cesium.HorizontalOrigin.CENTER, // default
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // default: CENTER
        scale: 2.0, // default: 1.0
        // color: Cesium.Color.LIME, // default: WHITE
        rotation: Cesium.Math.PI_OVER_FOUR, // default: 0.0
        alignedAxis: Cesium.Cartesian3.ZERO, // default
        width: 25, // default: undefined
        height: 25, // default: undefined
        pixelOffset: new Cesium.Cartesian2(0, -72),
    },
    label: { //文字标签
        text: "这是一个label文字标签",
        font: "20px sans-serif",
        showBackground: true,
        horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
        pixelOffset: new Cesium.Cartesian2(0.0, -39.9522222),
        pixelOffsetScaleByDistance: new Cesium.NearFarScalar(
            1.5e2,
            3.0,
            1.5e7,
            0.5
        ),
    });

(2)清除模型

if(billboard2 != undefined) {
  viewer.primitives.remove(billboard2)  
}

(3)billboard贴地形表

heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,

(4)设置透明度

更改广告牌billboard的颜色,使其具有一个透明度,

color: Ceisum.ColorGeometryInstanceAttribute,fromColor(Cesium.Color.fromCssColorString('#ffffff').withAlpha(0.6))

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: 根据引用\[2\]的解决思路,可能是因为在从PrimeNG转换到Cesium时,遗漏了某些问题。在使用PrimeNG时为了显示界面,将界面的z-index设置为了正值,在改为Cesium后,界面的z-index还是正值。为了解决这个问题,可以尝试将界面的z-index设置为负值,以确保Cesium的元素能够正确覆盖在界面上。另外,根据引用\[3\]的改进之后的代码,可以使用Cesium的实体对象来设置旋转角度,通过调用Cesium.Transforms.headingPitchRollQuaternion方法来计算旋转的四元数,并将其赋值给实体的orientation属性。这样可以实现对实体的旋转操作。 #### 引用[.reference_title] - *1* *3* [Cesium 日常问题整理](https://blog.csdn.net/GhostPaints/article/details/120307777)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Cesium与PrimeNG结合导致界面元素被Cesium覆盖的问题](https://blog.csdn.net/baidu_38271024/article/details/81200548)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值