Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- Aktif bir aboneliğe sahip bir Azure hesabı. Ücretsiz hesap oluşturma bağlantısını kullanın.
- Azure CLI: Azure CLI'yi yükleme
- En az 3.8 sürümüne sahip bir Python ortamı.
- Microsoft Planetary Computer Pro STAC Genel Bakış bölümünde STAC standardı ve bunun uygulanması hakkında bir miktar aşinalık
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,rasteriovepystac'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)
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.