- 需求

在用Mike21 或者Mike3 做完模型计算之后,经常需要统计污染带的面积、长度、宽度。最初都是在ArcGIS中手动统计,费时费力。之前已经分别用c#、python实现过数据的导出、累计,以及面积统计功能,但是长宽统计一直没想好怎么实现。

最近因为疫情,封控在家,突然想到有时间更新一波统计工具了。

- 实现

模型计算结果是一堆带浓度值的三角形(或多边形),而污染带一般都是随着水流输移的,所以一般都是平行于岸线,所以只需要定义一个平行于岸线的直线,将所有大于指定浓度值的三角形投影到直线上(即三角形顶点到直线的垂足集合),再将所有投影线段合并成若干个互不覆盖的线段,再统计线段长度即可。

- 准备知识

由于不想import大量的包,所以我打算自己编写一个Point类,一个Line 类、一个Polygon类、一个Vector类。导入太多的包,而实际只使用一小部分,但是打包的时候会被全部塞进去,导致最终的包非常臃肿、低效。目前的包由于PyQT5已经变得比较臃肿了。

  1. 多边形面积计算
    从维基百科中可以找到相关的公式,改成python很简单,也有很多人已经实现了。
  2. 多边形行心(几何中心)计算
    内容在上面已经实现了。需要注意的是,由于面积的结果受到多边形点的顺序影响,可能会出现负值,所以在输出的时候需要添加abs(),以获取绝对值。但是在几何中心计算时,需要跟面积保持一样的点顺序,所以这里的面积需要直接用前面的计算结果,而不是绝对值。
  3. 点到直线的垂足计算(向量法)
    网上的方法大多是先求出直线的方程 y=ax+b中的a、b值,再利用公式计算垂足。但是这里最大的问题是,可能存在y=b,a不存在的情况。所以需要分情况讨论,比较繁琐。其实可以利用向量来计算,规避斜率不存在的特殊情况。
    如下图所示,要求出P3 到过P1、P2的直线的垂足P0,只需要计算出向量 P1P2→⋅P1P3→=∣P1P2→∣⋅∣P1P3→∣⋅cos⁡θ=∣P1P2→∣⋅∣P1P0→∣\overrightarrow{P_1P_2} \cdot \overrightarrow{P_1P_3} =| \overrightarrow{P_1P_2} |\cdot |\overrightarrow{P_1P_3}|\cdot \cos\theta=| \overrightarrow{P_1P_2} |\cdot |\overrightarrow{P_1P_0}|P1​P2​​⋅P1​P3​​=∣P1​P2​​∣⋅∣P1​P3​​∣⋅cosθ=∣P1​P2​​∣⋅∣P1​P0​​∣
    P1P0→=∣P1P0→∣∣P1P2→∣⋅P1P2→=(P1P2→⋅P1P3→)∣P1P2→∣2⋅P1P2→\overrightarrow{P_1P_0}=\frac{|\overrightarrow{P_1P_0}|}{|\overrightarrow{P_1P_2}|}\cdot\overrightarrow{P_1P_2}=\frac{(\overrightarrow{P_1P_2} \cdot \overrightarrow{P_1P_3})}{|\overrightarrow{P_1P_2}|^2}\cdot\overrightarrow{P_1P_2}P1​P0​​=∣P1​P2​​∣∣P1​P0​​∣​⋅P1​P2​​=∣P1​P2​​∣2(P1​P2​​⋅P1​P3​​)​⋅P1​P2​​


4. 判断上下游(向量法)
一般网络上的判断上下游的方法也是通过计算直线的方程y=ax+b,再将待计算点带入y=a x0+b,然后将计算的y与y0比较大小,这样也面临斜率不存在问题。
利用向量叉积可以计算判断上下游。还是用上图中的例子。
P3P1→×P3P2→=(0,0,z3)\overrightarrow{P_3P_1} \times \overrightarrow{P_3P_2} =(0,0,z_3)P3​P1​​×P3​P2​​=(0,0,z3​)
由于点与线都在z=0z=0z=0的平面,所以向量叉积的结果只有z3z_3z3​,叉积计算方法见维基百科。所以如果z3>0z_3>0z3​>0,则表示在上游,反之在下游。

- 成果

经过几天的Python代码编写,以及编译,最终实现了自己的想法。由于笔记本装的是deepin系统,没有办法打包成exe,只能打包成Linux上可以运行的appimage–》下载地址。

- 使用方法

  1. 直接运行/制作菜单快捷方式
    这个就不需要说太多了。
./area_cal.bin
  1. 界面
    运行后,可以看到工具的界面,主要通过三个tab来设置参数,第一个参数是必须填的,后面两个tab的参数可以选择开启。
    基本参数:
    这里需要设置shp文件位置、选择浓度字段、输入需要统计的浓度梯度值。浓度梯度值可以通过右侧的‘+’、‘-’、‘清空’三个按钮来设置,也可以直接在文本框中输入浓度梯度参数,浓度值之间用英文的逗号, 来间隔。可以把浓度梯度参数复制到Excel或其他文本文件中,方便下次快速使用。

    分段统计参数:

    分段统计是为了在统计时,区分上下游,这样统计的结果将分为上游和下游两块,一般选择一条经过排污口,且与岸线或者水流方向垂直的分割线。
    分段统计的计算原理是 将网格中心点与分割线两点分别计算向量,再将两个向量进行叉乘,因为叉乘结果满足右手法则。所以可以根据叉乘结果的正负形来判定是上游还是下游。
    长宽计算参数:

    长宽统计需要定义 长度 和宽度 两个统计方向向量,也可以只定义长度方向,然宽度方向直接垂直与长度方向即可。
    例如,可以在gis软件中,查看一个低浓度的污染带范围,选择两个点坐标,输入进去。参数文本框的用法与前面一致。

    点击计算,稍加等待就可以得到数据了。

    在Excel的空白处,右键粘贴就可以看到统计好的数据结果了。

    稍加整理,就可以显示完美了。
  2. 另外
    该工具能够保存上一次的参数,方便下次使用的时候直接调用。

DHI Mike 后处理工具——污染带面积、长度、宽度统计工具相关推荐

  1. 百度统计工具是什么?百度统计工具有什么用呢?

    百度统计工具其实是个非常有用的东西,但是做优化人员都不重视!不知道为啥,其实把百度统计工具和百度站长工具用好了,你做优化的时候,其实就事半功倍了!那么,借助于最近很多优化人员开始问我关于百度统计工具方 ...

  2. cloc JAVA文件_工具-cloc代码行数统计工具

    cloc 代码行统计工具 计算代码行.注释行.空行量的工具.支持多种语言. 例如统计一下vue项目里的src文件夹下的代码: 安装方式 npm install -g cloc # https://ww ...

  3. 噪音曲线图测试软件,利用示波器统计工具分析有噪声信号之测量统计和余晖图...

    利用示波器统计工具分析有噪声信号之测量统计和余晖图 2019-09-24 数字示波提供了多种基于统计的工具,除了前文提到的平均和直方图之外,测量参数统计和余晖图,也是非常有用的工具,协助快速获取有用信 ...

  4. iOS开发工具篇-AppStore统计工具

    http://blog.devtang.com/blog/2013/06/16/ios-dev-tool-app-store-tool/ iOS开发工具篇-AppStore统计工具 JUN 16TH, ...

  5. AppAnnie——AppStore统计工具

    前言 随着iOS开发的流行,针对iOS开发涉及的方方面面,早有一些公司提供了专门的解决方案或工具.这些解决方案或工具包括:用户行为统计工具(友盟,Flurry,Google Analytics等), ...

  6. App Store统计工具(App Annie)

    前言 随着iOS开发的流行,针对iOS开发涉及的方方面面,早有一些公司提供了专门的解决方案或工具.这些解决方案或工具包括:用户行为统计工具(友盟,Flurry,Google Analytics等), ...

  7. 6个常用第三方网站统计工具特点优势比较 - 站长应该选择谁?

    我们是否还记得才开始学习搭建个人网站的时候?给网站安装网站统计工具肯定是少不了的.然后每天可能好多次登入统计工具后台,看看当前已经有多少人访问过,每每看到访问人数的增加,心里还是比较美滋滋的.无论我们 ...

  8. 在线字符串长度计算,字符串统计工具

    在线字符串长度计算,字符串统计工具 在线字符串长度计算,字符串统计工具 本工具支持统计给定的字符串的总数,中文总数,英文总数,符号总数和数字总数等数据. 客户端实时计算,数据实时更新. https:/ ...

  9. ApachePOI导出exce,设置单元格风格的属性和设置字体风格的属性的两个工具类,POI宽度和excel 像素转换

    设置单元格风格的属性和设置字体风格的属性的两个工具类,POI宽度和excel 像素转换 /*** 功能:设置单元格风格的属性* */public static HSSFCellStyle SetCel ...

  10. 使用QGIS分区统计工具实现栅格分类数据的分区计算面积——GlobeLand30地表覆盖数据为例

    在栅格分析中,常常碰到使用分类后的栅格数据按照特定分区统计面积的需求,今天,我将使用QGIS的分区统计工具,演示地表覆盖数据按照地表分类分区域统计面积的过程,希望能给有这方面需求的朋友提供参考.  0 ...

最新文章

  1. 百度地图API(二)
  2. android studio文件风格,Android Studio构建风格 – 如何拥有不同风格的相同源文件
  3. Simulink仿真 第五节 复用器和分路器
  4. 基于C++全局变量的声明与定义的详解
  5. 程序猿 - 超实用的工具、素材、学习网站分享
  6. python参数类型定义_Python的参数类型
  7. 实验报告格计算机,计算机实验报告格式大全
  8. 突击计划——求整数中的较大者
  9. Hr人力资源管理系统怎样给企业创造价值
  10. [FOI2020WC模拟]看上去很简单
  11. 基于python学生档案管理系统的设计与实现.rar(毕业论文+程序源码+答辩PPT)
  12. 用canvas制作的躲避球小游戏html5源码
  13. linux 字体显示更清晰,Fedora下使中文字体显示变得更清晰
  14. ABAP ALV DATA_CHANGED 函数使用说明 (ALV备忘二)
  15. matlab treeplot,matlab creats phylogenetic tree
  16. 《Total Commander:万能文件管理器》——12.6. 附录
  17. linux怎么移植安卓rom,【经验技巧】任意手机移植ROM 教程,超详细ROM 技术详细......
  18. esxi迁移linux报错device eth0 does not seem tobe present,delaying
  19. 亚洲领军汽车产业展会Automechanika Shanghai开幕丨Xtecher 前线
  20. 2023 云海Chatgtp个人商业源码

热门文章

  1. mes管理系统php原码,MES系统_MES车间管理系统_轻量化定制方案
  2. 回顾线性系统和非线性系统
  3. 实施工程师职业的前景和发展思考
  4. 微信小程序 | 实现活动报名登记
  5. android获取root代码,Android获取ROOT权限的实例代码
  6. 费率转换成利率的计算器_存款利率计算器
  7. idea中使用git提交代码步骤
  8. Git利用命令行提交代码步骤
  9. react ssr方法
  10. 互联网共享图书馆+自习室商业计划书