二三维缓存 |
场景缓存是基于整个场景生成缓存,通过一次操作,即可将已经加载到场景中的不同类型的数据图层生成对应类型的缓存。
在生成场景缓存时,影像图层对应影像缓存图层,地形图层对应地形缓存图层,矢量图层对应矢量缓存图层,地图图层对应地图缓存图层,如果是缓存图层(比如模型缓存图层)或者KML图层,则保持不变。
场景缓存生成后,形成一个新的工作空间和若干缓存文件夹。新的工作空间中不仅保存着各种新生成的缓存图层,还保存了各个缓存图层的风格信息。默认情况下,新生成的工作空间和用于生成缓存的场景名称相同,用户可以通过设置相应接口指定生成的工作空间及场景的名称。
下面介绍如何使用SuperMap组件产品来生成场景缓存。
该实例使用的示范数据路径:安装目录下\SampleData\World\World.smwu及安装目录下\SampleData\BeijingDEM\BeijingDEM.udb。包含的主要功能为:打开工作空间及数据源;创建场景;加载数据到场景;生成场景缓存。
在工程中新建两个文件:MainFrame 和SampleRun,前者定义了一个工作空间对象和一个场景控件对象,同时定义了一个加载数据和生成场景缓存的按钮,用来显示场景控件和执行相关功能;后者用于执行前者定义按钮的响应。在 SampleRun 中添加如下代码打开指定的工作空间及数据源。
private void initialize() { try{ //打开工作空间 WorkspaceConnectionInfo workspaceConnectionInfo = newWorkspaceConnectionInfo(); workspaceConnectionInfo.setType(WorkspaceType.SMWU) ; String file = "D:/Program Files/SuperMap/SuperMap iObjects Java/SampleData/World/World.smwu"; workspaceConnectionInfo.setServer(file); m_workspace.open(workspaceConnectionInfo);
//获取数据源 m_datasource = m_workspace.getDatasources().get(0);
//打开BeijingDEM数据源 DatasourceConnectionInfo datasourceConnectionInfo = new DatasourceConnectionInfo(); datasourceConnectionInfo.setServer("D:/Program Files/SuperMap/SuperMap iObjects Java/SampleData/BeijingDEM/BeijingDEM.udb"); datasourceConnectionInfo.setAlias("BeijingDEM"); m_datasourceDEM = m_workspace.getDatasources().open(datasourceConnectionInfo); } catch (Exception e) { System.out.println(e.getMessage()); } } |
与影像、矢量缓存等不同,场景缓存需要新建一个三维场景,该场景从场景控件中得到,在inition中添加代码如下:
//创建场景 m_scene = m_sceneControl.getScene(); m_scene.setWorkspace(m_workspace); |
获取矢量数据集、影像数据集、栅格数据集及地图数据,并加载到场景中。数据集以普通图层或地形图层的方式加载到场景中。对于矢量数据集、影像数据集、地图数据等均以普通图层的方式加载到场景中;对于栅格数据集,如果选择影像方式,则作为普通图层加载到场景中,如果选择地形方式,则作为地形图层加载到场景中。具体代码如下:
public void loadData(){ //加载矢量数据集 Layer3DSettingVector layer3DSettingVector = new Layer3DSettingVector(); DatasetVector datasetVector = (DatasetVector)m_datasource.getDatasets().get("World"); Layer3D layerVector = m_scene.getLayers().add (datasetVector, layer3DSettingVector, true, "World");
//加载影像数据集 Layer3DSettingImage layer3DSettingImage = new Layer3DSettingImage(); DatasetImage datasetImage = (DatasetImage)m_datasource.getDatasets().get("night"); Layer3D layerImage = m_scene.getLayers().add (datasetImage, layer3DSettingImage, true, "night");
//加载地图数据 String name = m_workspace.getMaps().get(0); Layer3D layerMap = m_scene.getLayers().add(name, Layer3DType.MAP, true, "layerMap");
//加载栅格数据集 DatasetGrid datasetGrid = (DatasetGrid)m_datasourceDEM.getDatasets().get("Raster"); TerrainLayer terrainlayer = m_scene.getTerrainLayers().add(datasetGrid, true, "Raster"); } |
指定生成场景缓存的路径、生成的工作空间及场景的名称,设置需要生成缓存的图层,生成场景缓存。值得注意的是,SuperMap 组件产品默认的空间版本是UGC20,该版本生成的缓存数据其工作空间无场景信息,因此需设置场景缓存对象的工作空间链接信息的版本为UGC60。代码如下:
public void buildSceneCache(){ //设置生成场景缓存的路径 String output = "G:/Result/"; System.out.println("m_scene==null"+m_scene==null); //创建场景缓存 m_sceneCacheBuilder = new SceneCacheBuilder(); m_sceneCacheBuilder.setScene(m_sceneControl.getScene()); m_sceneCacheBuilder.setOutputFolder(output); //设置哪些普通图层对应的数据会生成缓存 String[] layerNames = {"World", "night", "layerMap"}; m_sceneCacheBuilder.setOutputLayerNames(layerNames);
//设置哪些地形图层对应的数据会生成缓存 String[] terrainLayerNames = {"Raster"}; m_sceneCacheBuilder.setOutputTerrainLayerNames(terrainLayerNames);
//设置新生成的场景的名称 m_sceneCacheBuilder.setOutputSceneName("Scene"); //设置场景缓存的缓存策略 m_sceneCacheBuilder.setStorageType(StorageType.Original); //设置场景缓存的图片大小 m_sceneCacheBuilder.setImageSize(CacheImageSize.SIZE256);
// 设置空间连接信息,这里需要注意的是默认情况下,WorkspaceVersion为 UGC20, // 此时场景缓存生成的工作空间中时不存在场景的,因此要设置成 UGC60 m_workspaceConnectionInfoCache = new WorkspaceConnectionInfo(); m_workspaceConnectionInfoCache.setServer(output + "Scene.smwu"); m_workspaceConnectionInfoCache.setType(WorkspaceType.SMWU); m_workspaceConnectionInfoCache.setVersion(WorkspaceVersion.UGC60); m_sceneCacheBuilder.setOutputWorkspaceConnectionInfo (m_workspaceConnectionInfoCache); // 生成场景缓存 m_sceneCacheBuilder.build(); } |
用户可以通过设置SceneCacheBuilder.setOutputLayerNames() 方法来指定需要生成缓存的普通图层,通过设置setOutputTerrainLayerNames() 方法来指定需要生成缓存的地形图层。对这两个接口的设置不同,生成的缓存也不同,具体情况如下:
1. 对setOutputLayerNames() 与 setOutputTerrainLayerNames() 两个方法均不调用,则所有的普通图层对应的数据及所有的地形图层对应的数据都会生成缓存。
2. 仅调用 setOutputLayerNames() 方法,则指定的普通图层对应的数据及所有地形图层对应的数据会生成缓存。
3. 仅调用 setOutputTerrainLayerNames() 方法,则指定的地形图层对应的数据及所有普通图层对应的数据会生成缓存。
4. 同时调用 setOutputLayerNames() 和setOutputTerrainLayerNames() ,且参数不为空则:
对于setOutputLayerNames() 方法指定的普通图层将生成对应缓存;
对于setOutputTerrainLayerNames() 方法指定的地形图层将生成地形缓存;
setOutputLayerNames() 方法对地形图层无效,setOutputTerrainLayerNames() 方法对普通图层无效。
5. 若同时调用setOutputLayerNames() 和setOutputTerrainLayerNames() ,且参数均为空,则不会生成缓存。
场景缓存生成后,形成一个新的工作空间和若干缓存文件夹。新的工作空间中不仅保存着各种新生成的缓存图层,还保存了各个缓存图层的风格信息;各文件夹下对应的是不同类型的缓存数据,文件夹的内部目录结构与其对应的缓存类型的目录结构一致。如图5‑1,Scene.smwu是新的工作空间,其它是各个缓存文件夹。
|
图5‑1场景缓存生成结果示范图 |
用户可以通过 SuperMap Deskpro .NET 产品一键式的生成整个场景所对应的场景缓存数据,然后把此场景缓存数据整个部署到服务器端发布。也可以把场景直接部署到服务器端,直接动态的生成场景缓存,动态的发布。客户端根据接收到场景缓存所对应的工作空间,恢复整个三维场景,每个图层根据下载策略动态的向服务器端请求切片数据,在切片数据下载完成后,缓存到本地缓存目录下,以方便下次浏览时,不需要每次都去下载。