/importGraphML.m

https://github.com/giangnvbk1989/poco · MATLAB · 132 lines · 88 code · 18 blank · 26 comment · 12 complexity · 75341bed93e5eb15c9446326ea1a0ac0 MD5 · raw file

  1. % IMPORTGRAPHML Utility function to import topologies given in GraphML format.
  2. % (has been exemplarily tested for the GraphML format used in the
  3. % Internet Topology Zoo.
  4. %
  5. % [X,Y,Z] = IMPORTGRAPHML(A) imports a GraphML file A and returns a
  6. % topology matrix X, the geographical latitudes and longitudes of the
  7. % nodes as matrix Y and the name of the nodes as cell array Z.
  8. %
  9. % For example use cases, see also PLOTEXAMPLE.
  10. % Copyright 2012-2013 David Hock, Stefan Geißler, Fabian Helmschrott,
  11. % Steffen Gebert
  12. % Chair of Communication Networks, Uni Würzburg
  13. %
  14. function [topology,latlong,nodenames]=importGraphML(filename)
  15. % Check Matlab-version
  16. matlabVersion=str2num(regexprep(version('-release'),'[^0-9]','')) ;
  17. % Read XML File into xDoc
  18. xDoc = xmlread(filename);
  19. % Read keys
  20. xKeys=xDoc.getElementsByTagName('key');
  21. keys=struct;
  22. for i=0:xKeys.getLength-1
  23. name=xKeys.item(i).getAttribute('attr.name');
  24. id=xKeys.item(i).getAttribute('id');
  25. keys.(char(id))=char(name);
  26. end
  27. % Read nodes
  28. xNodes=xDoc.getElementsByTagName('node');
  29. nodes=struct;
  30. latlongs=struct;
  31. latlong=zeros(length(nodes),2);
  32. for i=0:xNodes.getLength-1
  33. xNode=xNodes.item(i);
  34. xData=xNode.getElementsByTagName('data');
  35. for j=0:xData.getLength-1;
  36. xKey=xData.item(j).getAttribute('key');
  37. nodes(i+1).(char(keys.(char(xKey))))=char(xData.item(j).getTextContent);
  38. end
  39. nodes(i+1).id=str2double(xNode.getAttribute('id'));
  40. latlongs.(['id' num2str(nodes(i+1).id)])=[str2double(nodes(i+1).Latitude) str2double(nodes(i+1).Longitude)];
  41. latlong(i+1,:)=[str2double(nodes(i+1).Longitude) str2double(nodes(i+1).Latitude)];
  42. end
  43. % Read edges
  44. xEdges=xDoc.getElementsByTagName('edge');
  45. edges=struct;
  46. for i=0:xEdges.getLength-1
  47. xEdge=xEdges.item(i);
  48. edges(i+1).source=str2double(xEdge.getAttribute('source'));
  49. edges(i+1).target=str2double(xEdge.getAttribute('target'));
  50. xData=xEdge.getElementsByTagName('data');
  51. for j=0:xData.getLength-1;
  52. xKey=xData.item(j).getAttribute('key');
  53. edges(i+1).(char(keys.(char(xKey))))=char(xData.item(j).getTextContent);
  54. end
  55. end
  56. % Create topology matrix
  57. topology=1-eye(length(nodes));
  58. topology(topology==1)=Inf;
  59. for i=1:length(edges);
  60. % Find edge endpoint indices
  61. for j=1:length(nodes)
  62. if nodes(j).id==edges(i).source
  63. rowIndex=j;
  64. end
  65. if nodes(j).id==edges(i).target
  66. colIndex=j;
  67. end
  68. end
  69. edges(i).latlongdistance=distFrom(latlongs.(['id' num2str(edges(i).source)]),latlongs.(['id' num2str(edges(i).target)]));
  70. topology(rowIndex,colIndex)=edges(i).latlongdistance;
  71. topology(colIndex,rowIndex)=edges(i).latlongdistance;
  72. end
  73. % Fix for several nodes on identical location
  74. for j=1:size(topology,1)
  75. topology(j,latlong(:,1)==latlong(j,1) & latlong(:,2)==latlong(j,2))=eps;
  76. topology(latlong(:,1)==latlong(j,1) & latlong(:,2)==latlong(j,2),j)=eps;
  77. end
  78. nodenames=cell(1,size(topology,1));
  79. for i=1:length(nodes)
  80. nodenames{i}=nodes(i).label;
  81. end
  82. %% filter nodes that have no connections at all
  83. topology(isnan(topology))=Inf;
  84. badIdx=find(sum(topology~=Inf,2)==1);
  85. if matlabVersion < 2013
  86. goodIdx=setdiff(1:length(topology),badIdx);
  87. else
  88. goodIdx=setdiff(1:length(topology),badIdx,'legacy');
  89. end
  90. topology=topology(goodIdx,goodIdx);
  91. latlong=latlong(goodIdx,:);
  92. nodenames=nodenames{goodIdx};
  93. % distFrom Implementation of Haversine formula.
  94. % The Haversine formula was adopted from
  95. % http://stackoverflow.com/questions/837872/calculate-distance-in-meters-when-you-know-longitude-and-latitude-in-java
  96. % */
  97. function dist = distFrom(node1,node2)
  98. lat1 = node1(1);
  99. lng1 = node1(2);
  100. lat2 = node2(1);
  101. lng2 = node2(2);
  102. earthRadius = 3958.75;
  103. dLat = toRadians(lat2 - lat1);
  104. dLng = toRadians(lng2 - lng1);
  105. a = sin(dLat / 2) * sin(dLat / 2) + cos(toRadians(lat1)) * cos(toRadians(lat2)) * sin(dLng / 2) * sin(dLng / 2);
  106. c = 2 * atan2(sqrt(a), sqrt(1 - a));
  107. dist = earthRadius * c;
  108. meterConversion = 1/0.000621371192;
  109. dist=dist * meterConversion;
  110. function r=toRadians(d)
  111. r=d/180*pi;
  112. end
  113. end
  114. end