火点监测:Nasa高分卫星接入

简介: NASA(美国国家航空航天局)是美国联邦政府的一个独立机构,负责国家的航空航天研究和探索任务。NASA成立于1958年,其使命是探索太空并推动科学技术的发展。NASA的主要任务包括研究地球和太空的物理特性、开发和测试航空航天技术、进行太空探索和科学研究,以及促进航空航天技术的应用和技术转移。这里使用其开发的系统firms(火灾资源管理系统),通过Http请求获取数据来实现火点的监测,帮助需要实现相关功能,有类似开发任务的朋友。

 目录

一、简介

二、准备工作

2.1 账号注册

2.2  卫星型号

2.3  接口格式

三、代码实现

3.1 导入pom依赖

3.2 代码实现

3.2.1 配置类

3.2.2 实体类

3.2.3 服务实现类

四、代码资源


一、简介

       NASA(美国国家航空航天局)是美国联邦政府的一个独立机构,负责国家的航空航天研究和探索任务。NASA成立于1958年,其使命是探索太空并推动科学技术的发展。

NASA的主要任务包括研究地球和太空的物理特性、开发和测试航空航天技术、进行太空探索和科学研究,以及促进航空航天技术的应用和技术转移。

      这里使用其开发的系统firms(火灾资源管理系统),通过Http请求获取数据来实现火点的监测,帮助需要实现相关功能,有类似开发任务的朋友。

网站地址:NASA | LANCE | FIRMS.

二、准备工作

2.1 账号注册

       首先需要在API - Area - NASA | LANCE | FIRMS页面下面使用邮箱申请一个MapKey,该MapKay用于后面的访问验证。

       在该页面也可以做一些在线的请求测试。

2.2  卫星型号

  1. MODIS(URT+NRT)
  2. MODIS(SP)
  3. VIIRS NOAA-20(URT+NRT)
  4. VIIRS NOAA-21(URT+NRT)
  5. VISS-SNPP(URT+NRT)
  6. 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>

image.gif

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();
    }
}

image.gif

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方法
}

image.gif

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();
    }
}

image.gif

四、代码资源

       源代码资源可以在置顶获取,希望能帮助到有需要实现相关功能的朋友。❤

image.gif 编辑


目录
相关文章
|
JavaScript 前端开发 Java
SpringBoot+Vue打造资产出入库管理系统(二)
SpringBoot+Vue打造资产出入库管理系统
1120 2
|
JavaScript
vue中使用aplayer插件做一个网页音乐播放器
vue中使用aplayer插件做一个网页音乐播放器
1312 0
|
10月前
|
人工智能 搜索推荐 程序员
当AI学会“跨界思考”:多模态模型如何重塑人工智能
当AI学会“跨界思考”:多模态模型如何重塑人工智能
1381 120
|
10月前
|
网络协议 Java Maven
多模块项目使用ElasticSearch报错
多模块项目使用ElasticSearch报错
335 9
|
11月前
|
存储 网络协议 算法
ISIS协议详解
ISIS协议是一种链路状态路由协议,广泛用于大规模网络中。它最初基于OSI模型设计,后经扩展支持TCP/IP协议。ISIS通过SPF算法计算最短路径,使用NSAP地址进行设备寻址,具备灵活的区域划分和分层结构。协议通过L1、L2及L1/2路由器实现区域内部与骨干区域的通信,支持P2P和广播网络类型,具备邻接建立、LSDB同步、路由计算等核心机制,广泛应用于运营商和企业骨干网中。
|
安全 Linux 网络安全
CentOS9忘记root账号密码
通过以上步骤,你可以成功重置CentOS 9系统中的root密码。如果在操作过程中遇到问题,建议查阅相关文档或联系系统管理员进行进一步排查和处理。
1333 9
|
机器学习/深度学习 缓存 数据可视化
[Linformer]论文实现:Linformer: Self-Attention with Linear Complexity
[Linformer]论文实现:Linformer: Self-Attention with Linear Complexity
1139 1
[Linformer]论文实现:Linformer: Self-Attention with Linear Complexity
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
Nacos配置中心
1264 1
Nacos配置中心
|
算法 UED 开发者
🚀短链(Short Link):发展动态与工具推荐🚀
短链是将冗长的URL通过特定算法压缩成简短的字符串,便于用户在社交媒体和营销活动中分享。短链不仅美化了链接,还提升了用户体验,并具有易于传播和跟踪分析的优势。本文介绍了短链的作用、发展历程,以及在goo.gl退出后,推荐的替代工具如Dub.co,帮助用户继续享受短链带来的便利与营销价值。
1944 1
🚀短链(Short Link):发展动态与工具推荐🚀
|
消息中间件 存储 分布式计算
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
519 4