oxigdal-metadata 0.1.4

Metadata standards support for OxiGDAL - ISO 19115, FGDC, INSPIRE, DataCite, DCAT
Documentation
# oxigdal-metadata

Comprehensive metadata standards support for OxiGDAL.

## Overview

This crate provides Pure Rust implementations of multiple geospatial and data catalog metadata standards:

- **ISO 19115** - Geographic Information - Metadata (ISO 19115:2014)
- **FGDC** - Federal Geographic Data Committee (FGDC-STD-001-1998)
- **INSPIRE** - EU INSPIRE Directive metadata requirements
- **DataCite** - DOI metadata for research data (Schema 4.4)
- **DCAT** - W3C Data Catalog Vocabulary (v3)

## Features

- **Metadata Extraction** - Extract metadata from GeoTIFF, NetCDF, HDF5, and STAC
- **Validation** - Comprehensive validation with quality scoring
- **Transformation** - Convert between different metadata standards
- **Serialization** - XML and JSON support
- **Pure Rust** - No external dependencies on C/Fortran libraries

## Usage

### ISO 19115 Metadata

```rust
use oxigdal_metadata::iso19115::*;
use oxigdal_metadata::common::BoundingBox;

let metadata = Iso19115Metadata::builder()
    .title("Sentinel-2 Level-2A")
    .abstract_text("Atmospherically corrected satellite imagery")
    .keywords(vec!["satellite", "sentinel-2", "optical"])
    .bbox(BoundingBox::new(-10.0, 5.0, 35.0, 45.0))
    .build()?;

// Export to XML
let xml = metadata.to_xml()?;

// Validate
let validation = validate::validate_iso19115(&metadata)?;
println!("Quality score: {}", validation.quality_score);
```

### FGDC Metadata

```rust
use oxigdal_metadata::fgdc::*;

let metadata = FgdcMetadata::builder()
    .title("Digital Elevation Model")
    .abstract_text("30-meter resolution DEM")
    .purpose("Terrain analysis and visualization")
    .keywords("Elevation", vec!["DEM", "elevation", "terrain"])
    .build()?;
```

### DataCite Metadata

```rust
use oxigdal_metadata::datacite::*;

let metadata = DataCiteMetadata::builder()
    .identifier("10.5281/zenodo.123456", IdentifierType::Doi)
    .creator(Creator::new("Smith, John"))
    .title("Research Dataset")
    .publisher("Zenodo")
    .publication_year(2024)
    .resource_type(ResourceTypeGeneral::Dataset)
    .build()?;
```

### Metadata Transformation

```rust
use oxigdal_metadata::transform;

// Transform ISO 19115 to FGDC
let fgdc = transform::iso19115_to_fgdc(&iso_metadata)?;

// Transform DataCite to ISO 19115
let iso = transform::datacite_to_iso19115(&datacite_metadata)?;
```

### Metadata Extraction

```rust
use oxigdal_metadata::extract;

// Extract from file
let metadata = extract::extract_metadata("data.tif")?;

// Convert to ISO 19115
let iso = extract::to_iso19115(&metadata)?;

// Custom extractor
let extractor = extract::MetadataExtractor::new()
    .with_spatial(true)
    .with_temporal(true)
    .with_max_keywords(10);

let metadata = extractor.extract("data.nc")?;
```

## Standards Compliance

### ISO 19115:2014

Implements core metadata elements including:
- Citation and responsible party information
- Data identification and classification
- Spatial and temporal extent
- Distribution and quality information
- Reference system information

### FGDC CSDGM

Implements FGDC-STD-001-1998 including:
- Identification information
- Data quality information
- Spatial data organization
- Spatial reference information
- Entity and attribute information
- Distribution information

### INSPIRE

Implements EU INSPIRE Directive requirements:
- Resource locators
- Unique resource identifiers
- Conformity declarations
- Service metadata
- All 34 INSPIRE themes (Annex I, II, III)

### DataCite

Implements DataCite Metadata Schema 4.4:
- DOI registration metadata
- Creator and contributor information
- Resource type and classification
- Related identifiers
- Geo-location support

### DCAT

Implements W3C DCAT v3:
- Dataset and catalog descriptions
- Distribution information
- Data services
- RDF/JSON-LD serialization

## Validation

All metadata standards include comprehensive validation:

```rust
use oxigdal_metadata::validate;

let report = validate::validate_iso19115(&metadata)?;

if !report.is_valid {
    println!("Errors: {:?}", report.errors);
}

println!("Missing fields: {:?}", report.missing_fields());
println!("Quality score: {}/100", report.quality_score);
println!("Completeness: {}%", report.completeness);
```

## License

Apache-2.0

## Copyright

Copyright (c) 2024 COOLJAPAN OU (Team Kitasan)