【问题标题】:JgraphT GraphML importer failing on geojson propertiesJgraphT GraphML 导入器在 geojson 属性上失败
【发布时间】:2017-12-05 21:53:57
【问题描述】:

我在使用 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 导入器和导出器的演示,但它并没有关于此的任何信息。它只处理非常简单的对象,而不是这么复杂的东西。

【问题讨论】:

    标签: java graph geojson jgrapht graphml


    【解决方案1】:

    我发布这个以防其他人遇到同样的问题。该问题似乎是 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,解析器使用逗号 (,) 和括号(在我的例子中为 [])的组合来确定值何时已成功“读取”。但是,当字符串元素是 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);
            }
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多