我在使用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(那些是lat longs)的属性正确,但key2(我们的几何对象)的字符串返回如下:
,[0.0,0.0]]]}"
因此,我无法反序列化几何体。
所以我的问题是,为什么会发生这种情况?这是graphml格式的限制,也许它出于某种原因不能包含geojson字符串?我不知道如何正确地使用XML吗?
任何帮助都将不胜感激。
但是,人们都知道,我已经完成了Jgrapht提供的使用GraphML导入器和导出器的演示,但它实际上并没有任何关于此的信息。它只处理非常简单的对象,而不是复杂的东西。
答案 0 :(得分:0)
如果其他人遇到同样的问题,我会发布这个帖子。问题似乎是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,解析器使用逗号(,)和括号(在我的情况下为[])的组合来确定何时成功“读取”了一个值。但是,当string元素是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);
}
}
希望能帮助其他有此问题的人