目录
一、简介
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();
}
}
四、代码资源
源代码资源可以在置顶获取,希望能帮助到有需要实现相关功能的朋友。❤