[python]受力分析数据可视化解决两个问题1.excel转json 2.渲染量过大

客户需求

公司有个项目,是北京某大学的项目,一个虚拟仿真项目,需要模仿一个国外的牛逼软件,我理解为一个受力分析的软件,大概的样子如下
在这里插入图片描述
这个图是我手头唯一的图片,实际上这个软件是做了一个三维的受力分析的,客户要求我们也做一个同样效果的图,客户那边根据那个外国软件可以生成一系列的数据,大概的样子如下
在这里插入图片描述
看到这个数据就比较尴尬了,我们把这个转为excel,并加入颜色看看效果.
在这里插入图片描述
我看了一下一共是2208的数据,这个数据量还比较小,上一次同样的数据,他们给我了2w+的数据量,这个时候我使用unity的epplus来读取这些数据,问题不大读到了,也表现出来了.

开工

使用unity编写了代码读取,具体的配置面板如下
在这里插入图片描述

技术问题

  1. 使用球体,面对2w个点的数据,根本没法应付
  2. 使用单canvas存在同canvas渲染层级的问题,想看效果的话,可以参考echarts里面的3d散点图
  3. 使用多canvas又存在和第一个问题相同的问题,渲染数量过大

技术定型

最终为了实现更好的效果,我们还是使用了单canvas的技术定型,因为可以渲染的更多,但是我们需要从后到前的顺序来渲染
在这里插入图片描述
因为如果渲染的顺序相反,会出现近的优先渲染,远的后渲染的问题
在这里插入图片描述
所以就只能尽可能的锁定视角,本来还想使用例子特效的效果,因为可以使用Billboard(广告牌)的渲染模式,但是还是消耗太大了,

为了方便研究他给的数据,我这边把每个点改成text,并显示对应的index效果如下
在这里插入图片描述
这样就可以发现,客户给的数据并不是规则的,从index中无法找到规律,所以只能使用如上的image(一个白色圆的方式)

只能通过圆的方式,看看效果了在这里插入图片描述

问题

这个时候客户说,我们需要的是一个webgl的版本,这个时候我就要调整之前选中的几个技术

  1. 数据保存成excel,我需要把数据改成json的形式保存
  2. 消耗的问题,webgl的渲染量级肯定和PC端是没法比的,我需要降低当前的渲染数量,或者增加他的渲染量级的上线

解决

  1. 第一个解决的方法就是使用python来解决代码如下
# coding: utf-8
import pandas as pd
import json

# 1. 读取一个excel
excel_reader = pd.ExcelFile('data.xlsx')  # 指定文件

# 2. 得到所有的sheets
sheet_names = excel_reader.sheet_names  # 读取文件的所有表单名,得到列表

# 3. 定义一个obj
sheets = {}

# 4. 循环所有的sheets
for index in range(len(sheet_names)):

    # 5. 解析excel对应的sheet的数据
    df = excel_reader.parse(sheet_name=sheet_names[index])

    # 6. 得到我需要的列,并取十位小数
    sheet_obj_excel = df[['id', 'X', 'Y', 'Z',
                          'X-Dis', 'Y-Dis', 'Z-Dis']].round(10)

    # 7.把得到的数据转化为json字符串
    sheet_str_json = sheet_obj_excel.to_json(force_ascii=False)

    # 8. 得到json对象
    sheet_obj_json = json.loads(sheet_str_json)

    # 9. 把我们得到的sheet对象放到我们准备好多的
    sheets[index] = sheet_obj_json

# 10. 首先是把json字符串变为json对象  然后在格式化  间距4个空格
data5 = json.dumps(sheets, indent=4,
                   separators=(',', ':'), ensure_ascii=False)

# 11. 写入对应的文件中
file_handle = open('excel2json1.json', mode='w')
file_handle.write(data5)
file_handle.close()
  1. 解决第二个问题比较棘手,现在唯一能想到的就是dots的方式来处理,但是可能无法达到我想象的效果,所以,还是需要调研一下,而且是否支持webgl,

2020年8月20日更新

因为公司不是很多人会python,有的时候会生成很多,为了照顾大部分人,升级到了自动识别,自动生成的版本

# coding: utf-8
import pandas as pd
import json
import os

# 1.  文件夹路径
dirpath = r'铸铁压缩数据'

# 2.  得到路径下的所有文件
for root, dirs, files in os.walk(dirpath):

    # 3.  循环这些文件
    for file in files:

        # 4.  得到这些文件的名字
        fname = os.path.splitext(file)

        # 5.  判断这些文件是否为excel
        if fname[1] == '.xlsx' or fname[1] == '.xls':

            # 7.  读取一个excel
            excel_reader = pd.ExcelFile(os.path.join(root, file))  # 指定文件

            # 8.  得到所有的sheets
            sheet_names = excel_reader.sheet_names  # 读取文件的所有表单名,得到列表

            # 9.  定义一个obj
            sheets = {}

            # 10.  循环所有的sheets
            for index in range(len(sheet_names)):

                # 11.  解析excel对应的sheet的数据
                df = excel_reader.parse(sheet_name=sheet_names[index])

                # 12.  得到我需要的列,并取十位小数 时间(s) 力(kN) 位移(mm)
                sheet_obj_excel = df.round(10)

                # 13.  把得到的数据转化为json字符串
                sheet_str_json = sheet_obj_excel.to_json(force_ascii=False)

                # 14.  得到json对象
                sheet_obj_json = json.loads(sheet_str_json)

                # 15.  把我们得到的sheet对象放到我们准备好多的
                sheets[index] = sheet_obj_json

            # 16.  首先是把json字符串变为json对象 然后在格式化 间距4个空格
            data5 = json.dumps(sheets, indent=4,
                               separators=(',', ':'), ensure_ascii=False)

            # 17.  得到生成json文件的名字
            jsonfilename = 'excel2json' + str(fname[0]) + '.json'

            # 18.  写入对应的文件中
            file_handle = open(jsonfilename, mode='w')
            file_handle.write(data5)
            file_handle.close()

            # 19.  输出转化完成
            print("转化完成\texcel文件:\t" + file + "\t-->\tjson文件:" + jsonfilename)

# 20.  生成完毕,请验收你的json文件
print("-->所有文件都生成完毕了<--")

总结

  1. 解决问题的办法还是要从设计入手,
    我感觉还是要从设计入手修改这个地方,如果单纯从技术方案来解决的话,很难达到满意的效果,国外的效果也不尽如人意,但是就是很好用,也不是单纯的说外国软件好,想一下,这些效果不是那么好的软件,他们的底层基础也是很久时间的积累,但是为什么他们不把效果不断的完善,而是专供数据呢,其实还是一个道理,就是数据才是真正有意义的
  2. 技术储备还是很重要的,人需要学习的地方还有很多
    最近在搞项目管理的技术学习,并且在自己制作一个pmp的管理系统,php的知识也不是那么难学,python的知识也不是那么难学,但是多学一些,你能干的多了就是对自己的帮助,毕竟我是想做技术总监的男人.
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页