获取GOES卫星数据的经纬度

news2024/9/21 19:34:59

GOES卫星产品没有提供经纬度,需要单独计算,这个代码提供了GOES-16卫星获取经纬度的方法uba/goes-latlon: Python script that can be used to generate latitude/longitude coordinates for GOES-16 full-disk extent. (github.com)

但该方法仅支持GOES-16卫星,笔者以GOES-18为例进行了扩展。经纬度获取是通过投影参数获得,知道其他卫星的投影参数(下面是GOES-18卫星)可以修改以下变量仿照扩展:

G16Proj4String = '+proj=geos +h=35786023.0 \
    +a=6378137.0 +b=6356752.31414 +f=0.00335281068119356027 \
    +lat_0=0.0 +lon_0=-137.0 +sweep=x +no_defs'

扩展后的goesproj.py代码是:

# FROM: https://github.com/uba/goes-latlon/blob/main/goesproj.py
# MIT License
# Copyright (c) 2022 Douglas Uba
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

__author__ = 'Douglas Uba'
__email__  = 'douglas.uba@inpe.br'

from netCDF4 import Dataset
import numpy as np
import pyproj

# Define KM_PER_DEGREE
KM_PER_DEGREE = 40075.16/360.0

# GOES-16 viewing point (satellite position) height above the Earth
H = 35786023.0  # nf.variables['nominal_satellite_height'][:]

# GOES-16 Spatial Reference System (proj4 format)
G16Proj4String = '+proj=geos +h=35786023.0 \
    +a=6378137.0 +b=6356752.31414 +f=0.00335281068119356027 \
    +lat_0=0.0 +lon_0=-75.0 +sweep=x +no_defs'

# Lat/Lon WGS84 Spatial Reference System (proj4 string format)
LatLonWGS84Proj4String = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'

# GOES-16 Spatial Reference System
G16Proj = pyproj.Proj(G16Proj4String) 

# Lat/Lon WSG84 Spatial Reference System
LatLonWGS84Proj = pyproj.Proj(LatLonWGS84Proj4String)

# Full-disk (FD) properties by resolution (GOES-16)
G16FDNLinesDic = {'0.5' : 21696,    '1.0' : 10848,    '2.0' : 5424, '4.0' : 2712, '10.0' : 1086}
G16FDNColsDic  = {'0.5' : 21696,    '1.0' : 10848,    '2.0' : 5424, '4.0' : 2712, '10.0' : 1086}
G16FDScaleDic  = {'0.5' : 0.000014, '1.0' : 0.000028, '2.0' : 0.000056, '4.0' : 0.000112, '10.0' : 0.000280}
G16FDOffsetDic = {'0.5' : 0.151865, '1.0' : 0.151858, '2.0' : 0.151844, '4.0' : 0.151816, '10.0' : 0.151900}


# update projection params
def update_projection_params(satellite='G16'):
    if satellite == 'G16':
        # pass  # default
        G16Proj4String = '+proj=geos +h=35786023.0 \
            +a=6378137.0 +b=6356752.31414 +f=0.00335281068119356027 \
            +lat_0=0.0 +lon_0=-75.0 +sweep=x +no_defs'
    elif satellite == 'G18':
        # nf.variables['goes_imager_projection']
        G16Proj4String = '+proj=geos +h=35786023.0 \
            +a=6378137.0 +b=6356752.31414 +f=0.00335281068119356027 \
            +lat_0=0.0 +lon_0=-137.0 +sweep=x +no_defs'
    else:
        raise NotImplementedError

    # GOES-16 Spatial Reference System
    G16Proj = pyproj.Proj(G16Proj4String)

    return G16Proj, G16Proj4String


def GetFullDiskInfos(resolution):
    return G16FDNLinesDic[resolution], G16FDNColsDic[resolution], \
        G16FDScaleDic[resolution], G16FDOffsetDic[resolution]


def BuildLatLonGrid(resolution, path=None, satellite='G16'):
    # update projection params by satellite
    G16Proj, G16Proj4String = update_projection_params(satellite=satellite)

    # Get full-disk properties
    nlines, ncols, scale, offset = GetFullDiskInfos(resolution)

    # Create satellite-projection coordinates array
    x = np.arange(0, ncols)
    y = np.arange(0, nlines)

    # Apply scale and offset (scanning angle) + H factor = projection coordinates
    x = ((x * scale) - offset) * H
    y = ((y * (-1 * scale)) + offset) * H

    # Create matrix with values
    x, y = np.meshgrid(x, y)

    # Reshape to vector (1-d)
    x = x.reshape(nlines * ncols)
    y = y.reshape(nlines * ncols)

    # Transform
    transformer = pyproj.Transformer.from_proj(G16Proj, LatLonWGS84Proj) # source -> from
    lon, lat = transformer.transform(x, y)

    # Reshape to matrix format
    lat = lat.reshape(nlines, ncols)
    lon = lon.reshape(nlines, ncols)

    lat = np.ma.masked_invalid(lat)
    lon = np.ma.masked_invalid(lon)

    # Export [lat, lon] to file, if requested
    if(path):
        export2file(lat, lon, path)

    return lat, lon


def getScaleOffset(values, n):
    # From: http://james.hiebert.name/blog/work/2015/04/18/NetCDF-Scale-Factors.html
    # stretch/compress data to the available packed range
    max = np.max(values); min = np.min(values)
    scale = (max - min)/(2**n - 1)
    # translate the range to be symmetric about zero
    offset = min + 2**(n - 1) * scale
    return (scale, offset)


def pack(values, scale, offset):
    return np.floor((values - offset)/scale)


def export2file(lat, lon, path):
    nc = Dataset(path, 'w', format='NETCDF4');
    nc.createDimension('size', lat.shape[0])
    latvar = nc.createVariable('lat', 'i2', ('size', 'size'), zlib=True) # i2 -> int16
    lonvar = nc.createVariable('lon', 'i2', ('size', 'size'), zlib=True) # i2 -> int16
    # Pack data using scale and offset
    lat_scale, lat_offset = getScaleOffset(lat, 16) # 16 -> int16 = i2
    lon_scale, lon_offset = getScaleOffset(lon, 16) # 16 -> int16 = i2
    lat_packed = pack(lat, lat_scale, lat_offset)
    lon_packed = pack(lon, lon_scale, lon_offset)
    latvar[:] = lat_packed.astype(np.int16)
    lonvar[:] = lon_packed.astype(np.int16)
    # Adjust meta-data info
    latvar.scale_factor = lat_scale; latvar.add_offset = lat_offset
    lonvar.scale_factor = lon_scale; lonvar.add_offset = lon_offset
    nc.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高算力芯片的发展

最近参与了2024年北京AI芯片峰会,虽然是讲AI芯片,但因为目前算力主要讲的是智能算力,所以,针对高算力芯片的发展趋势有重点的讲解。之前没有很系统关注这块,这次算是做了全面了解。下面,借用峰会的一些内容…

九章云极DataCanvas公司荣获2024年服贸会“科技创新服务示范案例”

9月15日,2024年中国国际服务贸易交易会(服贸会)示范案例交流会暨颁奖典礼在北京国家会议中心举行,九章云极DataCanvas 公司自研的DataCanvas Alaya NeW智算操作系统凭借卓越的AI创新实力、前瞻性的市场布局以及突破性的技术革新成…

uniapp中使用echarts 完整步骤,包括报错以及解决方案

在我们日常可能会有小程序中要使用echarts,我今天总结了一下整个引入的步骤 首先echarts - DCloud 插件市场在插件市场里面导入进项目,我这边用的是vue3的以及主要开发小程序,就直接放我的案例了 按照上面的步骤,在样式部分这样…

javaseday28 IO

IO流 IO流;存储和读取数据的解决方案。 纯文本文件:Windows自带的记事本打开能读懂的文件,word和Excel不是纯文本文件,txt和md是纯文本文件。 小结 IO流体系 FileOutputStream public class Demo1 {public static void main(String[] args)…

【学习笔记】 使用AD24完成相同电路的自动布线布局(相同模块布局布线ROOM布线快速克隆)

【学习笔记】 使用AD24完成相同电路的自动布线布局 一、适用基本条件二、基于ROOM的自动布局/布线的方法三、可能出现的报错四、ROOM自动布局的一些优点和缺点 当面对多个相同电路模块时,使用 ROOM 可以一次性对一个模块进行精心布局,然后将该布局快速复…

2024 研究生数学建模竞赛(C题)建模秘籍|数据驱动下磁性元件的磁芯损耗建模|文章代码思路大全

铛铛!小秘籍来咯! 小秘籍团队独辟蹊径,运用数据拟合,方差分析(ANOVA),特征提取,多目标优化等强大工具,构建了这一题的详细解答哦! 为大家量身打造创新解决方案…

vs2022快捷键异常不起作用解决办法

安装了新版本的vs2022,安装成功后,发现快捷键发生异常,之前常用的快捷键要么发生改变,要么无法使用,比如原来注释代码的快捷键是ctrlec,最新安装版本变成了ctrlkc,以前编译代码的快捷键是F6或者…

go webapi上传文件 部属到linux

go厉害的地方,linux服务器上无需安装任务依赖就可以运行,大赞! 一、编译 #在Goland中cmd中执行 go env -w GOARCHamd64 go env -w GOOSlinux go build main.go # 切换回来 否则无法运行 go env -w GOOSwindows go run main.go 拷贝到linux服…

ubuntu如何进行自动mount硬盘(简易法)

1. 找到你ubuntu的disk工具 2. 选中你要mount的盘 3. 点击那个设置按钮 4. 选择edit mount options 5. disable user session defaults 6, 填写Mount Point就可以了, 最后输入一次密码,重启设备就搞定了

DOG:知识图谱大模型问答的迭代交互式推理,克服长路径和假阳性关系挑战

DOG:知识图谱大模型问答的迭代交互式推理,克服长路径和假阳性关系挑战 秒懂大纲提出背景解法拆解全流程优化和医学关系 创意 秒懂大纲 ├── DoG框架【主题】 │ ├── 背景【研究背景】 │ │ ├── LLMs的局限性【问题描述】 │ │ │ …

pgvector docker版安装;稀疏向量使用;psycopg2 python连接使用

参看: https://cloud.tencent.com/developer/article/2359831 https://hub.docker.com/r/pgvector/pgvector/tags https://github.com/pgvector/pgvector 一、安装 拉取0.7版本 docker pull pgvector/pgvector:0.7.4-pg16运行: docker run --name pgvector -v $(pwd)/dat…

OpenLayers 开源的Web GIS引擎 - 地图初始化

在线引用&#xff1a; 地址&#xff1a;OpenLayers - Get the Code 离线引用&#xff1a; 下载地址&#xff1a;Releases openlayers/openlayers GitHub v10.0.0版本 地图初始化代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><…

Spring Boot 入门:解锁 Spring 全家桶

前言 Spring 全家桶是现代 Java 开发者不可或缺的工具集&#xff0c;它提供了从轻量级的框架到微服务架构的完整支持。本文将带你快速了解 Spring 框架、核心概念如 IoC&#xff08;控制反转&#xff09;和 AOP&#xff08;面向切面编程&#xff09;&#xff0c;并深入介绍 Sp…

Java项目实战II基于Java+Spring Boot+MySQL的网上租贸系统设计与实现(开发文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 "随着…

hpux B.11.31 安装 JDK(详细步骤、多图预警)

目录 零、测试环境 一、获取 JDK 安装包 二、安装 JDK 1、操作指南 2、安装流程 &#xff08;1&#xff09;选中 Java JDK &#xff08;2&#xff09;&#xff08;可选&#xff09;选择安装目录 &#xff08;3&#xff09;点击安装 &#xff08;4&#xff09;&#xf…

CefSharp_Vue交互(Element UI)_WinFormWeb应用(4)--- 最小化最大化关闭窗体交互(含示例代码)

一、效果预览 实现功能,通过vue页面模仿窗体的三个功能按钮实现最小化最大化关闭功能 1.1 预览 1.2 代码 页面代码

【Linux】简易日志系统

目录 一、概念 二、可变参数 三、日志系统 一、概念 一个正在运行的程序或系统就像一个哑巴&#xff0c;一旦开始运行我们很难知晓其内部的运行状态。 但有时在程序运行过程中&#xff0c;我们想知道其内部不同时刻的运行结果如何&#xff0c;这时一个日志系统可以有效的帮…

【算法】2022年第十三届蓝桥杯大赛软件类省赛Java大学C组真题

个人主页&#xff1a;NiKo 算法专栏&#xff1a;算法设计与分析 目录 题目 2680:纸张尺寸 题目 2664:求和 题目 2681: 矩形拼接 题目 2665: 选数异或 题目 2682: GCD 题目 2667: 青蛙过河 题目 2683: 因数平方和 题目 2668: 最长不下降子序列 题目 2680:纸张尺寸 题目…

2024普通高校大学生竞赛

2024年A类竞赛(全国普通高校大学生竞赛)目录 结合A类竞赛目录选择一些大学高质量竞赛 大学生竞赛 大学生竞赛中国国际大学生创新大赛ACM-ICPC国际大学生程序设计竞赛中国大学生计算机设计大赛中国高校计算机大赛蓝桥杯全国软件和信息技术专业人才大赛百度之星程序设计大赛全国…

2016年国赛高教杯数学建模A题系泊系统的设计解题全过程文档及程序

2016年国赛高教杯数学建模 A题 系泊系统的设计 近浅海观测网的传输节点由浮标系统、系泊系统和水声通讯系统组成&#xff08;如图1所示&#xff09;。某型传输节点的浮标系统可简化为底面直径2m、高2m的圆柱体&#xff0c;浮标的质量为1000kg。系泊系统由钢管、钢桶、重物球、…