2017-12-05 20 views
0

JGraphT에서 GraphMLImporter를 사용하는 데 문제가 있습니다.JgraphT geojson 속성에서 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에 대해 올바르게 건너)하지만 키 2 (우리 기하 개체)에 대한 문자열은 다음과 같이 다시 온다 :

결과
,[0.0,0.0]]]}" 

, 나는 형상을 역 직렬화 할 수 없습니다.

제 질문은 왜 이런 일입니까? 이것은 graphml 형식의 제한 사항입니까? 어떤 이유로 geojson 문자열을 포함 할 수 없습니까? XML을 올바르게 작성하는 법을 모르십니까?

도움을 주시면 감사하겠습니다.

사람들은 Jgrapht가 GraphML 가져 오기 도구와 내보내기 도구를 사용하기 위해 제공하는 데모를 통해 알았지 만 실제로 이것에 대한 정보는 없습니다. 이것은 매우 단순한 물체만을 다루기 때문에 복잡하지는 않습니다.

답변

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

희망이 문제가 다른 사람 도움이