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

本文涉及的产品
云原生网关 MSE Higress,422元/月
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 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 编辑


目录
相关文章
|
10月前
|
人工智能 小程序 Android开发
鸿蒙应用开发从入门到入行 - 篇1:HarmonyOS介绍——带你深入理解鸿蒙特性
本文介绍了华为的HarmonyOS(鸿蒙系统),这是一个面向全场景的分布式操作系统,不仅适用于手机和平板,还支持电脑、车机、手表、电视等多种设备。文章详细解析了鸿蒙系统的三大特性:一次开发多端部署、可分可合自由流转、统一生态原生智能,并分析了鸿蒙系统为何能蚕食安卓市场份额的原因。猫林老师认为,鸿蒙凭借其先进的技术和国内政策支持,有望在未来的市场中占据重要地位。最后,文章提供了学习鸿蒙系统的建议和一些课后练习,帮助读者更好地理解和掌握这一系统。
1202 7
鸿蒙应用开发从入门到入行 - 篇1:HarmonyOS介绍——带你深入理解鸿蒙特性
|
3月前
|
存储 Java 区块链
Springboot应用开发:工具类整理
在实际的Springboot应用开发中,有很多类可作为工具类,这些类将实际开发中可能用到的重复性代码进行提取,方便在后续的开发中使用,在这里我对在开发中经常用到的工具类进行整理,方便自己之后查找,同时希望可以帮助到有实现相关功能的朋友。
196 0
|
3月前
|
存储 Java API
小试牛刀-SpringBoot集成SOL链
java工程师:如何在java/springboot中使用solana区块链呢?不用担心,现在solanaj来了!
74 0
|
3月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
667 13
|
3月前
|
算法 关系型数据库 Java
Springboot集成PostGIS完成路径规划
因为公司里需要做关于林区防火方面的项目,需要完成着火后山区路径的导航,但.....某德的功能似乎只能到达山区的边上,后边的路就需要自己完成导航了。搞了一个周终于有所效果了,也遇见了很多的坑,在此记录一下,希望以后不要踩坑。需要上述的环境才能进行路径导航,环境的搭建可以参阅
89 5
|
3月前
|
监控 Java 开发工具
Springboot秒集成-视频推拉流
在工作中需要用到视频的推拉流服务,刚开始准备使用netty服务自己实现RTSP推拉流服务,但在RTSP解包时卡住,自己实现难度确实有点大,后来在网上找到了Zlm4j库,它是基于ZLMediaKit服务实现的Jna版本,可以很容易的集成到Springboot中,在此也。希望本篇博客可以帮助到想快速实现视频推拉流服务的朋友。
325 10
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习模型、算法与应用的全方位解析
深度学习,作为人工智能(AI)的一个重要分支,已经在多个领域产生了革命性的影响。从图像识别到自然语言处理,从语音识别到自动驾驶,深度学习无处不在。本篇博客将深入探讨深度学习的模型、算法及其在各个领域的应用。
481 3
|
3月前
|
安全 Java 数据安全/隐私保护
Springboot应用开发-SpringBootSecurity
Spring Boot Security 是 Spring 提供的安全框架,集成了身份认证和授权功能,帮助开发者快速构建安全的应用程序。本篇博客将从功能介绍到配置和实践,带您全面了解 Spring Boot Security。
702 1
Springboot应用开发-SpringBootSecurity
|
3月前
|
传感器 定位技术 数据格式
常用通信协议及数据格式
常用通信协议和格式总结
287 2
|
3月前
|
IDE Java 开发工具
IntelliJ IDEA 使用技巧与插件推荐
IntelliJ IDEA 是一个功能强大、扩展性丰富的开发工具。通过掌握常用的快捷键和技巧,结合合适的插件,可以大幅提升你的开发效率。
137 2