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, // defaultverticalOrigin: Cesium.VerticalOrigin.BOTTOM, // default: CENTERheightReference: 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, // defaultverticalOrigin: Cesium.VerticalOrigin.BOTTOM, // default: CENTERdistanceDisplayCondition: 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, // defaulteyeOffset: new Cesium.Cartesian3(0.0, 0.0, 0.0), // defaulthorizontalOrigin: Cesium.HorizontalOrigin.CENTER, // defaultverticalOrigin: Cesium.VerticalOrigin.BOTTOM, // default: CENTERscale: 2.0, // default: 1.0// color: Cesium.Color.LIME, // default: WHITErotation: Cesium.Math.PI_OVER_FOUR, // default: 0.0alignedAxis: Cesium.Cartesian3.ZERO, // defaultwidth: 25, // default: undefinedheight: 25, // default: undefinedpixelOffset: 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))