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

时间:2018-05-28 23:01:34

标签: jung

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

it_name

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

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

问题在于,虽然大多数顶点都是成功保存的,但是一些顶点的默认值保存为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(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值,因为它将用于将来的实现。 谁知道我在哪里错过了位置信息? 感谢。

1 个答案:

答案 0 :(得分:0)

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

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

假设这实际上是你需要做的,你根本不需要序列化它;您可以使用任何其他AbstractLayout实例的位置初始化任何Layout子类,因为LayoutFunction<V, Point2D>(其中包括AbstractLayout,这意味着您可以将其传递给CircleLayout<V, E> circleLayout = ... ... StaticLayout<V, E> staticLayout = new StaticLayout(graph, circleLayout); 实例作为&#34;初始化程序&#34;。因此,例如:

firstName