如何在使用networkx从shapefile创建图时保留或至少排序边属性?

2 投票
1 回答
920 浏览
提问于 2025-04-18 04:31

我用networkx从一个shapefile创建了一个图,代码是:

import networkx as nx
layer = nx.read_shp(path)
G=layer.to_undirected()

在调整了边的属性后,我需要把结果保存到一个shapefile里,所以我用了:

nx.write_shp(G,out_path)

问题是,这个新的shapefile里的属性顺序会完全乱七八糟;这可以理解,因为属性是存储在一个字典里的。我用OrderedDict也没能解决这个问题:

# Does NOT work
for edge in G.edges(data=True):
    edge = list(edge)
    edge[2] = OrderedDict(sorted(edge[2].items()))
    edge=tuple(edge)

有没有办法对每条边的属性进行排序或者改变顺序呢?

1 个回答

1

这个:

for edge in G.edges(data=True):
    edge = list(edge)
    edge[2] = OrderedDict(sorted(edge[2].items()))
    edge=tuple(edge)

对输出(或者说指向G的对象内容)没有任何影响,因为通过以下操作:

edge = tuple(edge)

你只是修改了局部变量edge;这并不会影响G.edges(data=True)返回的值,更不会改变G的内部状态。这一点适用于任何(Python)程序,和networkx或你的程序没有直接关系。

所以,除非你自己写一个算法来将数据序列化并保存到文件,或者你能告诉networkx应该如何序列化数据,否则是无法改变文件内容的……当然,前提是我没有遗漏什么,但根据http://networkx.lanl.gov/reference/readwrite.nx_shp.htmlwrite_shp并不能以你需要的方式进行配置。

撰写回答