JUNG - 获取顶点位置并使用 Graphml 保存

JUNG - Get position of vertex and save using Graphml

我正在尝试将布局从 CircleLayout 更改为 StaticLayout,同时保持 Vertex 的位置,为此我使用以下代码:

    StaticLayout<VertexType, EdgeType> sLayout = new StaticLayout<VertexType, EdgeType>(graph,
                new Transformer<VertexType, Point2D>() {
                    public Point2D transform(VertexType vertex) {
                        vertex.setX(layout.getX(vertex));
                        vertex.setY(layout.getY(vertex));
                        System.out.println(vertex.toString());
                        System.out.println(vertex.getX());
                        System.out.println(vertex.getY());
                        Point2D p = new Point2D.Double(vertex.getX(), vertex.getY());
                        return p;
                    }
                }, dimension);
        currentVV.setGraphLayout(sLayout);

其中 currentVV 是一个 VisualizationViewer,layout 是一个 CircleLayout。 setX(double) 和 setY(double) 是来自我的自定义顶点的方法,默认情况下顶点初始化为 x = 0.0 和 y = 0.0。 在这个阶段,我使用 teh println 检查所有顶点是否正确获得它们的位置并且它正在工作。 下一步是使用 GraphmlWritter 保存图表:

    GraphMLWriter<VertexType, EdgeType> graphWriter = new GraphMLWriter<VertexType, EdgeType>();
        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
        graphWriter.addEdgeData("label", null, "0", new Transformer<EdgeType, String>() {
            @Override
            public String transform(EdgeType v) {
                return v.toString();
            }
        });
        graphWriter.addVertexData("x", null, "0", new Transformer<VertexType, String>() {
            public String transform(VertexType v) {
                return Double.toString(v.getX());
            }
        });
        graphWriter.addVertexData("y", null, "0", new Transformer<VertexType, String>() {
            public String transform(VertexType v) {
                return Double.toString(v.getY());
            }
        });
        graphWriter.save(graph, out);

问题是虽然大多数顶点都被成功保存,但一些顶点被保存为默认值 X 和 Y (0.0),我不知道为什么。如果我尝试直接从 CircleLayout 中保存图形,则从布局中获取 X 和 Y 值:

    GraphMLWriter<VertexType, EdgeType> graphWriter = new GraphMLWriter<VertexType, EdgeType>();
        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
        graphWriter.addEdgeData("label", null, "0", new Transformer<EdgeType, String>() {
            @Override
            public String transform(EdgeType v) {
                return v.toString();
            }
        });
        graphWriter.addVertexData("x", null, "0", new Transformer<VertexType, String>() {
            public String transform(VertexType v) {
                return Double.toString(layout.getX(v));
            }
        });
        graphWriter.addVertexData("y", null, "0", new Transformer<VertexType, String>() {
            public String transform(VertexType v) {
                return Double.toString(layout.getY(v));
            }
        });

虽然此解决方案有帮助,但我更愿意将 X 和 Y 值保存在顶点上,因为它将用于将来的实现。 任何人都知道我在哪里缺少位置信息? 谢谢

我不能立即确定您的代码中的错误在哪里。

第一个问题:您为什么要尝试将 CircleLayout 转换为 StaticLayout?这给你带来了什么?

假设这确实是你需要做的,你根本不需要序列化它;你可以用任何其他 Layout 实例的位置初始化任何 AbstractLayout 子类,因为 Layout 是(除其他外 Function<V, Point2D>,这意味着你可以将它传递给AbstractLayout 实例作为 "initializer"。因此,例如:

CircleLayout<V, E> circleLayout = ...
...
StaticLayout<V, E> staticLayout = new StaticLayout(graph, circleLayout);