疾风亦有龟途 | 搜索
综合排序时间浏览量
全部分类安卓/IOS后端运维web前端软件安装学习/科研疾风龟途技巧杂糅
找到约 2 条结果
雷电公报的制作(未完)
1.前言 最近有一个任务,处理全省雷电数据。获得一些年,月,日的一些发生/强度等规律。原始数据是存在excel里面的。如下图所示 看到这种格式,感觉还是python好用一些。本文使用python来对数据进行处理。 2.数据处理 import pandas as pd
import numpy as np
# 计算
a = pd.read_excel("F:\\zxProjects\\雷电公报\\三维闪电-2021.xlsx")
# 获取需要的那一列的数据
intens = np.array(a.iloc[:, 2:3])
date = np.array(a.iloc[:, 6:7])
hour = np.array(a.iloc[:, 7:8])
gc_ic = np.array(a.iloc[:, 17:18])
# 创造列表,存放我们想要的结果
hour_times = 24 * [0]
hour_gc_times = 24 * [0]
month_times = 12 * [0]
month_gc_times = 12 * [0]
positive = 12 * [0]
2022/03/02 09:51
358
雷电
公报
Python制图+Java数据处理---高效制作雷评报告
1.前言 1.1总体思路 最近接到一个任务,通过使用近11年的雷电数据对给定经纬度站点的雷击情况进行统计分析,并制作相应的统计图。任务很简单,需求也很简单。无非就是数据提取,筛选,计算,并画图,但是就是烦,站点很多,数据很杂,格式不统一。可以做的工具有很多,matlab,python,java,Arcgis等等。善其事,利其器。本次项目,我们使用Python(画图),用Java完成数据的处理与雷评报告的自动生成。其实python可以完成整个操作流程,但是因为一些原因,还是配合使用处理吧。下图是整个工程的流程思路。整个流程很简单。最重要的是预处理环节,涉及到各种工具类的编写。接下来我们针对每一个环节写代码。 1.2工程结构 工程的结构也比较简单。为了优雅一点。我们仍然创建一个maven工程。还是老三样,实体类,任务,以及工具类。后续如果想部署到服务器,并给出相应的Api接口,需要更改项目结构,并引入其他东西。这都是后话了,有空再搞。 2.工具类编写 工具类的使用,可以大幅优化我们的项目结构,减少代码量。完成代码的复用。 2.1距离工具类编写getDistance 为了提取站点周围2km或者3km的闪击点要素。我们需要计算辖区内各个闪击点与站点的距离。给定两个点A和B,已知两点的经纬度值,和地球半径。我们可以很快计算得到两者之间的距离。 public class getDistance {
public static double getDis(double latitude1, double longitude1,
double latitude2, double longitude2) {
// 纬度
double lat1 = Math.toRadians(latitude1);
double lat2 = Math.toRadians(latitude2);
// 经度
double lng1 = Math.toRadians(longitude1);
double lng2 = Math.toRadians(longitude2);
// 纬度之差
double a = lat1 - lat2;
// 经度之差
double b = lng1 - lng2;
// 计算两点距离的公式
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
// 弧长乘地球半径, 返回单位: 千米
s = s * 6370.856;
return s;
}
}
该工具类返回值就是Double类型的两点间距离。 2.2合格条件站点工具类编写getStation 上面我们已经有了计算两点间距离的工具类。接下来我们开始计算所有符合条件的点。最后将所有符合条件的点放入到一个集合当中,返回,供接下来的任务使用。 我们的闪击数据是存放在excel中的。所以我们需要在pom.xml文件中引入相应的依赖。有了这个依赖,我们可以方便的使用java来对excel表格进行处理。 数据示例
org.apache.poi
poi
3.9
org.apache.poi
poi-ooxml
3.9
在计算过程中,为了对计算得到的点进行描述,我们需要创建一个bean类来对其进行描述。这就是面向对象的思想。万物皆对象。我们把这个bean类命名为stanData。其代码很简单,每一个属性都是和原来在excel中的属性相对应,虽然有很多属性在后面都用不上,但是为了保证数据的完整性,这里还是将其写了出来。篇幅有限,相应get,set方法已省略。 public class standData {
private String mapinfo;
private String id;
private String time;
private String hour;
private String minute;
private String second;
private String lat;
private String lon;
private String strength;
private String gradient;
private String error;
private String method;
private String province;
private String country;
private String city;
}
通过上面的准备,我们可以开始编写getStation工具类了。其实这里写的有一点不好,把有的参数写死了。后续可以优化一下。 public class getStation {
/**
*
* @param file 所要处理的excel文件
* @param rule1 想要所在辖区的名字(需要和excel中名字一致)
* @param latitude 站点的纬度
* @param longitude 站点的经度
* @param distance 圆的半径距离(如站点周围2km,则设置为2.0)
* @return 返回的是符合规则的点的对象集合
*/
public static ArrayList get(String file, String rule1, Double latitude, Double longitude, Double distance){
XSSFWorkbook book = null;
try {
book = new XSSFWorkbook(file);
//获取工作表
XSSFSheet sheet = book.getSheetAt(0);
//获得行数
int rows = sheet.getPhysicalNumberOfRows();
//System.out.println(rows);
ArrayList ruleList = new ArrayList();
for (int i = 1; i < rows; i++) {
XSSFRow row = sheet.getRow(i);
String s = row.getCell(13).toString();
if (s.equals(rule1)) {
standData standData = new standData();
standData.setMapinfo(row.getCell(0).toString());
standData.setId(row.getCell(1).toString());
standData.setTime(row.getCell(2).toString());
standData.setHour(row.getCell(3).toString());
standData.setMinute(row.getCell(4).toString());
standData.setSecond(row.getCell(5).toString());
standData.setLat(row.getCell(6).toString());
standData.setLon(row.getCell(7).toString());
standData.setStrength(row.getCell(8).toString());
standData.setGradient(row.getCell(9).toString());
standData.setError(row.getCell(10).toString());
standData.setMethod(row.getCell(11).toString());
standData.setProvince(row.getCell(12).toString());
standData.setCountry(row.getCell(13).toString());
standData.setCity(row.getCell(14).toString());
ruleList.add(standData);
}
}
//System.out.println(ruleList.size());
//开始筛选出三公里
ArrayList distanceList = new ArrayList();
for (int i = 0; i < ruleList.size(); i++) {
String lat = ruleList.get(i).getLat();
String lon = ruleList.get(i).getLon();
double dis = getDistance.getDis(parseDouble(lat), parseDouble(lon), latitude, longitude);
if (dis <= distance) {
//System.out.println(dis);
distanceList.add(ruleList.get(i));
}
}
return distanceList;
} catch (Exception e) {
}
return null;
}
}
通过实例化该工具类,我们可以获得一个站点周围2km/3km范围内的所有闪击点的各种要素的list集合。 2.3需求工具类编写createData 上面我们得到了所有符合条件的点。但是这还是不行的。我们需要对这些数据进行相应的统计分析。得到正闪,负闪的最大强度,平均强度,年份对应的闪击数,月份对应的闪击数,每小时对应的闪击数。以及每个闪击强度范围对应的闪击数。具体如下表。 2011-2020闪击次数 正闪次数 平均正闪强度 最大正闪强度 负闪次数 平均负闪强度 最大负闪强度 针对上面的表格,我们要创建一个light的bean类来对其进行描述。 public class light {
private int times;
//Positive number
private double positiveTimes;
//negative number
private double negativeTimes;
//averagePositive value
private double averagePositive;
//averageNegative value
private double averageNegative;
//最大正闪
private double maxPositive;
//最大负闪
private double maxNegative ;
//每年发生的闪击次数
private ArrayList yearTimes;
private ArrayList monthTimes;
private ArrayList dayTimes;
private ArrayList rangeTimes;
private ArrayList
2021/11/08 11:13
526
雷评
闪电
java
python
皮卡丘
热门标签