Geotiff export from HDF

Use this Forum to find information on, or ask a question about, NASA Earth Science data.
Post Reply
googlecolab2023
Posts: 4
Joined: Sun Nov 24, 2024 3:06 am America/New_York
Answers: 0

Geotiff export from HDF

by googlecolab2023 » Wed Nov 27, 2024 7:52 am America/New_York

Hi. My code is
#!/usr/bin/env python
# coding: utf-8

import os
import re
import numpy as np
import pandas as pd
from pyhdf.SD import SD, SDC
import rasterio
from rasterio.transform import from_origin

# Define file path
file_path = r"C:\Users\Utel\Downloads\x\MOD09GA.A2024328.h22v06.061.2024329014416.NRT.hdf"

# Read HDF file
hdf = SD(file_path, SDC.READ)

# Extract datasets
datasets = hdf.datasets().keys()

# Get bounding box coordinates
bounding_objects = ["NORTHBOUNDINGCOORDINATE", "WESTBOUNDINGCOORDINATE",
"EASTBOUNDINGCOORDINATE", "SOUTHBOUNDINGCOORDINATE"]

# Initialize bounding coordinates
bounding_coordinates = {}
for bounding_object in bounding_objects:
match = re.search(rf"OBJECT={bounding_object}(.*?)END_OBJECT={bounding_object}",
getattr(hdf, "ArchiveMetadata.0").replace(" ", ""), re.DOTALL)

if match:
value = re.search(r'VALUE=([\d.]+)', match.group(1)).group(1)
bounding_coordinates[bounding_object] = float(value)

# Read the dataset
dataset = hdf.select("sur_refl_b05_1")

# Get dataset attributes
dataset_attributes = dataset.attributes()
scale_factor = dataset_attributes["scale_factor"]
add_offset = dataset_attributes["add_offset"]
fill_value = dataset_attributes["_FillValue"]

# Get dimensions
num_columns = len(dataset.get())
num_rows = len(dataset[0])

# Define bounding box
left_x = bounding_coordinates["WESTBOUNDINGCOORDINATE"]
right_x = bounding_coordinates["EASTBOUNDINGCOORDINATE"]
lower_y = bounding_coordinates["SOUTHBOUNDINGCOORDINATE"]
upper_y = bounding_coordinates["NORTHBOUNDINGCOORDINATE"]

# Define scale
scale_x = (right_x - left_x) / num_columns
scale_y = (upper_y - lower_y) / num_rows

# Generate coordinate arrays
lon = np.linspace(left_x, right_x, num_columns)
lat = np.linspace(lower_y, upper_y, num_rows)

# Create the coordinate grid and invert latitude
lon, lat = np.meshgrid(lon, lat[::-1]) # Invert lat during meshgrid creation

# Flatten the dataset and replace fill values with NaN
dataset = dataset[:, :].astype(np.double)
dataset[np.isin(dataset, [fill_value])] = np.nan

# Convert the dataset from digital to analytical
dataset = (dataset - add_offset) * scale_factor

# Export to GeoTIFF
output_tiff_path = r"C:\Users\Utel\Downloads\output_dataset.tif"
transform = from_origin(left_x, upper_y, scale_x, scale_y) # top-left corner and pixel sizes

with rasterio.open(
output_tiff_path,
'w',
driver='GTiff',
height=num_rows,
width=num_columns,
count=1,
dtype='float64', # or np.float32 based on your data type
crs='EPSG:4326', # or your specific CRS
transform=transform,
) as dst:
dst.write(dataset, 1) # write the dataset to the first band

print(f"GeoTIFF saved to {output_tiff_path}")
while the output should be oblique I wanna be like wgs84.

Filters:

LP DAAC - dgolon
User Services
User Services
Posts: 88
Joined: Tue Dec 03, 2024 2:37 pm America/New_York
Answers: 0
Has thanked: 23 times
Been thanked: 2 times

Re: Geotiff export from HDF

by LP DAAC - dgolon » Thu Dec 05, 2024 9:23 am America/New_York

I believe your questions has been answered by the HDF Group here: viewtopic.php?t=6218 but let us know if you have any follow on questions. Thanks -- Danielle
Subscribe to the LP DAAC listserv by sending a blank email to lpdaac-join@lists.nasa.gov.

Sign up for the Landsat listserv to receive the most up to date information about Landsat data: https://public.govdelivery.com/accounts/USDOIGS/subscriber/new#tab1.

Post Reply