本文主要讲述了如何使用QGIS加载管网水力模型,并进行节点筛选,再制图显示的过程。
我所接触的供水管网水力模型文件格式为inp,使用EPANET软件打开,然而它的制图形式不太美观,因此我查找了一些资料,也摸索了一段时间,考虑到教程较少,于是记录下供水管网inp文件如何制图的方法。
核心是:inp文件+QGIS+插件+节点筛选+制图
一、QGIS的安装与配置
考虑到QGIS小巧的体积与丰富的插件,我们选择使用QGIS来制图。
安装说明参考网上教程,需要注意的是要选择在桌面生成图标,不然就得在安装目录下找命令行了。
另推荐非常好用的快速搜索软件Listary,双击Ctrl即可快速搜索,不需要点图片启动软件,最好设置为开机启动,更方便。
需要使用的插件名称为:ImportEpanetInpFiles
搜索时直接搜epa即可,QEPANET也可以打开inp文件并进行模拟,功能丰富很多,但我的inp文件超过了6万个节点和管道,加载了好长一段时间才能显示,并且仍然会有bug存在,考虑到我仅使用QGIS制图,并不需要很多功能,因此使用ImportEpanetInpFiles
二、管网的加载与显示
点击 插件 -> ImportEpanetInpFiles - > Import Epanet Input File ;选择相应的inp文件即可,较大文件需要载入较长时间,需等待。
加载成功后会在inp文件目录生成_shapefiles_
文件夹:
里面对应生产的节点、管线等文件。
此时QGIS直接显示图和左下角图层,如未保存QGIS文件,下次直接在QGIS的 浏览打开这个文件夹,点击相应的shp文件即可加载图层,如图所示:
我们制图只需要加载junctions、pipes、pumps等即可。
建议加载完后还是保存为QGIS文件,下次使用还可以直接打开。
图层示意:
点、线的显示效果直接选择图层,右击,选择属性,选择第三个符号化即可更改图层的显示效果。
三、点的筛选
由于我做的工作是,在所有节点中选择部分节点突出显示,因此需要筛选出特定的节点集来显示。
这里的步骤很重要!
我的思路是,将图层输出为csv文件,此时有一个属性为ID,使用Python的pandas库即可根据该属性选择特定ID的点。
但是我的点、线属性表里并没有坐标信息,不知道是这个插件的问题还是其他原因,当我输出csv文件中没有坐标信息时,再加载就不会显示。
怎样将输出的csv文件中携带点的坐标信息?
导出步骤:选择图层,右击,导出,选择另存要素为;
弹出的界面如下:
这里注意第三个范围,在中间的Calculate from Layer选择当前图层即可如范围那里显示的那样。
这里我并没有测试后三个步骤少哪一个会对生成的csv产生具体影响,只是确认经过测试,文件中确实包含了点的坐标属性,如下图:
由于这里我在上述选择输出是,只选择了ID,Demand2(其实没用),所以只输出的这两个属性,输出是可选择只保存ID。
这样我们就可以使用Python来根据ID保留特定的行了。
代码如下:
def get_node(p, l):
"""
简单的从csv的某一列中选取特定的值,重新整合成新的csv
:param p: pd对象
:param l: 选取的节点list
:return: new csv
"""
l2 = []
for i in l:
n = p.loc[p["ID"] == i] # 选取的方式
l2.append(n)
result = pd.concat(l2, axis=0) # 0为横向整合
result = pd.DataFrame(result)
result = result[["X", "Y", "ID"]] # 只要特定的列
print(result)
result.to_csv("F:\\AWorkSpace\\QGISData\\node_select.csv", index=False)
if __name__ == "__main__":
node_select = [154 , 1152 , 1535, 1841 , 2388, 2642 , 3272 ,3883 , 4492 , 4759 , 5904, 6132,6341 , 6368, 6558 ,7254 , 7723, 7932 , 8098 , 8937, 9034 ,11287, 11328 ,11782,12302 ,13327, 13648, 15415, 15789 ,16880, 17827 ,18064, 18338 ,18691, 20016, 20295, 20462 ,20474, 21853, 21896 ,26064 ,26571 ,26771 ,26848, 28649, 28778 ,28861, 29549, 30281, 30284 ,30339 ,32603, 34152, 34660 ,35693 ,36537 ,36568, 37515 ,38147, 38397, 38522, 38752 ,39835, 41099, 41702 ,42144 ,43894, 44791, 44873 ,45763, 46000 ,46091, 46277, 48594 ,48994, 49583, 50633 ,51139 ,51565 ,51645, 52374 ,53767, 54322 ,56166, 56501, 57093 ,57629 ,59420 ,59600, 59704, 60962 ,61383, 61629, 62127 ,63016, 63020, 63133 ,63402, 64833, 65191]
node_select_str = []
# 只是为了将int改成str
for i in node_select:
node_select_str.append(str(i))
p = pd.read_csv("F:\\AWorkSpace\\QGISData\\node.csv")
get_node(p, node_select_str)
代码本身很简单,就是通过ID这一列的数来选取特定的行,注意点如下:
n = p.loc[p["ID"] == i] # 选取的方式
,这是pandas选取的方式,i为ID具体的值- 选出来后这个n为一个Data Frame对象,我们使用list存储,并使用
pd.concat(l2, axis=0) # 0为横向整合
来整合,最后选取特定的列再存为csv即可 - 我的节点集为int类型,但csv文件为str类型,先转换,再调函数
四、显示与制图
将输出的经过筛选的csv节点集加载到QGIS的方式如下:
图层 -> 添加图层 -> Add Delimited Text Layer
有的版本这个英文可能是中文,为分格文本文件。界面如下,注意设置X, Y即可:
加载后的图层与显示管线图如下:
当你设定好点、线的样式之后,就可以制图了。
选择 项目 -> 新建打印布局;输入布局名称,进入如下界面:
点击左边竖排的添加地图,点击确定:
即可显示地图并进行拉伸:
布局器的右边是图层和编辑器,可以设置图层的相关信息:
剩余的添加文本、添加指北针、添加图例、添加比例尺都可以选择相应的左边竖条的标志进行。
添加指北针为添加图片,然后选中图上显示的框,在右边编辑器做选择图标,指北针的图标选择在搜索目录那里,填充颜色等修改:
比例尺这里,选择添加是似乎是默认的比例尺,不是根据地图改变的,要注意,在比例尺单位那选择地图单位,后面参数根据地图实际的参数进行修改,才能得到正确的比例尺。
最后出图时,选择这三个,建议选择导出成位图,直接是png格式文件,粘贴到word、ppt非常方便,导出到PDF时我出现过一次卡退,就没有再使用导出到PDF的方式了。
最终的效果图:
五、总结
作为一个研究非常偏的GISer,有时候遇到的问题真的难以快速找到答案。这几天我找了不少有关管网水力模型制图的资料,都没有一个比较整体的过程,探索了几天,总算是解决了。
与我而言,水力模型就已经是比较偏的方向了,当初找水力水质模型的编程方法就找了很久。这次的难点主要在于,如何加载模型,这个可以通过QGIS+插件实现;如何筛选节点,主要通过图层导出csv文件,通过Python编程实现筛选,再加载回QGIS;再者是QGIS制图问题,这个解决方案应该很多,不再赘述,主要就是比例尺的问题需要注意。
另感谢:麻辣GIS网站的QGIS的导入导出csv、制图等教程。网站地址:麻辣GIS