首页 / 浏览问题 / 组件GIS / 问题详情
使用iobject的toXML()方法,复制地图到工作空间后,地图为空白的
16EXP 2023年11月29日

使用产品:iserver 10.2.1i

操作系统:win10 x64

数据类型: postgres

我通过 toXML()方法获取字符串,使用Maps.add()方法保存,最后保存工作空间,但是为什么工作空间的地图为空白呢,只有复制地图名,其他的复制了个寂寞?

然后 fromXML() 方法是不需要用到的嘛

最后导入后却是空白的

1个回答

您好,初步分析,您的地图中使用到了工作空间'workspaceSrc'下数据源中的数据集,在您将地图从workspaceSrc 复制到 workspaceDesc前,您需要将地图使用到的数据源也添加到workspaceDesc工作空间中。

希望能帮助到您
360EXP 2023年11月29日

好的, 那我想请问  

1、fromXML()  这个方法,我们是用不到是吗?

2、地图的名称是不是得和    数据集名称+数据源名称一一对应  才能显示?

您好,
1、关于 formXML方法的情景是: 任何地图都可以导出成 xml 字符串,而地图的 xml 字符串也可以导入成为一个地图来显示。地图的 xml 字符串中存储了关于地图及其图层的显示设置以及关联的数据信息等。

现在您的代码情景中面临的问题是:从工作空间workspaceSrc 中的地图导出为XML字符串后,将其添加到工作空间workspaceDesc中,但如果地图所需的数据源名称在工作空间workspaceDesc中没有的话,图层找不到所需数据源所以未能成功显示,然后图层图标显示为一个问号图标。
对于您提到的"我们是用不到是吗?",您可以提供您的原始需求即想要达到的效果,我这边为您分析尝试给到您一些建议。

2. 地图名称 和 "数据集名称+数据源名称" 对于显示来说没有关联关系,您可以选中地图右键“重命名”。
截图中您目前的地图名称呈现为 "数据集名称+数据源名称"是因为在您选中数据集右键添加到新地图后,系统默认使用"数据集名称+数据源名称"的规则为地图命名,以便您在打开多个地图时进行区分。您可以在保存地图时进行重命名。

我现在的原始需求,其实简单,就是读取一份工作空间文件,将里面的数据集、地图完整得复制到我当前的pg数据库的工作空间下

1、现在我参考文档,自己写出如下代码,可以实现复制普通的数据集,想问一下我这样子写的思路有无问题,有无改善的地方

log.info("数据源打开成功!");
                // 现在需要将工作空间下面的数据源下的数据集全部给加到现有的数据库中
                Datasources datasourceSrcList = workspaceSrc.getDatasources();
                String caption = workspaceSrc.getCaption();
                log.info("工作空间显示名称为" + caption);

                List<String> dataSetNameList = new ArrayList<>();
                for (int i = 0; i < datasourceSrcList.getCount(); i++) {
                    Datasource datasourceSrc = datasourceSrcList.get(i);
                    Datasets datasets = datasourceSrc.getDatasets();
                    for (int j = 0; j < datasets.getCount(); j++) {
                        Dataset dataset = datasets.get(j);
                        // 返回一个可用的目标数据集的名称,复制数据集
                        String datasetName = datasourceDesc.getDatasets()
                                .getAvailableDatasetName(IMPORT_DATASET_SUFFIX + dataset.getName());
                        Dataset newDataset = datasourceDesc.copyDataset(dataset, datasetName, EncodeType.INT32);
                        dataSetNameList.add(datasetName);
                        log.info("数据集" + newDataset.getName() + "类型为" + newDataset.getType() + "添加成功");
                    }


                    Maps maps = workspaceSrc.getMaps();

                    Datasets datasets1 = datasourceDesc.getDatasets();
                    for (int k = 0; k < maps.getCount(); k++) {
                        Map srcMap = new Map(workspaceSrc);
                        srcMap.open(workspaceSrc.getMaps().get(k));

                        // 将XML格式的地图对象转换为地图对象
                        Map targetMap = new Map(workspaceDesc);
                        Layers layers = srcMap.getLayers();

                        log.info("图层计数为:" + layers.getCount());
                        for (int j = 0; j < layers.getCount(); j++) {
                            Layer layer = layers.get(j);
                            String name = layer.getName();
                            log.info("图层名称为:" + name);
                            LayerGroup parentGroup = layer.getParentGroup();
                            if (null != parentGroup) {
                                for (int l = 0; l < parentGroup.getCount(); l++) {
                                    Layer childLayer = parentGroup.get(l);
                                    String childLayerName = childLayer.getName();
                                    String[] split = childLayerName.split("@");
                                    Dataset dataset = datasets1.get(IMPORT_DATASET_SUFFIX + split[0]);
                                    if (null != dataset) {
                                        targetMap.getLayers().insert(j, dataset);
                                    }
                                }
                            } else {
                                String[] split = name.split("@");
                                Dataset dataset = datasets1.get(IMPORT_DATASET_SUFFIX + split[0]);
                                if (null != dataset) {
                                    log.info("数据集名称为:" + dataset.getName());
                                    // targetMap.getLayers().insert(j, dataset);
                                    targetMap.getLayers().add(dataset, true);
                                }
                            }
                        }

                        workspaceDesc.getMaps().add(IMPORT_DATASET_SUFFIX + srcMap.getName(), targetMap.toXML());
                        workspaceDesc.save();

                        //释放资源
                        srcMap.close();
                        srcMap.dispose();

                    }
                }

                dataSourceVO.setDataSourceName(datasourceDesc.getAlias());
                dataSourceVO.setDataSetNameList(dataSetNameList);

                if (saveFlag) {
                    // 封装为当前nacos配置下的工作空间
                    WorkspaceConnectionInfo workspaceConnectionDesc = vectorFileHandleService.assignWorkspace(connectionDTO.getName());

                    boolean saveResult = workspaceDesc.saveAs(workspaceConnectionDesc);
                    if (saveResult) {
                        log.info("导入工作空间成功");
                    } else {
                        return R.fail("另存失败!");
                    }
                }

2、但是样式这些并没有复制到,是不是得特殊处理??

(左边入库后的,右边是原文件)  导致地图显示不完整

您好,请可参考相同问题对您的回复, https://ask.supermap.com/137046 

不行啊,对应的问题还是没解决啊,可以帮忙看一下吗
你好,现在我还是使用toXML()方法, 获取字符串后,把字符串里面之前的数据源,替换为现在的数据源名称,工作空间保存为地图,然后就找到新增对应的数据源和数据集了,地图就可以显示了!  谢谢!
不客气,感谢您的反馈,这将帮助更多的人。
...