首页 / 浏览问题 / 桌面GIS / 问题详情
自动化处理开发多个输出的问题
4EXP 2022年12月24日
我在进行自动化二次开发时,有这样一个需求,需要输出多个Output:
读取数据集中的点记录,输出一条记录的x,y坐标,如果OutputSourceType为RETURN时,函数只有一个Return怎么写返回两个值?
开发中试过使用OutputSourceType.FIELD,但插件未有任务输出项,是哪里设置不正确吗?
@OutputDef(name = "pointX", caption = "pointX", description = "点X坐标")
@OutputDef(name = "pointY", caption = "pointY", description = "点Y坐标")

1个回答

您好,根据您的描述,建议您可以仔细阅读一下 iDesktopX 帮助文档关于“方法返回值解析”的说明,上面有详细描述如何以注释的方式返回多个值。

希望可以帮到您。

2,253EXP 2022年12月26日

非常感谢回答,您说的方法我已经试过了,我用的iobject版本是10i for java的,OutputDef 中没有 dataType这个设置,我用10i开发测试时,

代码如下:

@ProcessDef(name = "GetFirstPointProcess",caption = "获取第一条数据点坐标",description = "获取第一条数据点坐标")
public class GetFirstPointProcess extends BaseExtendClass {
    @ProcessDef(name = "Point")
    @OutputDefs(
            value = {
    @OutputDef(name = "pointX", caption = "pointX", description = "点X坐标"),
    @OutputDef(name = "pointY", caption = "pointY", description = "点Y坐标")})
    public static Map<String,Object> execute(
            @InputDef(name = "dataset", caption = "数据集", description = "数据集", isRequired = true) Dataset dataset
    ) {
        Map<String,Object> res = new HashMap<>();
        if (dataset != null) {
            try {
                DatasetVector dv = (DatasetVector) dataset;
                if (dv != null) {
                    Recordset rs = dv.getRecordset(false, CursorType.STATIC);
                    if (rs != null && !rs.isEOF()) {
                        GeoPoint point = (GeoPoint) rs.getGeometry();
                        res.put("pointX",point.getX());
                        res.put("pointY",point.getY());
                    }
                    rs.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return res;
    }}

结果如下:

工具 获取第一条数据点坐标 执行结果如下:
--outputs
----output
------name:pointX
------value:{"pointX":123,"pointY":456}
----output
------name:pointY
------value:{"pointX":123,"pointY":456}
java.lang.Double cannot be cast to java.util.ArrayList
java.lang.ClassCastException: java.lang.Double cannot be cast to java.util.ArrayList
    at com.supermap.iobjects.processes.convertor.HashMapTransParameterStringConvertor.internalValueTo(HashMapTransParameterStringConvertor.java:15)
    at com.supermap.iobjects.processes.convertor.HashMapTransParameterStringConvertor.internalValueTo(HashMapTransParameterStringConvertor.java:9)
    at com.supermap.iobjects.common.convertor.TargetStringConvertor.valueTo(TargetStringConvertor.java:53)
    at com.supermap.iobjects.common.convertor.TargetStringConvertor.valueTo(TargetStringConvertor.java:12)
    at com.supermap.iobjects.common.convertor.ConvertorUtils.tryConvertSingleValue(ConvertorUtils.java:89)
    at com.supermap.iobjects.common.convertor.ConvertorUtils.tryConvert(ConvertorUtils.java:36)
    at com.supermap.sps.core.executor.DefaultWorkflowExecutor.valueToStringOrArray(DefaultWorkflowExecutor.java:264)
    at com.supermap.sps.core.executor.DefaultWorkflowExecutor.createProcessResultContent(DefaultWorkflowExecutor.java:248)
    at com.supermap.sps.core.executor.DefaultWorkflowExecutor.lambda$finishProcessHistory$0(DefaultWorkflowExecutor.java:209)
    at com.supermap.sps.core.history.LazyWorkflowHistoryOperation.addProcessContent(LazyWorkflowHistoryOperation.java:111)
    at com.supermap.sps.core.executor.DefaultWorkflowExecutor.finishProcessHistory(DefaultWorkflowExecutor.java:208)
    at com.supermap.sps.core.executor.DefaultWorkflowExecutor.finishTask(DefaultWorkflowExecutor.java:194)
    at com.supermap.sps.core.executor.DefaultWorkflowExecutor.executeInternal(DefaultWorkflowExecutor.java:87)
    at com.supermap.sps.core.executor.AbstractWorkflowExecutor.execute(AbstractWorkflowExecutor.java:196)
    at com.supermap.desktop.process.gpspark.adapter.ExecutorProxy.execute(SourceFile:53)
    at com.supermap.desktop.process.tasks.TaskManager$1.doInBackground(SourceFile:258)
    at com.supermap.desktop.process.tasks.TaskManager$1.doInBackground(SourceFile:253)
    at javax.swing.SwingWorker$1.call(SwingWorker.java:295)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at javax.swing.SwingWorker.run(SwingWorker.java:334)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

2022-12-26 09:26:50,模型 未命名模型 执行失败。
总耗时:

您好,Map 的类型是在 iDesktopX 11i 才开始支持的,您使用的是 10i 的版本,建议改成数组的形式。

smiley感谢回复,10i里面我也使用数组形式试了下,不会出错,但是结果不对,每个输出都是return的数组,并没有按照outputSource去取对应的数组值,而且我看帮助文档上说明的outputSource是要在outputSourceType = OutputSourceType.PARAMETER的时候配合使用的。我的测试代码各结果如下 :

public class GetFirstPointProcess extends BaseExtendClass {
    @OutputDef(name = "pointX", caption = "pointX", description = "点X坐标",outputSource = 0)
    @OutputDef(name = "pointY", caption = "pointY", description = "点Y坐标",outputSource = 1)
    public Double[] execute(
            @InputDef(name = "dataset", caption = "数据集", description = "数据集", isRequired = true) Dataset dataset
    ) {
        List<Double> res = new ArrayList<>();
        if (dataset != null) {
            try {
                DatasetVector dv = (DatasetVector) dataset;
                if (dv != null) {
                    Recordset rs = dv.getRecordset(false, CursorType.STATIC);
                    if (rs != null && !rs.isEOF()) {
                        GeoPoint point = (GeoPoint) rs.getGeometry();
                        res.add(point.getX());
                        res.add(point.getY());
                    }
                    rs.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return res.toArray(new Double[res.size()]);
    }}

测试结果:

工具 获取第一条数据点坐标 执行结果如下:
--outputs
----output
------name:pointX
------value:{[511883],[3987337]}
----output
------name:pointY
------value:{[511883],[3987337]}
工具"获取第一条数据点坐标"执行状态:已完成
2022-12-26 15:40:40,模型 未命名模型 执行成功。
总耗时:0.1秒
 

您好,输出结果不正确是因为您的代码使用方式不正确的问题,建议您参考以下逻辑:

@ProcessDef(name = "GetFirstPoint", caption = "获取第一条数据点坐标", description = "获取第一条数据点坐标")
@OutputDef(name = "pointX", caption = "pointX", description = "点X坐标", dataType = double.class, outputSource = 0)
@OutputDef(name = "pointY", caption = "pointY", description = "点Y坐标", dataType = double.class, outputSource = 1)
public static double[] execute(
        @InputDef(name = "dataset", caption = "数据集", description = "数据集", isRequired = true) Dataset dataset
) {
    double[] res = new double[2];
    if (dataset != null) {
        try {
            DatasetVector dv = (DatasetVector) dataset;
            if (dv != null) {
                Recordset rs = dv.getRecordset(false, CursorType.STATIC);
                if (rs != null && !rs.isEOF()) {
                    GeoPoint point = (GeoPoint) rs.getGeometry();
                    res[0] = point.getX();
                    res[1] = point.getY();
                }
                rs.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return res;
}

你好,我已经对照你的代码修改了,但结果还是一样,只有一点我这里的没有dataType = double.class的设置,其他都一样,我的iobject版本是:

结果:

2022-12-26 16:31:57
耗时:0.022秒
工具 获取第一条数据点坐标 执行结果如下:
--outputs
----output
------name:pointX
------value:{[511883],[3987337]}
----output
------name:pointY
------value:{[511883],[3987337]}
工具"获取第一条数据点坐标"执行状态:已完成
2022-12-26 16:31:57,模型 未命名模型 执行成功。
总耗时:0.1秒

cool不知道是不是版本的问题

您好,是版本的问题,建议您使用iDesktopX 10.2.1版本

非常感谢,的确是版本的问题,我换成上面的版本用Map可以,但是数组还是不行,总算解决了,谢谢
...