图对物理空间的映射实现:从逻辑到代码实现(1)
·
毕业后,留存的屎山代码太过庞大,师弟师妹难以利用,现希望通过本文章将构建图结构的基本逻辑和方法讲清楚,希望能为大家提供一定的帮助。
关于图的基本原理和组成我就不过多赘述了,既然来看这篇文章,肯定是有初步了解的,我们直接进入代码工作。
图是一种方法,除了深度学习的领域应用之外,我相信利用图可以解决许多物理问题和逻辑问题。
需求
通过节点和边,利用图来表达一个管网在空间中的分布情况。
需求分析
1.“通过节点和边”
则我们的数据集构建应该是节点数据集或者边数据集,节点数据集需要利用“索引ID”来确认其邻接节点,边数据集合只需要对相同节点进行合并即可(因为如果没有合并或者说识别相同节点的话,构建出来的图将会成为n个分量,n是边的数量,如图所示)
2.表达在空间中的分布情况
这就要求需要节点再空间中的分布数据,即三维坐标。
确定字段
用于区分边的FID、用于确定边起点坐标的Start_X、Start_Y、Start_Z,用于确定边终点坐标的End_X、End_Y、End_Z。其实FID也可以不要,看自己的需求,因为边的形式可以表示为((Start_X,Start_Y,Start_Z),(End_X,End_Y,End_Z))数据集截图如下:

编写程序,构成图结构
#导入需要用的库
import pandas as pd
import networkx as nx
def drawgraphs(filenames):
'''
从多个CSV文件创建一个合并的NetworkX图对象。
参数:filenames (list): 包含图数据的CSV文件路径列表
'''
G = nx.Graph()
for filename in filenames:
# 这一步是因为有时候文件解码会报错,添加几种解码方式
try:
df = pd.read_csv(filename, encoding='gbk')
except UnicodeDecodeError:
print(f"Error reading file {filename} with GBK encoding. Trying UTF-8 instead.")
df = pd.read_csv(filename, encoding='utf-8')
for index, row in df.iterrows():
start_node = (row['Start_X'], row['Start_Y'], row['Start_Z'])
end_node = (row['End_X'], row['End_Y'], row['End_Z'])
#这里就是第一张图里面说的将重复的节点识别合并
if start_node != end_node:
# 这里是计算了每个边的空间长度
l = np.linalg.norm(np.array(start_node) - np.array(end_node))
# 这里就是依次循环将每一条边加入图中,并附上了一个属性即weight(距离权重)
G.add_edge(start_node, end_node, weight=l)
# 输出每一条边的情况(可以不输出,只是有助于理解代码)
print(f"Added edge from {start_node} to {end_node} with length {l}")
# 输出最终组成的图中边的条数(随意,可以不输出)
print(f"Total edges so far: {G.number_of_edges()}")
# 输出最终组成的图是否联通
print(f"是否连通: {nx.is_connected(G)}")
return G
输出结果:表明图已经建立,且是联通的
编写程序,可视化形态图
可视化这部分我先不写,三维可视化的效果如下图所示,希望你可以用matplotlib先绘制一个二维平面的出来,后面我将补充二维和三维可视化的代码(三维和二维的可视化数据稍微有些区别,是因为二维是最新数据构成的)。
更多推荐


所有评论(0)