Epanet文件解析和管线还原
公司里同事找了一个管道仿真模拟计算的软件,而我要做的内容,就是模仿这个软件,兼容这个软件,读取Epanet软件生成的inp文件管道,绘制到地图上。另外一个仿真软件是 AFT Arrow ,也有破解版,有空的时候再说吧。
1.坐标系
这里首先要解决的一点就是管道坐标系的问题,inp文件中的坐标描述为如下内容:
1 | [COORDINATES] |
在api参考文章中 有对坐标的说明:
Include one line for each node that has coordinates.
The coordinates represent the distance from the node to an arbitrary origin at the lower left of the network. Any convenient units of measure for this distance can be used.
The locations of the nodes need not be to actual scale.
A [COORDINATES] section is optional and only provides support for an external GUI program that uses the EPANET engine.
1.shape、cad转epanet文件 这个只是一个思路,没有实际上的指导意义,有几个注意事项,就是作者在进行坐标转换的时候,“采用2000坐标系地方坐标系转换,成功,模型变形很小”
2.基于 EPANET 与 ArcEngine 的供水管网建模软件 这是一片ArcEngine和EPANET软件结合的论文,这里有将inp格式的数据,存储到了Geodatabase数据库中
2.Java版
在网上找到了一个java的开源库,是一个完整的Epanet的java实现,但是非常的不友好,连jar文件也要自己生成。
我把他都改成了maven项目,pom.xml文件:
1 |
|
解决了下面的几个问题之后,进行打包,运行,在文件夹下生成了两个文件test.inp.nodes.out,test.inp.links.out
1 | ## 打包 |
最后运行成功:
也可以使用ui包下的EpanetUI,实现桌面版本的显示
1.Baseform /Baseform-Epanet-Java-Library 这似乎是一个epanet的java api接口,是以为完整的在epanet中完美的复现。
2.Epanet Java Epanet Java 提供了一个高效的、Java 实现的 Epanet 模拟引擎和本地集成的 MSX 库,用于全方位的水力和水质网络模拟。它利用了 Baseform Core 的 NETWORKS 及其 2D/3D 网络和结果可视化。
3.Samples and libraries for EPANET developers (C, C++, C#, Haskell, Java, JavaScript, MATLAB, Python, Visual Basic) 除了java的api接口,还有提供的其他的一些平台的接口,比如c,c++和python等。
4.使用ant生成可执行的jar包
问题
(1) 错误“ Java:不支持发行版本5”的正确解决方案
在解决了项目依赖的问题之后,运行debug的时候,出现了这个问题。
【解决方法】
在pom.xml文件中,添加:
1 | <properties> |
(2) Usage of API documented as @since 1.6+
在改造Epanet的时候,出现了这个问题,有些语句不合适,会报错。
【解决方法】
打开File->Project Structure->Modules->Language Level,选择高于6的级别。当然,如果你第一个问题解决了的话,这个问题也就不会出现了,因为设置了properties属性后,默认的就是语言级别就会变成8,不会出现这个问题了。
(3) 重新打包
1.Ant打包Maven项目—-解压依赖Jar包
(4) Can’t find bundle for base name Text
当我使用maven进行打包之后,运行了读取命令,出现错误。
1 | java -cp .\Epanet-1.0-SNAPSHOT.jar org.addition.epanet.EPATool -OPTIONS .\test.inp |
【解决方法】
把原项目中的Error.properties、Text.properties、uiresources文件夹、javadoc.css等资源文件,放到maven项目的resource文件夹下。
1.Can’t find bundle for base name 的解决方法 修改代码,重新指定其详细地址
2.Java ResourceBundle springboot中可以使用ResourceBundleMessageSource替换ResourceBundle读取resource/message下的文件
3.spring boot 使用ReloadableResourceBundleMessageSource的坑
4.SpringBoot读取Resource下文件的几种方式 使用ClassPathResource、Thread.currentThread().getContextClassLoader().getResourceAsStream()、this.getClass().getResourceAsStream()、ResourceUtils.getFile()
(5) in thread “main” java.lang.NoSuchMethodError: java.nio.ByteBuffer.flip()Ljava/nio/ByteBuffer;
打包运行之后,出现的错误:
参考文章中说,是因为在java11和java8中的Buffer flip对象不同,导致,提供了两种解决方案:
- 第一种,在编译的时候,加入编译选项:javac –release N
- 第二种,就是从代码层面修改,显示转换,将bb.flip 显示转换为Buffer: ((Buffer)bb).flip();
我选择了第二种,修改了AwareStep.java和HydraulicSim.java中的所有关于flip()函数调用的地方:
1 | // 原代码 |
1.Exception in thread “main” java.lang.NoSuchMethodError: java.nio.ByteBuffer.flip()Ljava/nio/ByteBuffer 这篇文章解决了我的问题
(6) 返回对象问题
这个问题比较古怪,就是在ENToolkit2.java文件中,如果一起复制的时候,idea会报下面语句错误,只有单独将这个文件中的语句,从别的工程中拷贝过来,才不会出现问题。奇怪的地方,就是拷贝前后,代码是一样的啊。
1 | Collection<Link> cLinks = net.getLinks() |