JgraphT GraphML 导入器在 geojson 属性上失败

JgraphT GraphML importer failing on geojson properties

我在 JGraphT 中使用 GraphMLImporter 时遇到问题,我完全被难住了。

作为序列化过程的一部分,我们将图表导出为 graphml 格式。那很好用;我们可以获取导出的文件并在 gephi 或任何其他图形解析程序中查看它而不会出现问题。当我们尝试将文件导入(反序列化)到图形中时会发生此问题。

当我们导出时,对象上的字段之一是几何体。我们需要这个,所以我们将它导出为每个顶点的 属性(每个顶点代表一个小区域,几何图形是关联的区域)。当我们读回它时,由于某种原因,我们只得到最后一个坐标和一些括号,而不是给我完整的字符串作为属性。这当然不是有效的几何图形,它令人窒息。

作为参考,这是我们将图形写入 graphml 时从导出器获得的内容:

<?xml version="1.0" encoding="UTF-8"?><graphml xmlns="http://graphml.graphdrawing.org/xmlns" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<key id="key0" for="node" attr.name="lat" attr.type="double"/>
<key id="key1" for="node" attr.name="lng" attr.type="double"/>
<key id="key2" for="node" attr.name="geometry" attr.type="string"/>
<key id="key3" for="edge" attr.name="travel_time" attr.type="double"/>
<graph edgedefault="directed">
<node id="1">
<data key="key0">0.5</data>
<data key="key1">0.5</data>
<data key="key2">"{"type":"Polygon","coordinates":[[[0.0,0.0],[0.0,1.0],[1.0,1.0],[1.0,0.0],[0.0,0.0]]]}"</data>
</node>
<node id="2">
<data key="key0">0.5</data>
<data key="key1">1.5</data>
<data key="key2">"{"type":"Polygon","coordinates":[[[0.0,1.0],[0.0,2.0],[1.0,2.0],[1.0,1.0],[0.0,1.0]]]}"</data>
</node>
<edge id="1" source="1" target="2">
<data key="key3">1.0</data>
</edge>
<edge id="2" source="2" target="1">
<data key="key3">1.0</data>
</edge>
</graph>
</graphml>

当我反序列化图形时,key0 和 key1(它们是经纬度)的属性正确显示,但 key2(我们的几何对象)的字符串返回如下:

,[0.0,0.0]]]}"

因此,我无法反序列化几何图形。

所以我的问题是,到底为什么会这样?这是 graphml 格式的限制吗,也许由于某种原因它不能包含 geojson 字符串?我不知道如何 XML 正确吗?

如有任何帮助,我们将不胜感激。

为了让人们知道,虽然我已经完成了 Jgrapht 提供的使用 GraphML 导入器和导出器的演示,但实际上并没有任何关于此的信息。它只处理非常简单的对象,而不是这么复杂的东西。

我发布这篇文章是为了防止其他人遇到同样的问题。该问题似乎是 JGraphT GraphMLImporter 中的错误。具体来说,这个方法:

    @Override
    public void characters(char ch[], int start, int length)
        throws SAXException
    {
        if (insideDefault) {
            currentKey.defaultValue = new String(ch, start, length);
        } else if (insideData) {
            currentData.value = new String(ch, start, length);
        }
    }

问题在于,为了确定 currentData.value,解析器使用逗号 (,) 和方括号(在我的示例中为 [])的组合来确定值何时成功 "read".然而,当字符串元素是一个 geojson 对象时,括号和逗号的数量会导致事情变得混乱,并将值分成块。它在最后一个块处终止,这就是为什么我得到的是字符串的一部分而不是整个字符串。

我们将提交给 JGraphT 的解决方案是将内容附加到 currentData.value,而不是每次都创建一个新内容。我们的解决方案使方法看起来像这样:

    @Override
    public void characters(char ch[], int start, int length)
        throws SAXException {
        if (insideDefault) {
            currentKey.defaultValue = new String(ch, start, length);
        } else if (insideData) {
            currentData.valueBuilder.append(ch, start, length);
        }
    }

希望对遇到此问题的其他人有所帮助