如何使用FME开发自动化分析报告功能

目录

前言

一、使用的技术栈

二、技术难点解析

1.专题图

2.WORD文档实现

 2.1 动态标题

2.3动态表格和文本

2.3专题图插入

三、完成NewGIS部署

四、模板总览图

总结


前言

一个标准项目分析报告需要需要包括3个方面:

  1. 文本叙述,主要体现在对某项专项数据的分布情况,总体情况,分类情况进行描述,需要使用真实数据,能够直观的反馈数据的存在情况。
  2. 表格展示,使用表格数据展示,能够更加直观的反馈数据的数量,分布,分类情况。
  3. 专题图展示,一个标准的专题图,需要包括图例、图样、行政区界限等要素,让数据的分布情况一目了然。

        按照常规的生产模式,一个分析报告往往涉及多个图层、多种数据、多种维度的数据分析。以城镇国土空间监测项目为例,完成一个分析报告往往需要好几天时间。通过城镇国土空间监测分析报告自动处理方案,能够实现在3分钟以内,完成分析报告的自动化编制,并且能实现无任何逻辑错误,文档和数据库的一致性。


一、使用的技术栈

        整套方案整体流程通过FME开发,数据分析通过FME和pandas分析库辅助实现,专题图通过FME和python的opencv库实现,word文档和表格部分通过python-docx库实现。

二、技术难点解析

1.专题图

        众所周知,大部分的专题图都是由专业软件Arcgis或者Qgis等制作,需要手动配置图例,样式,文本,颜色,指北针等信息。优点是自定义化程度高,能实现各式各样的专题图制作,缺点也很明显,很难实现自动化图,样式,图例随动的出图,同时也不能和WORD联动,实现自动插图。

        FME虽然在出图方面没有arcgis优秀,但其优秀的数据处理和整合能力是无可比拟的。它能让你的逻辑图形化,让你的思维能更加清晰。

        以城镇国土空间监测项目为例,我们先做一个config配置表格,通过该文件实现对图层名称,颜色的配置。

        行政区裁剪和环绕文本制作,先上成果图

首先我们先说一下如何实现文字环绕的逻辑,其实非常简单,就是将行政区buff后,裁剪当前区域,获得环绕行政区

再通过一系列的数学算法,让文本均匀分布在图形内部,同时保证字的顺序的方向性一致。

        然后是就是需要注意字体大小和图形面积是有比例关系的,因为很多样本的图形大小差距很大,将字体大小固定下来的话就很难有适配性,那么就应该通过总面积大小求得一个比例参数,并将该参数发布为全局变量。

文本的固定使用TextStroker转换器实现,该转换器可以将label的点文字注记转换为文本的几何。

考虑到部分要素面积小,要素个数较少,很难在图形上看到分布,则设置一个阈值将文字标记展示出来。

但是这样也会存在一个问题,就是文字注记的压盖,这里我们使用了一个算法,来调整几个文本box的空间位置,让其能较好的分布。整体的逻辑就是使用递归,不断的调整相互重叠字体的位置,来达到比较正常分布。

import fme
import fmeobjectsimport copydef adjust_boxes(boxes):moved_boxes = copy.deepcopy(boxes)  # 创建一个副本用于移动overlap = True  # 初始化重叠标志为Truewhile overlap:overlap = Falsefor i in range(len(boxes)):for j in range(i+1, len(boxes)):if check_overlap(moved_boxes[i], moved_boxes[j]):overlap = Truemove_box(moved_boxes, i, j)return moved_boxesdef check_overlap(box1, box2):# 检查两个box是否重叠return not (box1[1] < box2[0] or box1[0] > box2[1] or box1[3] < box2[2] or box1[2] > box2[3])def move_box(boxes, index1, index2):# 移动box2以保证与box1不重叠box1 = boxes[index1]box2 = boxes[index2]x_overlap = min(box1[1], box2[1]) - max(box1[0], box2[0])y_overlap = min(box1[3], box2[3]) - max(box1[2], box2[2])x_offset = max(box1[1], box2[1]) - min(box1[0], box2[0]) + 1 - x_overlapy_offset = max(box1[3], box2[3]) - min(box1[2], box2[2]) + 1 - y_overlapif x_offset < y_offset:  # 选择较小的偏移方向if box1[1] < box2[0]:  # box2在box1的右侧offset = x_offsetelse:  # box2在box1的左侧offset = -x_offsetboxes[index2][0] += offsetboxes[index2][1] += offsetelse:if box1[3] < box2[2]:  # box2在box1的上方offset = y_offsetelse:  # box2在box1的下方offset = -y_offsetboxes[index2][2] += offsetboxes[index2][3] += offset
class FeatureProcessor(object):"""Template Class Interface:When using this class, make sure its name is set as the value of the 'Classto Process Features' transformer parameter."""def __init__(self):self.features = []"""Base constructor for class members."""passdef input(self, feature):self.features.append(feature)"""This method is called for each FME Feature entering the PythonCaller. If knowledge of all input Features is not required for processing, then the processed Feature can be emitted from this method through self.pyoutput(). Otherwise, the input FME Feature should be cached to a list class member and processed in process_group() when 'Group by' attributes(s) are specified, or the close() method.:param fmeobjects.FMEFeature feature: FME Feature entering the transformer."""def close(self):"""This method is called once all the FME Features have been processedfrom input()."""passdef process_group(self):boxes = []for feature in self.features:box = [feature.getAttribute('_xmin'), feature.getAttribute('_xmax'), feature.getAttribute('_ymin'), feature.getAttribute('_ymax')]boxes.append(box)new_boxes = adjust_boxes(boxes)for i,item in enumerate(new_boxes):cent_x = (item[0]+item[1])/2cent_y = (item[2]+item[3])/2self.features[i].setAttribute('cent_x',cent_x)self.features[i].setAttribute('cent_y',cent_y)for feature in self.features:self.pyoutput(feature)self.features = []

最后设置好每类要素的透明度,宽度等样式信息,并写入属性中。最终将几何信息和样式信息输出到Matplotlib中,导出png专题图。

用同样的方式制作图例

最后将预设的指北针图标,图例与图形结合,使用PIL库的镶嵌实现,最终构成完整的专题图。

2.WORD文档实现

        分析报告和一般的有固定模板的wrod文档批量出具有很大的不同,主要在于其没有固定模板,不能像邮件合并一样在固定位置插入数据。其所有的标题,二级标题,以及表格的样式,行列数都是无法固定的。

 2.1 动态标题

        标题的添加通过python-docx的add_heading函数实现,通过提前分析计算各图层的标题等级和标题顺序号来完成添加

        形成标题成果

        

2.3动态表格和文本

这里我通过python-docx二次封装了几个函数

1、add_paragraph_to_word(location,text,size,align = None,font_name = None,args = [])函数,能直接添加段落到文档的指定位置,并能设置字体大小,对齐,字体名,args里面可以设置下划线、艺术字、加粗等样式信息。

2、add_df_to_word(word, df)函数,该函数能够直接实现pandas的dataframe对象直接插入到wrod文档中,并自动将标题加粗,文本居中。比如如下代码

            if feature.getAttribute('几何类型') == "线":data = {'类型': TYPE, '长度(千米)': LEN ,"要素数量":count}else:data = {'类型': TYPE, '面积(亩)': LEN ,"要素数量":count}df = pd.DataFrame(data)name = feature.getAttribute('CCN')add_paragraph_to_word(word,"表4-{} {}统计表".format(i_table,name),14,"center","仿宋")add_df_to_word(word,df)

df打印如下所示

插入wrod如下所示

2.3专题图插入

使用python-docx自带的add_picture函数实现

三、完成NewGIS部署

在自研平台NewGIS Integration平台完成方案的部署(该平台由我团队自主研发,前端VUE,后端 GoLang,能够实现对FME模板自动化部署,并且支持高并发运行)

导入行政区界限,和成果GDB数据并提交

在成果预览中下载分析报告

点击下载,解压压缩包

完成分析报告的自动化出具

四、模板总览图

总计340个转换器


总结

        该方案不单单能应用于城镇国土空间监测项目,能定制开发所有项目的分析报告,包括规划的合规分析,可行性分析,调查监测的变更调查数据库分析报告等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/161127.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cmd进程简单操作指令

dir 查询当前路径和子路径 start空格加自己的exe程序&#xff0c;可运行程序。 taskkill /?可以执行很多&#xff0c;通常用于结束程序。 taskkill /f /im qq.exe 启动nginx.exe 查看运行的进程有哪些 选择结束nginx.exe

Python文件共享+cpolar内网穿透:轻松实现公网访问

文章目录 1.前言2.本地文件服务器搭建2.1.Python的安装和设置2.2.cpolar的安装和注册 3.本地文件服务器的发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用&#…

数据结构----算法--五大基本算法

数据结构----算法–五大基本算法 一.贪心算法 1.什么是贪心算法 在有多个选择的时候不考虑长远的情况&#xff0c;只考虑眼前的这一步&#xff0c;在眼前这一步选择当前的最好的方案 二.分治法 1.分治的概念 分治法&#xff1a;分而治之 将一个问题拆解成若干个解决方式…

uni-app--》基于小程序开发的电商平台项目实战(六)

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

docker入门加实战—docker常见命令

docker入门加实战—docker常见命令 在介绍命令之前&#xff0c;先用一副图形象的展示一下docker的命令&#xff1a; 常见命令 docker的常见命令和文档地址如下表&#xff1a; 命令说明文档地址docker pull拉取镜像docker pulldocker push推送镜像到DockerRegistrydocker pus…

EmoTalk: Speech-Driven Emotional Disentanglement for 3D Face Animation

问题:现存的方法经常忽略面部的情感或者不能将它们从语音内容中分离出来。 方法:本文提出了一种端到端神经网络来分解语音中的不同情绪,从而生成丰富的 3D 面部表情。 1.我们引入了情感分离编码器(EDE),通过交叉重构具有不同情感标签的语音信号来分离语音中的情感和内容。…

【广州华锐互动】塔吊多人安拆VR互动培训系统

塔吊多人安拆VR互动培训系统由广州华锐互动制作&#xff0c;是一种基于VR技术的模拟实训系统&#xff0c;专门用于培训塔吊驾驶员和操作员。 在现实生活中&#xff0c;塔吊操作具有一定的危险性&#xff0c;尤其是在培训过程中容易发生意外。而使用VR互动实训系统&#xff0c;学…

金融用户实践|分布式存储支持数据仓库业务系统性能验证

作者&#xff1a;深耕行业的 SmartX 金融团队 闫海涛 估值是指对资产或负债的价值进行评估的过程&#xff0c;这对于投资决策具有重要意义。每个金融公司资管业务人员都期望能够实现实时的业务估值&#xff0c;快速获取最新的数据和指标&#xff0c;从而做出更明智的投资决策。…

Java8实战-总结42

Java8实战-总结42 用Optional取代null应用 Optional 的几种模式默认行为及解引用 Optional 对象两个 Optional 对象的组合使用 filter 剔除特定的值 用Optional取代null 应用 Optional 的几种模式 默认行为及解引用 Optional 对象 采用orElse方法读取这个变量的值&#xff0…

uniapp订单循环列表倒计时

目录 效果图片插件uni-countdown代码最后 效果图片 插件uni-countdown 地址 代码 <template><view class""><!-- 下面循环两个列表 --><view class"item" v-for"(item, index) in listData" :key"index">&…

mybatis-plus自动填充

前言 这是我在这个网站整理的笔记&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 mybatis-plus自动填充 大家做设计数据表的时候&#xff0c;基本上都会有del_flag&#xff0c;create_time, update_time,这三个字段&#xff0c;这也是…

问题记录1 json解析问题

问题&#xff1a; json解析int类型不符合预期&#xff0c;使用json.NewDecoder解决。 示例如下&#xff1a; package mainimport ("bytes""encoding/json""fmt" )func main() {data1 : map[string]interface{}{}data1["id"] int64(4…

windows安装npm教程

在安装和使用NPM之前&#xff0c;我们需要先了解一下&#xff0c;NPM 是什么&#xff0c;能干啥&#xff1f; 一、NPM介绍 NPM&#xff08;Node Package Manager&#xff09;是一个用于管理和共享JavaScript代码包的工具。它是Node.js生态系统的一部分&#xff0c;广泛用于构…

浅谈变电站运维技术模式及应用-安科瑞黄安南

近年来&#xff0c;市场电子资源需求量的逐步上升&#xff0c;使变电系统建设逐步向复杂环境拓展。为保障变电系统运行稳定性及人员管理安全性&#xff0c;无人值班变电站技术运用势在必行&#xff0c;是解决复杂条件下变电设备运行不稳定及人员设备管理效益低下问题的重要核心…

O2O优惠券预测

O2O优惠券预测 赛题理解赛题类型解题思路 数据探索理论知识数据可视化分布 特征工程赛题特征工程思路 模型训练与验证 赛题理解 赛题类型 本赛题要求提交的结果是预测15 天内用券的概率&#xff0c;这是一个连续值&#xff0c;但是因为用券只有用与不用两种情况&#xff0c;而…

VMware 配置记录

VMware 配置笔记 CentOS 7.9 镜像下载 官网太慢&#xff0c;建议在阿里云镜像站去CentOS配置页找标准版下载。 选标准版即可&#xff0c;各版本区别&#xff1a; DVD&#xff1a;标准版&#xff0c;包含常用软件&#xff0c;体积为 4.4 G&#xff1b;Everything&#xff1a…

接口加密解决方案:Python的各种加密实现!

01、前言 在现代软件开发中&#xff0c;接口测试已经成为了不可或缺的一部分。随着互联网的普及&#xff0c;越来越多的应用程序都采用了接口作为数据传输的方式。接口测试的目的是确保接口的正确性、稳定性和安全性&#xff0c;从而保障系统的正常运行。 在接口测试中&…

JavaFx学习问题2--音频、视频播放失败情况

文章目录 一、路径注意事项&#xff1a;① 用相对路径的时候别忘了前面的斜杠② uri问题 二、播放不了的问题① 获取的媒体文件路径本身就是不对的② 必须是uri③ 特殊情况 额外收获: 一、路径注意事项&#xff1a; 完整代码如下: import javafx.application.Application; im…

分布式链路追踪如何跨线程

背景 我们希望实现全链路信息&#xff0c;但是代码中一般都会异步的线程处理。 解决思路 我们可以对以前的 Runable 和 Callable 进行增强。 可以使用 ali 已经存在的实现方式。 TransmittableThreadLocal (TTL) 解决异步执行时上下文传递的问题 核心的实现思路如下&#…

时间复杂度为 O(n^2) 的排序算法

大家好&#xff0c;我是 方圆。对于小规模数据&#xff0c;我们可以选用时间复杂度为 O(n2) 的排序算法&#xff0c;因为时间复杂度并不代表实际代码的执行时间&#xff0c;而且它也省去了低阶、系数和常数&#xff0c;仅代表的增长趋势&#xff0c;所以在小规模数据情况下&…