SuperMap GIS基础产品三维GIS FAQ集锦(4)
【WebGL】三维场景加载iServer发布的高斯坐标系的REST地图服务无效果,怎么办?
【解决办法】cesium不支持高斯投影的坐标系,建议转为墨卡托投影。
【WebGL】前端在添加完S3MTilesLayer后,能否根据点的经纬度,查询出该点的模型高度?
【解决办法】可以通过viewer.scene.sampleHeight()传入模型的经纬度计算高度,例如:
let height = viewer.scene.sampleHeight(
new Cesium.Cartographic(
Cesium.Math.toRadians(longitude),//转换成弧度
Cesium.Math.toRadians(latitude),//弧度
)
);
【WebGL】使用scene.addVectorTilesMap加载矢量瓦片后,如何获取mvt矢量瓦片样式?
【解决办法】获取瓦片风格需要在瓦片加载完成成后才能获取,通过过以下代码,在cesium.when()的回调函数中获得
var layerReadyPromise = mvtLayer.readyPromise;
Cesium.when(layerReadyPromise, function (data) {console.log(mvtMap.mapboxStyle);})
【WebGL】如何计算几何面的中心点?
【解决办法】使用:var pCenter = Cesium.BoundingSphere.fromPoints(polyPositions).center;
【WebGL】官网引用的Echarts版本是多少?根据示例,在yAxis中设置min属性不起作用,如何解决?
【解决办法】官网示例所用的echarts版本是4.0.4,通过console.log(echarts.version)获取查看。根据echarts官方API显示,只设置了min,没有max,max不设置时会自动计算最大值保证坐标轴刻度的均匀分布,所以需要再设置max值即可。
【WebGL】在iserver中预览时,或者webgl中通过scene.open打开场景时,标签专题图有避让遮盖聚合的效果。如何才能完整的显示标签呢?
【问题原因】iserver预览内置的webgl默认设置了避让,通过前端是可以调整的。通过scene.open打开场景,默认也是开启了避让。
【解决办法】需要通过设置layer.isOverlapDisplayed =true,设为true时,重叠的部分依然显示,即不参与避让。
【WebGL】怎么查询一个点1公里范围内的其余点?
【解决办法】有以下三种方法:
1、空间查询,构建geometry的圆进行查询。
2、使用距离查询,“queryParams”:[{…}]”为查询数据集的参数集合,通过name 指定的是查询的目标图层的名称。
3、使用缓冲区分析
【WebGL】初始化cesiumcontainer的时候偶发性就会报错,加载官网的示例也会报错,怎么回事?使用的是AMD显卡。
【解决办法】参考博客进行三维显示配置:https://blog.csdn.net/supermapsupport/article/details/128440798
建议换成英伟达独立显卡。
【WebGL】对地形进行坡度分析后,想要获取某个点的坡度值该如何实现?
【解决方案】WebGL无法直接获取到坡度分析的结果,建议使用桌面进行坡度分析,得到坡度分析的结果,然后发布为数据服务,通过该数据服务去获取某个坐标点的栅格值,该栅格值即为该点的坡度值。
【WebGL】如何让Mvt地图不可选中?
【解决办法】属性:selectEnabled。将地图是否可选中属性设置为false。示例代码:
mvtMap.selectEnabled= false
【WebGL】为什么设置地形图层隐藏viewer.terrainProvider.visible = false没有效果?
【问题原因】设置地形图层显隐,需要开启参数:invisibility
【解决办法】在加载地形的时候,设置参数:invisibility:true,之后即可通过visible参数控制显隐。示例代码:
terrainProvider : new Cesium.CesiumTerrainProvider({
url : URL_CONFIG.SiChuan_TERRAIN,
isSct : true,//地形服务源自SuperMap iServer发布时需设置isSct为true
invisibility:true //是否开启设置地形显隐的功能,默认为false。
}),
【WebGL】如何实现服务的权限管理?
【解决办法】1、在SuperMap iServer服务管理页面中将服务设置权限,改为指定用户可访问
2、在SuperMap iServer用户中心中申请token密钥
3、在iClient for Cesium中设置token密钥,实现加载服务,详情请参考文章:https://blog.csdn.net/supermapsupport/article/details/121210572
【WebGL】哪些图层可以设置多子域,多子域该如何配置?
【解决办法】1、地形、影像、MVT、S3M图层都可以设置多子域
2、利用nginx客户端,映射不同的端口地址来对iServer进行访问,搭建子域环境,提升性能,多子域的配置请参考文章:http://support.supermap.com.cn:8090/webgl/examples/TopicDOC/subdomains.html。
【WebGL】被修饰成单栋楼的倾斜摄影,该如何处理?
【问题原因】被修饰过的倾斜摄影,它的贴图会比较碎,并且会存在4096*4096及以上的大纹理,按常规方法做倾斜入库会导致文件大,加载慢
【解决办法】建议导入为模型数据集,再适当的优化纹理大小,对模型数据集生成缓存,详情请参考文章:
https://blog.csdn.net/supermapsupport/article/details/130404872
【WebGL】三维水面图层,如何更改水流速度和方向?
【解决办法】可以通过S3MTilesLayer类中的waterSpeed参数来更改,传入一个二维的量,用数值的大小表示速度大小,用其x,y的正负来表示水流的方向。示例代码:WaterLayer.waterSpeed = new Cesium.Cartesian2(-2,2)
【WebGL】三维水面图层,是否可以在前端修改水面颜色与波纹强度?
【解决办法】可以,通过S3MTilesLayer类中的waterColor 参数来更改水面颜色;waterWaveScale 来修改波纹大小
【WebGL】如何实现相机绕自身旋转,顺时针观察四周?
【解决办法】有两个方法,
1、使用camera.flyCircle(center)方法,传入的坐标为相机当前的位置坐标;
2、使用setInterval()循环方法,规定每间隔多少时间,修改相机的roll参数使其旋转
【WebGL】如何获取BIM模型的所有id?
【解决办法】使用datasetInfo()方法获取图层的startid和endid。拿到id范围后自己构造整个id数组。范例代码:
layer.datasetInfo().then(function(result){
console.log(result)
})
【WebGL】如何将模型设置为线框模式?
【解决办法】1、将图层的填充风格设置为”填充与轮廓“:layer.style3D.fillStyle = Cesium.FillStyle.Fill_And_WireFrame;
2、设置线框模式:Cesium.WireFrameType.EffectOutline;
线框模式分为特效边框线、四边形边框模式、三角形边框模式、草图边框模式
【WebGL】激光点云模型在iDesktop中通过分层设色设置了颜色,发布后颜色丢失了?
【问题原因】由于渲染机制不同,无法保存桌面的分层设色效果
【解决办法】使用前端代码,对激光点云缓存设置颜色,详细范例请参考:
http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#S3MTiles_pointCloud
【WebGL】绘制一个面同时倾斜摄影和地形开挖,报错“height is not defined”?
【解决办法】地形开挖接口有height深度参数,决定地形向下开挖深度,s3m图层没有height参数,而是将整个绘制区域进行开挖,所以对s3m图层开挖时,不能填写height参数
【WebGL】如何实现管线流动效果?
【解决办法】有两种方式:1、使用尾迹线材质,2、制作数据时贴上带箭头的图片,前端设置纹理流动。详细步骤请参考文章:
https://blog.csdn.net/supermapsupport/article/details/102775780
【WebGL】MVT地图,鼠标选中高亮对象后,需要手动点击其它空白区域释放,是否有接口可以释放选中状态?
【解决办法】有的,在VectorTilesMap类中有releaseSelection()释放选择集方法
【WebGL】目前有几种方式可以实现物体的轨迹移动动画?
【解决办法】有3种。
1、动态图层(适用于拥有多个实例、多个对象沿不同路径移动,例如城市交通网络的情况下)。
2、kml节点动画(适用于单个模型对象沿指定路径移动,由于节点坐标和时间都以文件方式记录,修改不方便)。
3、SampledPositionProperty类(适用于单个模型对象沿指定路径移动,方便修改时间、节点坐标、运行速度)
【iDesktop】倾斜摄影数据入库之后只显示一小部分数据怎么办?
【问题原因】倾斜摄影数据的tile文件夹中有除了osgb文件之外的其他后缀的数据
【解决办法】将倾斜摄影数据的tile文件夹中除osgbosgb文件之外的其他后缀的数据删除,然后再生成配置文件与倾斜入库
【iDesktop】三维面生成缓存后,在场景中缩放移动视角时,面会闪烁
【问题原因】存在重叠面,移动与缩放场景视角时就会有闪面的情况
【解决办法】在场景属性中开启场景的深度优化即可
【iDesktop】为什么iDesktop的三维地理设计功能卡没有显示出来
【解决办法】需要在iDesktop中打开场景;如果还是没有的话,该功能模块被隐藏了,可以在环境设计里面开启功能模块
【WebGL】可以直接加载shp与geojson格式的数据在场景中使用吗?
【解决办法】加载GeoJSON数据可以使用Cesium原生接口GeoJsonDataSource,具体使用方法可以参考api文档http://support.supermap.com.cn:8090/webgl/web/apis/3dwebgl.html ,搜索GeoJsonDataSource即可。shp文件的话不能直接加载,但是可以使用使用开源工具如:GDAL等将其转换为GeoJSON数据进行加载。
【WebGL】可以动态修改通视分析中观察点的位置吗?
【解决办法】可以在前端动态修改sightline.viewPosition即可实现
【WebGL】在距离较远的情况下管线图层只显示线,不显示模型是为什么?
【问题原因】lod影响了,在远处显示的是粗糙层
【解决办法】设置图层lod,layer.lodRangeScale = 100
【WebGL】添加geojson的线数据铺满全球
【问题原因】geojson里面的线数据节点坐标是投影坐标系下的
【解决办法】将数据换成经纬度坐标即可
【WebGL】添加相机定位之后图层不加载了是为什么?
【问题原因】相机定位代码书写错误,导致后续代码未执行
【解决办法】正确的相机定位代码:
scene.camera.setView({
destination: new Cesium.Cartesian3.fromDegrees(116.4566, 39.9149, 5323.445971240632),
orientation: {
heading: 3.1612,
pitch: -1.5188,
roll: 6.283185307179563
}
})
【WebGL】如何设置相机可以进入地下?
【解决办法】
viewer.scene.undergroundMode = true; //设置开启地下场景
viewer.scene.screenSpaceCameraController.minimumZoomDistance = -1000; //设置相机最小缩放距离,距离地表-1000米
【WebGL】vue项目中使用handler监听之后会变得很卡是为什么?
【问题原因】handler以及viewer等属性定义在data里面会被vue劫持造成卡顿
【解决办法】不要将handler以及viewer等属性定义在data里面,拿到外部即可
【WebGL】球体加上一个自定义的背景图片
【解决办法】SingleTileImageryProvider只支持经纬度,全球范围覆盖的话图片的宽高比保持为2:1,若设置了rectangle,可按照rectangle来设置图片的宽高比,避免图片拉伸,影响显示效果。代码如下:
viewer.imageryLayers.addImageryProvider(new Cesium.SingleTileImageryProvider({
url : './images/worldimage.jpg'
}));
【WebGL】高亮设置被图层设置覆盖了,如何设置不被模型遮挡?
【解决办法】可以将选中对象模式设置为不会被遮挡的轮廓线模型,选择选取对象的显示风格,代码如下:
layer.selectColorType = Cesium.SelectColorType.ALWAYS_SHOW_SILHOUETTE;
layer.selectedColor = Cesium.Color.DEEPSKYBLUE;
具体效果如图:
【WebGL】广告牌被地球挡住了怎么办?
【解决办法】
1.可以设置disableDepthTestDistance值来解决
viewer.entities.add({
id: "test",
position: Cesium.Cartesian3.fromDegrees(longitude, latitude,height),
billboard: {
image: './images/xxxxxx.jpg',
disableDepthTestDistance:Number.POSITIVE_INFINITY//返回正无穷大
}
});
2.设置viewer.scene.globe.depthTestAgainstTerrain=false取消深度测试
【WebGL】修改球体上默认的影像图片
【解决方法】在for Cesium包下将文件夹(SuperMap iClient3D 11i (2022) SP1 for Cesium_CH\Build\Cesium\Assets\Textures\NaturalEarthII)路径下的图片替换为自己想要的影像即可。
【WebGL】初始化球踢的canvas或者img标签和div一块显示的时候中间会有几像素的缝隙
【解决方法】给canvas/img标签添加display:block
【WebGL】在加载天地图的时候出现了同一个项目win能加载 mac上访问加载不出天地图, 请求是返回了图片的
【解决方法】注释掉viewer.scene.terrainProvider.isCreateSkirt = false; 即可正常显示
【WebGL】本地部署的WebGL查看某些示例的时候地球渲染不出来只有星空,但官网示例可以正常渲染
【解决方法】影像图层没有加载出来,注释掉影像部分加载代码,或者更换本地能正常访问加载的地图影像.
【WebGL】在iClient for Cesium中相机定位方法setView与flyTo的区别是什么?
【解决办法】在iClient for Cesium中setView的可以直接定位到指定的空间位置,而flyTo则是从当前视角飞行至新的空间位置。
【WebGL】在iClient for Cesium中相机定位方法flyTo如何调整飞行的时长?
【解决办法】在iClient for Cesium中可以通过调整flyTo中duration的参数控制飞行的时间长度。
【WebGL】在iClient for Cesium中相机定位方法flyTo如何飞行至某矩形范围框范围内?
【解决办法】在iClient for Cesium中可以通过Cesium.Rectangle.fromDegrees(west, south, east, north)的方法设置指定矩形范围框。在定位时使用该范围即可实现定位。使用方法如下
viewer.camera.flyTo({
destination : Cesium.Rectangle.fromDegrees(west, south, east, north)
});
【WebGL】在iClient for Cesium中加载带Bin的GLTF模型时出现浏览器下载Bin的情况应该如何解决?
【解决办法】在iClient for Cesium中加载GLTF模型出现浏览器下载Bin的情况时,主要由于GLTF版本过新导致,需要通过第三方插件转换GLTF模型。
可以使用Blender软件,将gltf导入在导出为gltf2.0的单文件格式后进行加载。
【WebGL】如何在iClient for Cesium中通过loadjson方法加载geojson数据?
【解决办法】在iClient for Cesium中通过load方法加载json数据,是读取了json中的feature在通过entity进行绘制。使用方法可以参考下面代码
Cesium.loadJson('./data/json/test.json').then(function(jsonData) {
for (let i = 0; i < jsonData.features.length; i++) {
let pts = [];
var ifeature = jsonData.features[i];
var datapoints = ifeature.geometry.coordinates;
for (let j = 0; j < datapoints.length; j++) {
var longitude = datapoints[j][0];
var latitude = datapoints[j][1];
pts.push(longitude, latitude)
}
var cc = viewer.entities.add({
id: i,
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray(pts),
width: 10,
material: new Cesium.PolylineOutlineMaterialProperty({
color: Cesium.Color.ORANGE,
outlineWidth: 2,
outlineColor: Cesium.Color.BLACK,
}),
}
});
}
});
【WebGL】在iClient for Cesium中如何修改椭球体参数?
【解决办法】在iClient for Cesium中默认使用的是圆球初始化场景的,如需修改为椭球体,则可以在初始化球体前修改椭球体。实现代码参考下面代码
var obj = [6378137.0, 6378137.0, 6356752.3142451793];
Cesium.Ellipsoid.WGS84 = Object.freeze(new Cesium.Ellipsoid(obj[0], obj[1], obj[2]));
var viewer = new Cesium.Viewer('cesiumContainer');
【WebGL】在iClient for Cesium中如何修改矢量瓦片中标签的高度?
【解决办法】在iClient for Cesium中修改矢量瓦片标签的高度,可以使用style3D的方法对其bottomAltitude进行设置。该方法仅对标签生效,对线、面图层不生效。
var style3D = new Cesium.Style3D();
//设置底部高程。
style3D.bottomAltitude = 10;
//获取底部高程值。
var altitude = style3D.bottomAltitude;
【WebGL】在使用iClient for Cesium 11i 中加载模型后,如果出现地上视角看到地下模型应该如何解决?
【解决办法】在iClient for Cesium 11i版本中,默认关闭了场景的深度检测,在加载模型时,可能会出现地下模型跑到地上的情况。开启深度检测即可解决。
viewer.scene.globe.depthTestAgainstTerrain = true
【WebGL】在使用iClient for Cesium中通过pickPosition()方法点击,出现拾取坐标不准的情况该如何解决?
【解决办法】在iClient for Cesium 中,viewer.scene.pickPosition()拾取对应位置的Cartesian3,适用于模型表面位置的选取,拾取三维物体的坐标等。但在拾取时一定要开启深度检测(viewer.scene.globe.depthTestAgainstTerrain = true),否则会出现拾取坐标不准的情况。
【WebGL】开发系统,在现实时间晚上打开就全黑了,如何变成把白天正常?
【问题原因】数据本身是没有变的,而是预览加载的场景随着系统时间会变化。
【解决办法】
在前端加载时可以使用代码设置固定场景时间:
// 改变时间设置光照效果
var utc=Cesium.JulianDate.fromDate(new Date("2021/07/04 04:00:00"));
//北京时间=UTC+8=GMT+8
viewer.clockViewModel.currentTime = Cesium.JulianDate.addHours(utc,8,new Cesium.JulianDate());
this.viewer.scene.light = new Cesium.DirectionalLight({ //去除时间原因影响模型颜色
direction: new Cesium.Cartesian3(0.35492591601301104, -0.8909182691839401, -0.2833588392420772)
})
【WebGL】是否可以加载4528投影坐标系的mvt瓦片?
【问题原因】WebGL球面场景是地理坐标系球,只能加载地理坐标系数据或者3857全球墨卡托投影坐标系。
【解决办法】1.使用平面场景进行加载4528投影坐标系或任意投影坐标系均可;
2.将原始数据投影转换成地理坐标系(如4326)后,再进行前片给前端使用。
【WebGL】如何更换地球的底图?
【解决办法】加载一个图片影像图层,Cesium.SingleTileImageryProvider
【WebGL】文本文件的点云去和在WebGL前端加载使用。
【解决办法】使用iDesktop或iDesktopX的三维数据-生成点云缓存功能,将点云数据生成缓存,对缓存发布三维服务工前端WebGL使用。
【WebGL】用viewer.scene.open()将一个场景打开两次,只有一次生效一套图层,希望产生多套图层怎么办?
【问题原因】如果是同一份数据scene.open是没有办法打开多个的,不同的数据scene.oepn可以打开多个。
【解决办法】同一份数据您如果想要打开多个,建议使用scene.addS3MTilesLayerByScp,需要注意同一份数据想要加载多个的话,add时要给不同的图层名称。
http://support.supermap.com.cn:8090/webgl/docs/Documentation/Scene.html
【WebGL】区域面数据集边框,如何实现类似类似 earthsdk 的自定义图元-动态轮廓效果?
【解决办法】使用自发光纹理或纹理流动或泛光(可加定时器配合)等多种方法调整实现你想要的具体效果,实现路线很多:
https://blog.csdn.net/THEDEAMON/article/details/112967860
http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#scanLine
http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#airlinesTrailLines
http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#emissionTexture
http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#tx_lightSource
建议比较简单的实现方式就是直接使用线框线数据而不是面数据,直接做线数据的特效(比如泛光、自发光)
【WebGL】如何使非贴地的动态线数据贴地加载?
【解决办法】思路:
new一个DataSource,把entity加到DataSource里的,把DataSource加到viewr.datasources.add()时,给贴地属性clampToGround : true。
http://support.supermap.com.cn:8090/webgl/docs/Documentation/Viewer.html
http://support.supermap.com.cn:8090/webgl/docs/Documentation/DataSourceCollection.html
http://support.supermap.com.cn:8090/webgl/docs/Documentation/DataSource.html
贴地:http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#KML_route
【WebGL】为什么三维管线只有放大到非常近的时候才会显示管道,其他情况都是矢量线。
【问题原因】造成这个情况有两种原因:
1.是LOD层级造成的, 设置layer.lodRangeScale =100
2.线为0的绝对高度导致的,可以在前端关闭深度检测, viewer.scene.globe.depthTestAgainstTerrain = true; 以及设置贴地
【WebGL】三维面数据在场景中,有地形的情况下,拉近后不显示面。如果不加地形就会一直显示面,不知道是什么原因?(在桌面打开是正常的)
【解决方法】三维面生成三维缓存时,选择的是S3M3.0格式的缓存,该缓存默认为椭球加载,修改为2.0之后可以正常加载
【WebGL】球面场景中通过S3MTilesLabelStyle加载的标签专题图的标签,在拉近之后会陷入地面之下,如何设置可以让它一直在前端正常显示?
【解决方法】这个接口下有一个heightReference方法,通过设置不同的高度模式,比如贴模型。同时关闭深度检测
【WebGL】用ellipse这个属性画圆,可以设置圆的外边框线宽度么?
【解决方法】ellipse的outlinewidth在原生Cesium中属性设置也是无效的。
目前entity的多边形设置outlineWidth属性也是没有效果的。
建议使用polygon以实体线去代替边线实现轮廓效果。
【WebGL】地形隐藏接口viewer.terrainProvider.visible = false;不生效
【解决方法】地形显隐,需要在地形添加的时候设置invisibility:true。
也可以使用地形替换的方法去隐藏地形:https://www.jianshu.com/p/42b2457fa0b7