SpatioTemporal Varlık Kataloğu (STAC) öğesi oluşturun

Raster jeo-uzamsal veri varlığı için SpatioTemporal Varlık Kataloğu (STAC) öğesi oluşturmayı öğrenin. Microsoft Planetary Computer Pro GeoCatalog'a yüklenen her jeo-uzamsal veri varlığının ilişkili STAC uyumlu bir öğesi olması gerekir.

Bu kılavuzda:

  • PIP kullanarak gerekli Python kitaplıklarını yükleyin.
  • Sağlanan Python kodunu kullanarak GOES-18 verilerini görüntüleyin ve inceleyin.
  • Normal ifadeleri kullanarak dosya adından meta verileri ayıklayın.
  • kullanarak rio-stacCloud-Optimized GeoTIFF dosyalarından STAC Öğeleri oluşturun.
  • Dosya adından ayıklanan meta verilerle STAC Ögesini geliştirin.
  • STAC Öğesini üst STAC Koleksiyonuna ekleyin.
  • STAC kataloğunu, koleksiyonunu ve öğelerini doğrulayın ve kaydedin.
  • STAC Öğelerini Microsoft Planet Computer Pro'ya ekleyin.

Bu öğretici, kod parçacıkları aracılığıyla özellikleri gösterir ve açıklar; etkileşimli bir not defteri stili deneyimi için bu öğreticiyi Jupyter not defteri olarak indirebilirsiniz.

Önkoşullar

Bu hızlı başlangıcı tamamlamak için şunları yapmanız gerekir:

STAC'nin Temel Özellikleri

SpatioTemporal Varlık Kataloğu (STAC), jeo-uzamsal verilerin yapılandırılması ve paylaşılması için açık bir standarttır. Jeo-uzamsal varlıkları açıklamaya yönelik ortak bir dil ve biçim sağlayarak bu kaynakları farklı platformlarda ve uygulamalarda bulmayı, bunlara erişmeyi ve kullanmayı kolaylaştırır. STAC standardının temel özellikleri şunlardır:

  • Birlikte çalışabilirlik: Standartlaştırılmış JSON tabanlı şema, araçlar ve sistemler arasında kolay tümleştirme ve anlama sağlar.
  • Genişletilebilirlik: Belirli gereksinimler için özel uzantılara sahip esnek çekirdek alanları.
  • Bulunabilirlik: Tutarlı yapı, jeo-uzamsal varlıkların aranmasını ve bulunmasını geliştirir.
  • Erişilebilirlik: Veri varlıklarına doğrudan bağlantılar sorunsuz alma ve tümleştirmeyi kolaylaştırır.
  • Otomasyon: Standartlaştırılmış meta verilerle otomatik işleme ve analiz sağlar.

Meta Verileri Standartlaştırma için STAC'nin Avantajları

  • Veri Türleri Arasında Tutarlılık: Farklı jeo-uzamsal veri türleri için birleşik çerçeve.
  • Gelişmiş İşbirliği: Ortak meta veri biçimiyle paylaşımı ve işbirliğini basitleştirir.
  • Geliştirilmiş Veri Tümleştirmesi: Birden çok kaynaktan veri kümelerinin tümleştirilmesini kolaylaştırır.
  • Kolaylaştırılmış Veri Yönetimi: Otomatik araçlar, meta verilerin korunmasında el ile gerçekleştirilen çabayı azaltır.
  • Geleceğe Uyumluluk: Esnek yapı, yeni veri türlerine ve teknolojilere uyum sağlar.

Microsoft Planetary Computer Pro (MC Pro), veri kümeleri arasında birlikte çalışabilirlik sağlamak için temel dizinleme standardı olarak STAC kullanır. Bu öğreticide kullanıcılara ortak açık kaynak kitaplıklarını kullanarak sıfırdan STAC Öğeleri oluşturma gösterilmektedir.

STAC Öğe Belirtimi, STAC Öğelerinin nasıl oluşturulduğunu ve doldurulması gereken minimum meta verileri ayrıntılarıyla açıklar. STAC, kullanıcıların meta verilerin bir parçası olarak hangi verileri eklemek istediklerine karar vermelerini sağlayan esnek bir standarttır. Meta verilerin bir STAC Öğesini doldurmak için kullanılabilir olması veri varlığında, bir yan dosyada (.XML, .JSON, .TXT vb.) veya dosya adları gibi konumlarda bile olabilir. Kullanıcılar, gelecekte hangi meta verilerin dahil edilmesi gerektiğine karar verirken kullanıcıların aramak ve sıralamak isteyebileceği meta veri türlerini dikkate almalıdır.

Bu öğreticide, Ulusal Okyanus ve Atmosfer Dairesi (NOAA) Jeostationary Operasyonel Çevre Uydu R (GOES-R) uydularının Land Surface Temperature (LST) veri kümesinden alınan bulut için iyileştirilmiş GeoTIFF (COG) görüntü verilerini kullanır. Bu veriler açık Planetary Computer'a COG dosyaları olarak dahil edilir, ancak STAC meta verileri eksiktir. GOES uyduları birçok veri ürünü üretir. Daha fazla ayrıntı GOES-R Serisi Ürün Tanımı ve Kullanıcıları Kılavuzu'nda bulunabilir.

Bu öğreticide kullanılan işlem, anahtar meta veri alanlarının birkaç açık kaynak kitaplık kullanılarak numaralandırıldığı her tür veri için genelleştirilebilir.

Python kitaplıklarını yükleme

Başlamak için PIP kullanarak gerekli Python kitaplıklarını yükleyeceğiz:

  • rasterio: Bu paket jeo-uzamsal raster verilerini okumak ve yazmak için kullanılır. GeoTIFF gibi raster veri biçimleriyle çalışmaya yönelik araçlar sağlar.

  • pystac: Bu paket, STAC standardıyla çalışmak için kullanılır. STAC meta verilerini oluşturmaya, okumaya ve işlemeye yönelik araçlar sağlar.

  • rio-stac: Bu paket, rasterio ve pystac'yi tümleştirerek raster verilerinden STAC Öğeleri oluşturur. Tarama veri kümeleri için STAC meta verileri oluşturma işlemini basitleştirir.

  • matplotlib: Bu kitaplık görselleştirmeler ve çizimler oluşturmak için kullanılır. Jeo-uzamsal veriler bağlamında, kullanıcıların STAC meta verilerini oluşturmadan önce verileri görsel olarak incelemesine olanak tanıyarak tarama görüntülerinin işlenmesine ve görüntülenmesine yardımcı olur.

  • azure-storage-blob: Bu Azure Depolama istemci kitaplığı, Azure Blob Depolama hizmetlerine erişim sağlar. Bulutta depolanan jeo-uzamsal verilerle doğrudan etkileşime olanak tanıyarak kullanıcıların azure blob kapsayıcılarında depolanan dosyaları indirmeden okumasına ve bunlarla çalışmasına olanak tanır.

!pip install rasterio pystac rio_stac matplotlib azure-storage-blob 

Kodun sonraki bölümünde açık Planetary Computer'dan bazı GOES-18 verileri görüntülenir. GOES-R Advanced Baseline Imager Level 2 Land Surface Temperature - CONUS veri kümesini ve 2023'ün 208. gününden rastgele bir dosya seçiyoruz.

# Import Necessary Libraries 
import requests
from azure.storage.blob import ContainerClient
import matplotlib.pyplot as plt
from rasterio.io import MemoryFile
import os
from urllib.parse import urlparse

# Function to get the SAS token
def get_sas_token(endpoint):
    response = requests.get(endpoint)
    if response.status_code == 200:
        data = response.json()
        return data.get("token")
    else:
        raise Exception(f"Failed to get SAS token: {response.status_code} - {response.text}")

# Define Azure Blob Storage parameters
storage_account_name = "goeseuwest"
container_name = "noaa-goes-cogs"
blob_domain = f"https://{storage_account_name}.blob.core.windows.net"
sas_endpoint = f"https://planetarycomputer.microsoft.com/api/sas/v1/token/{storage_account_name}/{container_name}/"


# Get the SAS token
sas_token = get_sas_token(sas_endpoint)

# Construct the container URL with the SAS token
container_url = f"{blob_domain}/{container_name}?{sas_token}"

# Create a ContainerClient
container_client = ContainerClient.from_container_url(container_url)

# Define data you want, this can be changed for other datasets that are in storage in the open Planetary Computer
satellite = "goes-18"      # The specific GOES satellite (GOES-18, also known as GOES-West)
product = "ABI-L2-LSTC"    # The data product type (Advanced Baseline Imager Level 2 Land Surface Temperature - CONUS)
year = "2023"              # The year the data was collected
day_of_year = "208"        # The day of year (DOY) - day 208 corresponds to July 27, 2023

# Construct the directory path
directory_path = f"{satellite}/{product}/{year}/{day_of_year}/"

# Get just the first blob by using next() and limiting the iterator

first_blob = next(container_client.list_blobs(name_starts_with=directory_path))

# Function to read and display a .tif file from a URL
def display_tif_from_url(url, title):
    response = requests.get(url, stream=True)
    if response.status_code == 200:
        with MemoryFile(response.content) as memfile:
            with memfile.open() as dataset:
                plt.figure(figsize=(10, 10))
                plt.imshow(dataset.read(1), cmap='gray')
                plt.title(title)
                plt.colorbar()
                plt.show()
    else:
        raise Exception(f"Failed to read .tif file: {response.status_code} - {response.text}")

# Create the URL for the blob using the container_url components
file_url = f"{blob_domain}/{container_name}/{first_blob.name}?{sas_token}"

# Extract the filename safely from the URL without the SAS token
parsed_url = urlparse(file_url)
path = parsed_url.path  # Gets just the path portion of the URL
filename = os.path.basename(path)  # Get just the filename part

# Remove .tif extension if present
file_name = filename.replace('.tif', '')

print(f"Extracted File Name: {file_name}")

display_tif_from_url(file_url, file_name)

BIR GOES-18 uydusundan alınan jeo-uzamsal raster verilerinin gri tonlamalı görselleştirmesi, bir bölgedeki kara yüzeyi sıcaklık desenlerini gösterir.

Verilere ve dosya adına baktığımızda STAC Öğesini oluşturmak için gereken önemli meta veri parçalarını zaten görebiliriz. Dosya adı, verileri hangi uydunun yakaladığı ve ne zaman yakalandığı hakkında bilgi içerir.

Örnek için, ürün kılavuzuna bağlı olarak dosya adı OR_ABI-L2-LSTC-M6_G18_s20232080101177_e20232080103550_c20232080104570_DQF şeklindedir. Bu, şu anlama gelir:

Ayrıntılı Bileşenler

Alan Açıklama Amaç
VEYA İşletim sistemi ortamı Verilerin toplandığı sistem ortamını belirtir
ABI Gelişmiş Temel Görüntüleyicisi aracı Verileri yakalamak için kullanılan aracı tanımlar
L2 Düzey 2 ürünü (türetilmiş ürün) Verilerin ham gözlemlerden işlenen türetilmiş bir ürün olduğunu gösterir
LSTC Kara Yüzey Sıcaklığı (Açık Gökyüzü) ürünü Açık gökyüzü koşullarında kara yüzeyi sıcaklığına odaklanan belirli ürün türünü temsil eder
M6 Mod 6 taraması (Tam Disk taraması) Tarama modunu açıklar ve Dünya'nın tam diskini kapsar
G18 GOES-18 uydu (GOES-Westolarak da bilinir) Verilerin toplandığı uyduyu tanımlar

Gözlem Süresi Ayrıntıları

Gözlem Başlangıcı (s20232080201177)-

Alan Açıklama Amaç
Yıl 2023 Gözlemin yılını belirtir
Yılın Günü İki yüz sekiz Gözlemin başladığı yılın gününü gösterir
Zaman 02:01:17 UTC Gözlemin UTC ile başladığı zamanı tam olarak sağlar
Saniyenin Onda Biri 7 Gözlemin başlangıç zamanına kesinlik ekler

Gözlem Sonu (e20232080203550)-

Alan Açıklama Amaç
Yıl 2023 Gözlemin yılını belirtir
Yılın Günü İki yüz sekiz Gözlemin sona erdiğini yılın gününü gösterir
Zaman 02:03:55 UTC Gözlemin UTC'de sona erdiği kesin zamanı sağlar.
Saniyenin Onda Biri 0 Gözlemin bitiş zamanına kesinlik ekler

Dosya Oluşturma Zamanı (c20232080204563)-

Alan Açıklama Amaç
Yıl 2023 Dosyanın oluşturulduğu yılı belirtir
Yılın Günü İki yüz sekiz Dosyanın oluşturulduğu yılın gününü gösterir
Zaman 02:04:56 UTC Dosyanın UTC'de tam olarak oluşturulduğu saati sağlar
Saniyenin Onda Biri 3 Dosya oluşturma zamanına kesinlik ekler

Ek bilgi:

Alan Açıklama Amaç
DQF İlgili veriler için kalite bilgilerini gösteren Veri Kalitesi Bayrağı Verilerin kalitesi hakkında bilgi sağlar
.tif Dosya uzantısı Verilerin dosya biçimini gösterir

Aşağıdaki kod, normal ifadeleri (regex) kullanarak bu meta verileri dosya adından ayıklar.

import re
from datetime import datetime, timedelta

def extract_goes_metadata(filename):
    """
    Extracts key metadata from a NOAA GOES satellite filename using regular expressions.

    Args:
        filename (str): The filename to parse.

    Returns:
        dict: A dictionary containing the extracted metadata.
    """

    # Regular expression pattern to match the filename format
    pattern = re.compile(
        r"^(OR)_"  # System (OR)
        r"(ABI)-(L\d)-(LSTC)-(M\d)_"  # Instrument, Level, Product, Mode
        r"(G\d{2})_"  # Satellite (G18)
        r"s(\d{4})(\d{3})(\d{2})(\d{2})(\d{2})(\d)_"  # Start time
        r"e(\d{4})(\d{3})(\d{2})(\d{2})(\d{2})(\d)_"  # End time
        r"c(\d{4})(\d{3})(\d{2})(\d{2})(\d{2})(\d)_"  # Creation time
        r"([A-Z0-9]+)$"  # Data quality flag
    )

    match = pattern.match(filename)

    if not match:
        return None  # Or raise an exception if you prefer

    # Extract all fields from the regular expression match groups
    (
        system,          # Operational system environment
        instrument,      # Advanced Baseline Imager
        level,           # Product level (L2)
        product_type,    # Product type (LSTC - Land Surface Temperature)
        mode,            # Scanning mode (M6)
        satellite,       # Satellite identifier (G18)
        s_year, s_doy, s_hour, s_minute, s_second, s_tenth,  # Start time components
        e_year, e_doy, e_hour, e_minute, e_second, e_tenth,  # End time components
        c_year, c_doy, c_hour, c_minute, c_second, c_tenth,  # Creation time components
        data_quality_flag  # Quality flag indicator
    ) = match.groups()

    def parse_goes_time(year, doy, hour, minute, second, tenth):
        """Parses GOES time components into an ISO format string."""
        try:
            dt = datetime(int(year), 1, 1) + timedelta(
                days=int(doy) - 1,
                hours=int(hour),
                minutes=int(minute),
                seconds=int(second),
                microseconds=int(tenth) * 100000,
            )
            return dt
        except ValueError:
            return None

    # Parse the time components into datetime objects
    start_time = parse_goes_time(s_year, s_doy, s_hour, s_minute, s_second, s_tenth)
    end_time = parse_goes_time(e_year, e_doy, e_hour, e_minute, e_second, e_tenth)
    creation_time = parse_goes_time(c_year, c_doy, c_hour, c_minute, c_second, c_tenth)

    # Create a dictionary to organize all extracted metadata
    metadata = {
        "system": system,               # Operational system environment (e.g., "OR" for operational)
        "instrument": instrument,       # Instrument used to capture data (e.g., "ABI" for Advanced Baseline Imager)
        "level": level,                 # Processing level of the data (e.g., "L2" for Level 2)
        "product_type": product_type,   # Type of product (e.g., "LSTC" for Land Surface Temperature Clear Sky)
        "mode": mode,                   # Scanning mode (e.g., "M6" for Mode 6, full disk scan)
        "satellite": satellite,         # Satellite identifier (e.g., "G18" for GOES-18)
        "start_time": start_time,       # Observation start time as datetime object
        "end_time": end_time,           # Observation end time as datetime object
        "creation_time": creation_time, # File creation time as datetime object
        "data_quality_flag": data_quality_flag,  # Quality flag for the data (e.g., "DQF")
    }

    return metadata


# Example usage:
print(file_name)
metadata_from_filename = extract_goes_metadata(file_name)
print(metadata_from_filename)
OR_ABI-L2-LSTC-M6_G18_s20232080001177_e20232080003550_c20232080004568_DQF
{'system': 'OR', 'instrument': 'ABI', 'level': 'L2', 'product_type': 'LSTC', 'mode': 'M6', 'satellite': 'G18', 'start_time': datetime.datetime(2023, 7, 27, 0, 1, 17, 700000), 'end_time': datetime.datetime(2023, 7, 27, 0, 3, 55), 'creation_time': datetime.datetime(2023, 7, 27, 0, 4, 56, 800000), 'data_quality_flag': 'DQF'}

Cloud-Optimized GeoTIFF Dosyalarından STAC Öğeleri Oluşturma

Aşağıdaki kod bloğu, Cloud-Optimized GeoTIFF (COG) dosyalarından STAC Öğeleri oluşturmayı otomatikleştirmek için rio-stac kitaplığını kullanır.

Bir COG dosyasına işaret edildiğinde uzamsal sınırlar, rio-stac projeksiyon bilgileri ve raster özellikleri gibi temel meta verileri otomatik olarak ayıklar ve standart bir STAC biçiminde düzenler. Kütüphane, GeoTIFF'den gömülü teknik meta verileri okuma görevini üstlenir ve STAC uyumlu alanlara dönüştürür, aşağıdakiler de dahil olmak üzere:

  • Geometri
  • Sınırlayıcı Kutu (bbox)
  • Projeksiyon Ayrıntıları
  • Raster Özellikleri
  • STAC Uzantıları

Bu otomasyon, geçerli STAC Öğeleri oluşturmak için gereken el ile çalışmayı önemli ölçüde azaltır ve meta verilerde tutarlılık sağlar

Uyarı

GeoCatalog,STAC Öğe Kimliklerinde ve Varlık anahtarlarında kullanılabilecek karakterlerle ilgili sınırlamalara sahiptir. Kimliklerinizin şu karakterleri içermediğinden emin olun: -, _, +, (, )ve .. Bu karakterleri dosya adlarınızda değiştirmek veya kaldırmak için oluşturma mantığını değiştirmeniz item_id gerekebilir.

from rio_stac import create_stac_item
from rasterio.io import MemoryFile
import json
from urllib.parse import urlparse, unquote

def create_stac_item_from_cog(url):
    """
    Create a basic STAC Item for GOES data using rio-stac with proper spatial handling
    
    Args:
        url (str): URL to the COG file
        
    Returns:
        pystac.Item: STAC Item with basic metadata and correct spatial information
    """
    
    # Extract the filename safely from the URL
    parsed_url = urlparse(url)
    path = parsed_url.path  # Gets just the path portion of the URL
    filename = os.path.basename(path)  # Get just the filename part
    
    # Remove .tif extension if present
    item_id = filename.replace('.tif', '')
    
    response = requests.get(url, stream=True)
    if response.status_code == 200:
        with MemoryFile(response.content) as memfile:
            with memfile.open() as dataset:
                # Create base STAC item from rasterio dataset calling create_stac_item from rio_stac
                stac_item = create_stac_item(
                    source=dataset,  # The rasterio dataset object representing the COG file
                    id=item_id,  # Generate a unique ID by extracting the filename without the .tif extension
                    asset_name='data',  # Name of the asset, indicating it contains the primary data
                    asset_href=url,  # URL to the COG file, used as the asset's location
                    with_proj=True,  # Include projection metadata (e.g., CRS, bounding box, etc.)
                    with_raster=True,  # Include raster-specific metadata (e.g., bands, resolution, etc.)
                    properties={
                        'datetime': None,  # Set datetime to None since explicit start/end times may be added later
                        # Add rasterio-specific metadata for the raster bands
                        'raster:bands': [
                            {
                                'nodata': dataset.nodata,  # Value representing no data in the raster
                                'data_type': dataset.dtypes[0],  # Data type of the raster (e.g., uint16)
                                'spatial_resolution': dataset.res[0]  # Spatial resolution of the raster in meters
                            }
                        ],
                        'file:size': len(response.content)  # Size of the file in bytes
                    },
                    extensions=[
                        'https://stac-extensions.github.io/file/v2.1.0/schema.json'  # Add the file extension schema for additional metadata
                    ]
                )
                
                return stac_item
    else:
        raise Exception(f"Failed to read .tif file: {response.status_code} - {response.text}")

# Example usage
sas_token = get_sas_token(sas_endpoint) # refresh the SAS token prior to creating STAC item
# Create file URL using the first_blob variable that's already defined
file_url = f"{blob_domain}/{container_name}/{first_blob.name}?{sas_token}"
# Create STAC item for the first blob
stac_item = create_stac_item_from_cog(file_url)

# Print the STAC item as JSON
print(json.dumps(stac_item.to_dict(), indent=2))
    {
      "type": "Feature",
      "stac_version": "1.0.0",
      "stac_extensions": [
        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
        "https://stac-extensions.github.io/raster/v1.1.0/schema.json"
      ],
      "id": "OR_ABI-L2-LSTC-M6_G18_s20232080001177_e20232080003550_c20232080004568_DQF",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              -161.57885623466754,
              14.795666555826678
            ],
            [
              -112.42114380921453,
              14.79566655500485
            ],
            [
              -89.5501123912648,
              53.52729778421186
            ],
            [
              175.5501122574517,
              53.52729779865781
            ],
            [
              -161.57885623466754,
              14.795666555826678
            ]
          ]
        ]
      },
      "bbox": [
        -161.57885623466754,
        14.79566655500485,
        175.5501122574517,
        53.52729779865781
      ],
      "properties": {
        "datetime": "2025-03-26T14:46:05.484602Z",
        "raster:bands": [
          {
            "nodata": 65535.0,
            "data_type": "uint16",
            "spatial_resolution": 2004.017315487541
          }
        ],
        "file:size": 118674,
        "proj:epsg": null,
        "proj:geometry": {
          "type": "Polygon",
          "coordinates": [
            [
              [
                -2505021.6463773525,
                1583173.791653181
              ],
              [
                2505021.6423414997,
                1583173.791653181
              ],
              [
                2505021.6423414997,
                4589199.764884492
              ],
              [
                -2505021.6463773525,
                4589199.764884492
              ],
              [
                -2505021.6463773525,
                1583173.791653181
              ]
            ]
          ]
        },
        "proj:bbox": [
          -2505021.6463773525,
          1583173.791653181,
          2505021.6423414997,
          4589199.764884492
        ],
        "proj:shape": [
          1500,
          2500
        ],
        "proj:transform": [
          2004.017315487541,
          0.0,
          -2505021.6463773525,
          0.0,
          -2004.017315487541,
          4589199.764884492,
          0.0,
          0.0,
          1.0
        ],
        "proj:wkt2": "PROJCS[\"unnamed\",GEOGCS[\"unknown\",DATUM[\"unnamed\",SPHEROID[\"Spheroid\",6378137,298.2572221]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]]],PROJECTION[\"Geostationary_Satellite\"],PARAMETER[\"central_meridian\",-137],PARAMETER[\"satellite_height\",35786023],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],EXTENSION[\"PROJ4\",\"+proj=geos +lon_0=-137 +h=35786023 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs +sweep=x\"]]"
      },
      "links": [],
      "assets": {
        "data": {
          "href": "https://goeseuwest.blob.core.windows.net/noaa-goes-cogs/goes-18/ABI-L2-LSTC/2023/208/00/OR_ABI-L2-LSTC-M6_G18_s20232080001177_e20232080003550_c20232080004568_DQF.tif?st=2025-03-25T14%3A46%3A03Z&se=2025-03-26T15%3A31%3A03Z&sp=rl&sv=2024-05-04&sr=c&skoid=9c8ff44a-6a2c-4dfb-b298-1c9212f64d9a&sktid=72f988bf-86f1-41af-91ab-2d7cd011db47&skt=2025-03-26T12%3A41%3A49Z&ske=2025-04-02T12%3A41%3A49Z&sks=b&skv=2024-05-04&sig=BuMxN2NUTdrhzY7Dvpd/X4yfX8gnFpHOzANHQLkKE1k%3D",
          "type": "image/tiff; application=geotiff",
          "raster:bands": [
            {
              "data_type": "uint16",
              "scale": 1.0,
              "offset": 0.0,
              "sampling": "area",
              "nodata": 65535.0,
              "unit": "1",
              "statistics": {
                "mean": 2.780959413109756,
                "minimum": 0,
                "maximum": 3,
                "stddev": 0.710762086175375,
                "valid_percent": 100.0
              },
              "histogram": {
                "count": 11,
                "min": 0.0,
                "max": 3.0,
                "buckets": [
                  26655,
                  0,
                  0,
                  25243,
                  0,
                  0,
                  7492,
                  0,
                  0,
                  570370
                ]
              }
            }
          ],
          "roles": []
        }
      }
    }

rio-stac'tan STAC öğesi JSON

Rio-stac kitaplığı GOES COG dosyasını okur ve anahtar meta verilerini otomatik olarak ayıklar.

Buna ek olarak, dahil edilen meta verilerin türüne bağlı olarak, rio-stac ilgili STAC Uzantılarını ekledi. STAC Uzantıları standartlaştırılmış, etki alanına özgü meta veriler ekleyerek temel belirtimi geliştirir.

  • Dosya Uzantısı , boyut ve sağlama toplamı gibi temel dosya meta verileri sağlar.
  • Projeksiyon Uzantısı koordinat sistemleri ve sınırlayıcı kutular da dahil olmak üzere uzamsal başvuru bilgilerini yakalar.
  • Raster Uzantısı , bant bilgileri ve uzamsal çözünürlük gibi raster verilerine özgü özellikleri standartlaştırır.

Aşağıdaki tablolar, rio-stac tarafından bulunan tüm meta verilerin açıklamasını sağlar.

Çekirdek Alanlar

Alan Açıklama Amaç
tür Her Zaman "Özellik" Türü GeoJSON Özelliği olarak tanımlar
stac_version 1.0.0 STAC standart sürümünü belirtir
kimlik Benzersiz tanımlayıcı Uydu, ürün ve zaman bilgilerini içerir
stac_extensions Şema URL'lerinin listesi Ek meta veri alanlarını tanımlar

Uzamsal Bilgiler

Alan Açıklama Amaç
geometri GeoJSON poligon WGS84 koordinatlarında veri ayak izini tanımlar
bbox Sınırlayıcı kutu koordinatları Hızlı filtreleme için basit uzamsal kapsam sağlar
proj:geometry Projeksiyona özgü çokgen Yerel projeksiyon koordinatlarındaki ayak izi
proj:bbox Özgün projeksiyon sınırları Uydu koordinat sisteminde uzamsal kapsam
proje:şekil [1500, 2500] Piksel cinsinden görüntü boyutları
proj:dönüştür Affine dönüşümü Pikseli koordinat uzayına haritalandırır
proj:wkt2 İyi Bilinen Metin Tam projeksiyon tanımı
proj:epsg sıfır Bu harita projeksiyonu için standart EPSG kodu yok

Zamana Bağlı Bilgiler

Alan Açıklama Amaç
tarih/zaman Oluşturulma zamanı Bu STAC öğesi oluşturulduğunda

Raster Bilgileri

Alan Açıklama Amaç
raster:bantlar Bant nesneleri dizisi Raster veri özelliklerini açıklar
veri_tipi "uint16" Piksel veri türü
→ mekansal çözünürlük 2004.02m Yer örneği uzaklığı
→ ölçeği/uzaklığı Dönüştürme faktörleri Piksel değerlerini fiziksel birimlere dönüştürür (Kelvin)
→ veri yok 65535.0 Veri temsil eden değer
→ istatistikleri İstatistiksel özet Veri dağıtım bilgileri sağlar
histogram Değer dağılımı Veri dağıtımlarını görselleştirir

Varlık Bilgileri

Alan Açıklama Amaç
varlıklar.veri Ana veri varlığı Gerçek veri dosyasını gösterir
→ href URL Cloud-Optimized GeoTIFF konumu
→ türü Medya türü Dosya biçimini tanımlar

Dosya Meta Verileri

Alan Açıklama Amaç
Dosya boyutu 943.250 bayt Veri dosyasının boyutu

Dosya Adı'ndan meta verileri ekleme

Ardından, bu STAC Öğesinin meta verilerini doldurmayı tamamlamak için dosya adında bulduğumuz verileri ekleyeceğiz.

Dikkat etmeniz gereken bir şey, STAC Öğeleri için tüm tarih saatlerinin ISO 8601'e uygun olması gerektiğidir. PySTAC kitaplığı, verilerin doğru biçimlendirilmesini sağlayan bir datetime_to_str işlevine sahiptir.

import pystac

def enhance_stac_item_with_metadata(stac_item, metadata_from_filename):
    """
    Enhances a STAC Item with additional metadata from GOES filename.
    
    Args:
        stac_item (pystac.Item): Existing STAC Item created by rio-stac
        metadata_from_filename (dict): Metadata extracted from filename
        
    Returns:
        pystac.Item: Enhanced STAC Item
    """
    # Add satellite/sensor properties to the STAC item
    stac_item.properties.update({
        'platform': f"GOES-{metadata_from_filename['satellite'][1:]}",
        'instruments': [metadata_from_filename['instrument']],
        'constellation': 'GOES'
    })
    
    # Add temporal properties to the STAC item, use pystac to ensure time conforms to ISO 8601
    stac_item.datetime = None  # Clear the default datetime
    stac_item.properties.update({
        'start_datetime': pystac.utils.datetime_to_str(metadata_from_filename['start_time']),
        'end_datetime': pystac.utils.datetime_to_str(metadata_from_filename['end_time']),
        'created': pystac.utils.datetime_to_str(metadata_from_filename['creation_time'])
    })
    
    # Add GOES-specific properties to the STAC item
    stac_item.properties.update({
        'goes:system': metadata_from_filename['system'],
        'goes:level': metadata_from_filename['level'],
        'goes:product_type': metadata_from_filename['product_type'],
        'goes:mode': metadata_from_filename['mode'],
        'goes:processing_level': metadata_from_filename['level'],
        'goes:data_quality_flag': metadata_from_filename['data_quality_flag']
    })
    
    return stac_item


# Example usage in new cell
stac_item = enhance_stac_item_with_metadata(stac_item, metadata_from_filename)
print(json.dumps(stac_item.to_dict(), indent=2))

STAC öğesi:

    {
      "type": "Feature",
      "stac_version": "1.0.0",
      "stac_extensions": [
        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
        "https://stac-extensions.github.io/raster/v1.1.0/schema.json"
      ],
      "id": "OR_ABI-L2-LSTC-M6_G18_s20232080001177_e20232080003550_c20232080004568_DQF",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              -161.57885623466754,
              14.795666555826678
            ],
            [
              -112.42114380921453,
              14.79566655500485
            ],
            [
              -89.5501123912648,
              53.52729778421186
            ],
            [
              175.5501122574517,
              53.52729779865781
            ],
            [
              -161.57885623466754,
              14.795666555826678
            ]
          ]
        ]
      },
      "bbox": [
        -161.57885623466754,
        14.79566655500485,
        175.5501122574517,
        53.52729779865781
      ],
      "properties": {
        "datetime": null,
        "raster:bands": [
          {
            "nodata": 65535.0,
            "data_type": "uint16",
            "spatial_resolution": 2004.017315487541
          }
        ],
        "file:size": 118674,
        "proj:epsg": null,
        "proj:geometry": {
          "type": "Polygon",
          "coordinates": [
            [
              [
                -2505021.6463773525,
                1583173.791653181
              ],
              [
                2505021.6423414997,
                1583173.791653181
              ],
              [
                2505021.6423414997,
                4589199.764884492
              ],
              [
                -2505021.6463773525,
                4589199.764884492
              ],
              [
                -2505021.6463773525,
                1583173.791653181
              ]
            ]
          ]
        },
        "proj:bbox": [
          -2505021.6463773525,
          1583173.791653181,
          2505021.6423414997,
          4589199.764884492
        ],
        "proj:shape": [
          1500,
          2500
        ],
        "proj:transform": [
          2004.017315487541,
          0.0,
          -2505021.6463773525,
          0.0,
          -2004.017315487541,
          4589199.764884492,
          0.0,
          0.0,
          1.0
        ],
        "proj:wkt2": "PROJCS[\"unnamed\",GEOGCS[\"unknown\",DATUM[\"unnamed\",SPHEROID[\"Spheroid\",6378137,298.2572221]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]]],PROJECTION[\"Geostationary_Satellite\"],PARAMETER[\"central_meridian\",-137],PARAMETER[\"satellite_height\",35786023],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],EXTENSION[\"PROJ4\",\"+proj=geos +lon_0=-137 +h=35786023 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs +sweep=x\"]]",
        "platform": "GOES-18",
        "instruments": [
          "ABI"
        ],
        "constellation": "GOES",
        "start_datetime": "2023-07-27T00:01:17.700000Z",
        "end_datetime": "2023-07-27T00:03:55Z",
        "created": "2023-07-27T00:04:56.800000Z",
        "goes:system": "OR",
        "goes:level": "L2",
        "goes:product_type": "LSTC",
        "goes:mode": "M6",
        "goes:processing_level": "L2",
        "goes:data_quality_flag": "DQF"
      },
      "links": [],
      "assets": {
        "data": {
          "href": "https://goeseuwest.blob.core.windows.net/noaa-goes-cogs/goes-18/ABI-L2-LSTC/2023/208/00/OR_ABI-L2-LSTC-M6_G18_s20232080001177_e20232080003550_c20232080004568_DQF.tif?st=2025-03-25T14%3A46%3A03Z&se=2025-03-26T15%3A31%3A03Z&sp=rl&sv=2024-05-04&sr=c&skoid=9c8ff44a-6a2c-4dfb-b298-1c9212f64d9a&sktid=72f988bf-86f1-41af-91ab-2d7cd011db47&skt=2025-03-26T12%3A41%3A49Z&ske=2025-04-02T12%3A41%3A49Z&sks=b&skv=2024-05-04&sig=BuMxN2NUTdrhzY7Dvpd/X4yfX8gnFpHOzANHQLkKE1k%3D",
          "type": "image/tiff; application=geotiff",
          "raster:bands": [
            {
              "data_type": "uint16",
              "scale": 1.0,
              "offset": 0.0,
              "sampling": "area",
              "nodata": 65535.0,
              "unit": "1",
              "statistics": {
                "mean": 2.780959413109756,
                "minimum": 0,
                "maximum": 3,
                "stddev": 0.710762086175375,
                "valid_percent": 100.0
              },
              "histogram": {
                "count": 11,
                "min": 0.0,
                "max": 3.0,
                "buckets": [
                  26655,
                  0,
                  0,
                  25243,
                  0,
                  0,
                  7492,
                  0,
                  0,
                  570370
                ]
              }
            }
          ],
          "roles": []
        }
      }
    }

STAC Öğesini Koleksiyona Ekleme

MC Pro, tüm STAC Öğelerinin, alındıkları ana STAC Toplama Kimliğine bir referansa sahip olmasını gerektirir. Bu öğreticide STAC Toplama Kimliği, uydunun ve veri ürününün adıdır.

PySTAC ile, STAC Koleksiyonu'nun anahtar alanlarını doldurmak ve yerleşik doğrulama işlevlerini kullanmak için kaynak dosyalardan toplanan meta verilerden bazılarını kullanmak kolaydır.

Aşağıdaki kod, GOES verilerini barındıracak bir üst STAC Koleksiyonu oluşturur. Kod daha sonra bu bilgileri Microsoft Planetary Computer Pro STAC koleksiyonunu oluşturmak ve STAC öğelerini Planetary Computer Pro'ya almak için kullanılan dosyalara kaydeder.

# Define collection properties
collection_id = f"{satellite}-{product}"
collection_title = f"{satellite.upper()} {product} Collection" 
collection_desc = f"Collection of {satellite} {product} Earth observation data"

# Create spatial extent
bbox = [-180, -60, 10, 60]  # placeholder, replace with actual data at a later date
spatial_extent = pystac.SpatialExtent([bbox])

# Create temporal extent, use current date time or replace with existing datetimes in stac_item
start_datetime = datetime.now()
if hasattr(metadata_from_filename, 'get'): 
    if metadata_from_filename.get('start_time'):
        start_datetime = metadata_from_filename.get('start_time')

temporal_extent = pystac.TemporalExtent([[start_datetime, None]])
extent = pystac.Extent(spatial=spatial_extent, temporal=temporal_extent)

# Create the STAC Collection
collection = pystac.Collection(
    id=collection_id,
    description=collection_desc,
    extent=extent,
    title=collection_title,
    license="public-domain",
)

# Add keywords and provider
collection.keywords = ["GOES", "satellite", "weather", "NOAA", satellite, product]
collection.providers = [
    pystac.Provider(
        name="NOAA",
        roles=["producer", "licensor"],
        url="https://www.noaa.gov/"
    )
]

# Create output directories
output_dir = "stac_catalog"
collection_dir = os.path.join(output_dir, collection_id)
items_dir = os.path.join(collection_dir, "items")
os.makedirs(items_dir, exist_ok=True)

# Important: Save the collection first to generate proper file paths
collection_path = os.path.join(collection_dir, "collection.json")
collection.set_self_href(collection_path)

# Extract filename for the item
original_filename = first_blob.name.split('/')[-1]
base_filename = original_filename.replace('.tif', '')
item_path = os.path.join(items_dir, f"{base_filename}.json")

# Set the item's proper href
stac_item.set_self_href(item_path)

# Now associate the item with the collection (after setting hrefs)
collection.add_item(stac_item)

# Create a catalog to contain the collection
catalog = pystac.Catalog(
    id="goes-data-catalog",
    description="GOES Satellite Data Catalog",
    title="GOES Data"
)
catalog_path = os.path.join(output_dir, "catalog.json")
catalog.set_self_href(catalog_path)
catalog.add_child(collection)

# Validate the collection and contained items
print("Validating collection and items...")
try:
    collection.validate_all()
    print("✅ Collection and items validated successfully")
    
    # Save everything to disk
    catalog.normalize_and_save(catalog_path, pystac.CatalogType.SELF_CONTAINED)
    print(f"✅ STAC catalog saved at: {catalog_path}")
    print(f"✅ STAC collection saved at: {collection_path}")
    print(f"✅ STAC item saved at: {item_path}")
    
except Exception as e:
    print(f"❌ Validation error: {str(e)}")
Validating collection and items...
✅ Collection and items validated successfully
✅ STAC catalog saved at: stac_catalog/catalog.json
✅ STAC collection saved at: stac_catalog/goes-18-ABI-L2-LSTC/collection.json
✅ STAC item saved at: stac_catalog/goes-18-ABI-L2-LSTC/items/OR_ABI-L2-LSTC-M6_G18_s20232080001177_e20232080003550_c20232080004568_DQF.json

Sonraki Adımlar

Artık bazı STAC Öğeleri oluşturduğunuza göre, verileri Microsoft Planetary Computer Pro'ya alma zamanı geldi.

Tek Öğe Alımı için:

Toplu İçerme için:

Veri etrafında şablonlar kullanarak daha fazla otomasyon için STAC Forge aracını kullanın.