目录
一、简介
NASA(美国国家航空航天局)是美国联邦政府的一个独立机构,负责国家的航空航天研究和探索任务。NASA成立于1958年,其使命是探索太空并推动科学技术的发展。
NASA的主要任务包括研究地球和太空的物理特性、开发和测试航空航天技术、进行太空探索和科学研究,以及促进航空航天技术的应用和技术转移。
这里使用其开发的系统firms(火灾资源管理系统),通过Http请求获取数据来实现火点的监测,帮助需要实现相关功能,有类似开发任务的朋友。
网站地址:NASA | LANCE | FIRMS.
二、准备工作
2.1 账号注册
首先需要在API - Area - NASA | LANCE | FIRMS页面下面使用邮箱申请一个MapKey,该MapKay用于后面的访问验证。
在该页面也可以做一些在线的请求测试。
2.2 卫星型号
- MODIS(URT+NRT)
- MODIS(SP)
- VIIRS NOAA-20(URT+NRT)
- VIIRS NOAA-21(URT+NRT)
- VISS-SNPP(URT+NRT)
- VISS-SNPP
2.3 接口格式
根据其网站给出的接口格式整理其请求地址和请求参数如下:
请求地址:https://firms.modaps.eosdis.nasa.gov
接口格式: /api/area/csv/{MAP-KEY}/{TYPE}/{Area}/{DayRange}/{Date}
参数解释:
MAP-KEY:申请的验证MAP-KEY.
TYPE:卫星型号,对应上述卫星型号的使用以下关键词(MODIS_NRT、MODIS_SP、 VIIRS_NOAA20_NRT、VIIRS_NOAA21_NRT、VIIRS_SNPP_NRT、VIIRS_SNPP_SP)。
Area:区域范围,使用按西、南、东、北的最大值、最小值经纬度表示.山东省经纬度范围 (116.2,34.5,122,38)
DayRange:天数,即从Date开始的获取往后DayRange天的数据。
Date:不传值查询当天最新数据信息,传值格式为:YYYY-MM-DD,如:2023-10-11
响应数据:
latitude:经度。
longitude:纬度。
bright_ti4:亮度温度。
scan:卫星扫描号。
track:跟踪号。
acq_date:获取日期。(YYYY-MM-DD)
acq_time:获取时间。(HHMM)
satellite:卫星类型缩写。
instrument:获取仪器。
confidence:置信度。
version:版本。
bright_ti5:亮度温度。
frp:火焰辐射功率。
daynight:白天/黑夜(D/N)。
三、代码实现
3.1 导入pom依赖
这里主要用到了springboot的Web依赖(主要是使用其RestTemplate类进行远程请求.),test依赖用来做测试,commons-csv用来解析返回的csv数据,fastjson用来进行map转实体类时使用。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.17</version> </dependency>
3.2 代码实现
3.2.1 配置类
这里配置类只有一个RestTemplate用于请求数据接口。
package com.uav.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class NasaFireScanConfig { //用于远程请求卫星数据 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
3.2.2 实体类
根据响应数据编写实体类变量,用于后续数据存储或数据处理,这里省去变量的(get/set)方法,实际使用时应该有。
package com.uav.entity; public class ScanData { private String id; private Double latitude; private Double longitude; private Double bright_ti4; private Double scan; private Double track; private String acq_date; private String acq_time; private String satellite; private String instrument; private String confidence; private String version; private String bright_ti5; private String frp; private String daynight; private String brightness; private String bright_t31; //省去get/set方法 }
3.2.3 服务实现类
这里主要调用findNasaFireData方法使用通过restTemplate请求远程csv数据,并从第二行开始对csv数据进行Map转换,然后通过FastJson将其转换为实体类返回.并在其中通过sha256算法根据csv数据生成唯一的ID,以确保数据库存在的数据的唯一性。
package com.uav.service.impl; import com.alibaba.fastjson.JSON; import com.sun.org.apache.xml.internal.security.algorithms.implementations.SignatureDSA; import com.uav.entity.ScanData; import com.uav.service.IScanService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; @Service public class ScanServiceImpl implements IScanService { //注入远程请求 @Autowired RestTemplate restTemplate; @Value("${nasa.api.url}") private String baseUrl; @Override public List<ScanData> findNasaFireData(Map<String, Object> params) throws NoSuchAlgorithmException { //获取数据的csv格式 String csvData=getRemoteNasaDataCsv(params); System.err.println(csvData); //解析csv格式并封装为ScanData //从第二行开始进行字符串解析 return covCsvDataToEntity(csvData); } private List<ScanData> covCsvDataToEntity(String csvData) throws NoSuchAlgorithmException { String[] lines = csvData.split("\n"); if (lines.length==1){ return null; } List<Map<String,Object>> mapList=covCsvDataToMap(lines); List<ScanData> scanDataList=new ArrayList<>(); mapList.forEach(map->{ ScanData scanData = JSON.parseObject(JSON.toJSONString(map), ScanData.class); scanDataList.add(scanData); }); return scanDataList; } private List<Map<String, Object>> covCsvDataToMap(String[] lines) throws NoSuchAlgorithmException { List<Map<String,Object>> dataList=new ArrayList<>(); String header = lines[0]; String[] keys = header.split(","); List<String[]> valueList=new ArrayList<>(); for (int i=1;i<lines.length;i++){ String[] values = lines[i].split(","); valueList.add(values); } for (int i=0;i<valueList.size();i++){ Map<String,Object> map=new HashMap<>(); String[] value = valueList.get(i); for (int j=0;j<keys.length;j++){ map.put(keys[j],value[j]); } map.put("id", strToHex(Arrays.toString(value))); dataList.add(map); } return dataList; } //请求并获取卫星监测的火点数据 @Override public String getRemoteNasaDataCsv(Map<String, Object> params) { String url = getRequestUrl(baseUrl, params); ResponseEntity<String> response = restTemplate.getForEntity(url, String.class, ""); return response.getBody(); } //url和参数拼接,如果为空则拼接空字符串 public static String getRequestUrl(String baseUrl,Map<String,Object> params){ return baseUrl+"/"+params.getOrDefault("MAP-KEY","")+"/" +params.getOrDefault("TYPE","")+"/"+ params.getOrDefault("Area","")+"/"+ params.getOrDefault("DayRange","")+"/"+ params.getOrDefault("Date",""); } private static String strToHex(String data) throws NoSuchAlgorithmException { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(data.getBytes(StandardCharsets.UTF_8)); StringBuilder hexString = new StringBuilder(2 * hash.length); for (byte b : hash) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); } }
四、代码资源
源代码资源可以在置顶获取,希望能帮助到有需要实现相关功能的朋友。❤
编辑