输出图形为`.xml`

时间:2014-09-12 20:50:48

标签: python xml networkx

我有一个shapefile,我正在转换为.xml文件,以便在MATSim中使用。文件结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE network SYSTEM "http://www.matsim.org/files/dtd/network_v1.dtd">
<network name="VISUM export national network 2007-11-28">

<!-- ====================================================================== -->
    <nodes>
        <node id="1000" x="730065.3125" y="220415.9531" type="2" origid="1000" />
        <node id="1001" x="731010.5" y="220146.2969" type="2" origid="1001" />
        .....
    </nodes>
<!-- ====================================================================== -->
    <links capperiod="01:00:00" effectivecellsize="7.5" effectivelanewidth="3.75">
        <link id="100365" from="226" to="227" length="921.0" freespeed="33.3333333333333" capacity="5600.0" permlanes="2.0" oneway="1" modes="car" origid="183" type="10" />
    ...
    </links>
<!-- ====================================================================== -->
</network>

我使用NetworkX Python库执行此操作,该库可以将shapefile作为图形读取,并将图形导出为GEXF对象。这段代码(基本上)输出的内容接近但不够接近网络规范。

import networkx as nx

G = nx.read_shp("expcuts1.shp")
start = 0
G = nx.convert_node_labels_to_integers(G, first_label=start, 
        label_attribute = "coord")

# Build a new object with the elements that you need
H = nx.DiGraph(name = "Python NetworkX export from FAF 3.4")
H.add_edges_from(G.edges())

# store coordinates in node attributes
for i in range(len(H)):
    H.node[i]['x'] = G.node[i]['coord'][0]
    H.node[i]['y'] = G.node[i]['coord'][1]

# export as xml (really, gexl, but that's pretty close)
nx.write_gexf(H, 'test.xml') 
<gexf version="1.1" xmlns="http://www.gexf.net/1.1draft" xmlns:viz="http://www.gexf.net/1.1draft/viz" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance">
  <graph defaultedgetype="undirected" mode="static">
    <attributes class="node" mode="static">
      <attribute id="0" title="y" type="double" />
      <attribute id="1" title="x" type="double" />
    </attributes>
    <nodes>
      <node id="0" label="0">
        <attvalues>
          <attvalue for="0" value="1389860.27495" />
          <attvalue for="1" value="2237913.99085" />
        </attvalues>
      </node>

除此之外,GEXL使用节点和边缘,但MATSim词汇表要求节点和链接。我试图决定是否更容易从NetworkX调整write_gexf函数或手动写出XML,例如使用ElementTree API。有什么提示吗?

1 个答案:

答案 0 :(得分:0)

简短:如果这是一次性项目,请从NetworkX调整write_gexf功能。

长:

对于MATSim,您需要有向图。 Gexf允许defaultedgetype="directed"。您可以向边缘添加更多属性,例如能力,车道...

<edge weight="1.0" target="109001663" source="109001672" label="network link" id="99999">
 <attvalues>
  <attvalue start="0.0" value="0" for="capacity"/>
  <attvalue start="0.0" value="0" for="length"/>
 </attvalues>
</edge>

由于您已经拥有gexf,因此最后一步是一对一转换。 Gexf节点直接转换为MATSim节点,而边缘是MATSim术语中的链接。但是,您需要为MATSim提供网络属性。

节点只需要x,y坐标

对于链接,您可能需要添加链接的实际长度(而不是欧几里德距离)。此外,您需要最大允许速度(自由速度),容量(通常以每小时PCU给出)和车道数量。

请注意,容量取决于capperiod,即capperiod="01:00:00"表示有效一小时。

P.S。您还可以查看the gexf package,其中您将找到一些gexf辅助类,主要用于将MATSim网络转换为gexf,例如:用于在Gephi中进行分析。