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

目录

一、简介

二、准备工作

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>

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

}

四、代码资源

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盹猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值