Epanet文件解析和管线还原

标签: 无 分类: 未分类 创建时间:2021-06-27 13:59:58 更新时间:2024-11-23 02:04:25

公司里同事找了一个管道仿真模拟计算的软件,而我要做的内容,就是模仿这个软件,兼容这个软件,读取Epanet软件生成的inp文件管道,绘制到地图上。另外一个仿真软件是 AFT Arrow ,也有破解版,有空的时候再说吧。

1.坐标系

这里首先要解决的一点就是管道坐标系的问题,inp文件中的坐标描述为如下内容:

1
2
3
4
5
6
7
8
9
10
[COORDINATES]
;Node X-Coord Y-Coord
2 105.32 7195.12
3 1590.91 5920.18
4 1590.91 3048.78
5 5648.56 5931.26
6 5659.65 3048.78
7 8919.07 5931.26
1 -1480.04 8503.33
8 11413.53 8104.21

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>Epanet</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.7</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.7</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.7</version>
</dependency>

<dependency>
<groupId>xmlbeans</groupId>
<artifactId>xbean</artifactId>
<version>2.2.0</version>
</dependency>

<dependency>
<groupId>xmlbeans</groupId>
<artifactId>xbean_xpath</artifactId>
<version>2.2.0</version>
</dependency>

<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>

<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans-qname</artifactId>
<version>2.6.0</version>
</dependency>

<dependency>
<groupId>xmlbeans</groupId>
<artifactId>xmlpublic</artifactId>
<version>2.2.0</version>
</dependency>

<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.17</version>
</dependency>

<dependency>
<groupId>org.cheffo</groupId>
<artifactId>jeplite</artifactId>
<version>0.8.7a</version>
</dependency>


</dependencies>

</project>

解决了下面的几个问题之后,进行打包,运行,在文件夹下生成了两个文件test.inp.nodes.out,test.inp.links.out

1
2
3
4
5
## 打包
mvn clean package

## 运行
java -cp .\Epanet-1.0-SNAPSHOT.jar org.addition.epanet.EPATool -OPTIONS .\test.inp

最后运行成功:

也可以使用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
2
3
4
5
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<java.version>1.8</java.version>
</properties>

(2) Usage of API documented as @since 1.6+
在改造Epanet的时候,出现了这个问题,有些语句不合适,会报错。

【解决方法】
打开File->Project Structure->Modules->Language Level,选择高于6的级别。当然,如果你第一个问题解决了的话,这个问题也就不会出现了,因为设置了properties属性后,默认的就是语言级别就会变成8,不会出现这个问题了。

(3) 重新打包

(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
2
3
4
5
6
// 原代码
// buf.flip();

// 新代码
// explicitly casting
((Buffer)buf).flip();

(6) 返回对象问题
这个问题比较古怪,就是在ENToolkit2.java文件中,如果一起复制的时候,idea会报下面语句错误,只有单独将这个文件中的语句,从别的工程中拷贝过来,才不会出现问题。奇怪的地方,就是拷贝前后,代码是一样的啊。

1
Collection<Link> cLinks = net.getLinks()
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。