首页 / 浏览问题 / 组件GIS / 问题详情
iobject实现入库如何复制地图下的图层集及专题图和风格等等?
12EXP 2023年11月30日

使用产品:iserver 10.2.1i

操作系统:win10 x64

数据类型: postgres

我现在的原始需求,其实简单,就是读取一份工作空间文件,将里面的数据集、地图完整得复制到我当前的pg数据库的工作空间下,但是要处理 地图下的图层集及专题图和风格,好复杂,gis小白不知道如何处理

1、图层集如何读取? 

2、专题图如何处理?

3、如何保存原始的地图的风格和布局? 

4、我单单使用 toXML()保存不行,保存的都是之前旧的数据集,我另外自己写了个方法,只能保存普通的数据集,但是复杂的业务不能处理,  大佬可以给出一些思路 和 提供相应的处理业务方法?

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();
                            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();

                    }
                }

1个回答

您好,如果只是文件型工作空间里的地图配置、数据源配置要存到数据库型工作空间里,

不用一张张的每个地图里的每一个图层,直接打开文件型工作空间,另存为数据库型工作空间就行了。

WorkSpace.saveAs

同时另存在iDesktop/iDesktopX桌面端就可以完成,您可以是用桌面端尝试一下。

希望可以帮助到您。
9,633EXP 2023年12月01日

你好,我直接打开文件型工作空间,然后另存到我的数据库型工作空间

现在数据是可以显示了,但是我其实想入库到sdx数据库中,而不是连接信息是udb文件,

因为如果是udb文件,那我还不如直接拿文件型工作空间去操作,还用数据库再嵌套多一层么?

所以我要如何入库到sdx的工作空间呢

数据集本身也需要迁到数据库里的话,建议工作空间另存成数据库型工作空间后。

1.打开或新建数据库型数据源

2.将原文件型数据源里的数据集都复制到新的数据库型数据源里,数据集名称不要变

3.在这个数据库型工作空间里关闭文件型数据源(因为一个工作空间里数据源不能重名)

4.把数据库型数据源的名称重命名成原文件型数据源的名称

因为地图图层的数据指向,是使用工作空间内部的数据路径地址,即 数据集名@数据源名,这个就是图层的数据路径,

所以迁移后只要保证工作空间内的数据源名称和数据集名称不变,地图就可以不用修改仍然可以读到数据。
你好,请问有联系方式吗? 感觉有一些业务需求可以联系咨询一下你,方便提供一下吗

你好,我按照你的思路,将数据集复制过去,但是复制的结果为空的,我使用iDesktop也操作不了

可以帮忙看一下吗

用copydataset你要对应数据集给对应数据集原本的编码,不是统一int32
...