Skip to content

Commit

Permalink
Align with stactools (#163)
Browse files Browse the repository at this point in the history
* align Sentinel-1 & Sentinel-2

* small adapt Landast

* housekeeping

* not overwrite ENVs

* more house-keeping

* added LANDSAT_PROVIDER

* removed projection & sar extension

* change name of default

* updated CHANGELOG
  • Loading branch information
fwfichtner authored Mar 9, 2022
1 parent 88ffe16 commit 4e7af2d
Show file tree
Hide file tree
Showing 10 changed files with 83 additions and 33 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/pythonapp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: ukis-pysat

on:
push:
branches: [ master ]
branches: [ main ]
pull_request:
branches: [ master ]
branches: [ main ]

jobs:
build:
Expand Down
6 changes: 5 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
Changelog
=========
[] ()
[1.4.0] (2022-03-09)
---------------------
Changed
^^^^^^^
- Sentinel items closer to standards of stactools #155

Deleted
^^^^^
- removed own stac api client (pystac-client should be used from now on)
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ pystac[validation]>=1.0.0
python-dateutil
requests
sentinelsat>=1.0.1
shapely~=1.7.1
shapely
pydantic

## raster
Expand Down
3 changes: 1 addition & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

from setuptools import setup, find_packages


with open(r"README.md", encoding="utf8") as f:
long_description = f.read()

Expand Down Expand Up @@ -55,7 +54,7 @@ def get_version(rel_path):
"pyproj>=3.0.0",
"requests_mock",
"utm>=0.7.0",
"sphinx >= 1.3",
"sphinx>=1.3",
"sphinx_rtd_theme",
]
)
Expand Down
14 changes: 7 additions & 7 deletions tests/test_data.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import unittest
from datetime import datetime
from pathlib import Path
from tempfile import gettempdir

import pystac
import requests_mock
from shapely.geometry import Polygon
from datetime import datetime
import os
from pkg_resources import resource_filename
from shapely.geometry import Polygon

from ukis_pysat._landsat import Product, meta_from_pid, compute_md5
from ukis_pysat.data import Source
from ukis_pysat.members import Datahub, Platform, Bands

os.environ["EARTHEXPLORER_USER"] = "Tim"
os.environ["EARTHEXPLORER_PW"] = "TheEnchanter"
os.environ["SCIHUB_USER"] = "Tim"
os.environ["SCIHUB_PW"] = "TheEnchanter"
# os.environ["EARTHEXPLORER_USER"] = "Tim"
# os.environ["EARTHEXPLORER_PW"] = "TheEnchanter"
# os.environ["SCIHUB_USER"] = "Tim"
# os.environ["SCIHUB_PW"] = "TheEnchanter"

catalog_path = Path(__file__).parents[0] / "testfiles" / "catalog.json"
target_dir = Path(__file__).parents[0] / "testfiles"
Expand Down
1 change: 1 addition & 0 deletions tests/test_raster.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from rasterio.coords import BoundingBox
from rasterio.transform import from_bounds
from shapely.geometry import box

from ukis_pysat.members import Platform
from ukis_pysat.raster import Image

Expand Down
2 changes: 1 addition & 1 deletion ukis_pysat/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.3.4"
__version__ = "1.4.0"
43 changes: 24 additions & 19 deletions ukis_pysat/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@
from pathlib import Path

from dateutil.parser import parse
from pystac.extensions.projection import ProjectionExtension
from pystac.extensions.sar import SarExtension

from ukis_pysat import utils
from ukis_pysat._landsat import Product

from ukis_pysat.utils import SENTINEL_PROVIDER, LANDSAT_PROVIDER

try:
import numpy as np
Expand All @@ -18,7 +21,7 @@
from PIL import Image
from pystac.extensions import sat
from pystac.extensions.eo import EOExtension
from pystac.extensions.sat import SatExtension
from pystac.extensions.sat import SatExtension, OrbitState
from shapely import geometry, wkt, ops
from shapely.geometry import shape, mapping
except ImportError as e:
Expand Down Expand Up @@ -223,18 +226,17 @@ def construct_metadata(self, meta, platform):
"end_datetime": meta["stop_time"].astimezone(tz=datetime.timezone.utc).isoformat(),
},
)
EOExtension.add_to(item)
SatExtension.add_to(item)
eo_ext = EOExtension.ext(item)
sat_ext = SatExtension.ext(item)
# extensions
sat_ext = SatExtension.ext(item, add_if_missing=True)
relative_orbit = int(f"{meta['wrs_path']}{meta['wrs_row']}")
sat_ext.apply(orbit_state=sat.OrbitState.DESCENDING, relative_orbit=relative_orbit)

eo_ext = EOExtension.ext(item, add_if_missing=True)
if "cloudCover" in meta:
eo_ext.cloud_cover = round(float(meta["cloud_cover"]), 2)

item.common_metadata.platform = platform.value

relative_orbit = int(f"{meta['wrs_path']}{meta['wrs_row']}")
sat_ext.apply(orbit_state=sat.OrbitState.DESCENDING, relative_orbit=relative_orbit)
# common
item.common_metadata.providers = [LANDSAT_PROVIDER]

else: # Scihub
item = pystac.Item(
Expand All @@ -254,21 +256,24 @@ def construct_metadata(self, meta, platform):
.astimezone(tz=datetime.timezone.utc)
.isoformat(),
},
stac_extensions=[],
)
EOExtension.add_to(item)
SatExtension.add_to(item)
eo_ext = EOExtension.ext(item)
sat_ext = SatExtension.ext(item)

# extensions
sat_ext = SatExtension.ext(item, add_if_missing=True)
sat_ext.apply(
orbit_state=OrbitState[meta["properties"]["orbitdirection"].upper()], # for enum key to work
relative_orbit=int(meta["properties"]["orbitnumber"]),
)

eo_ext = EOExtension.ext(item, add_if_missing=True)
if "cloudcoverpercentage" in meta["properties"]:
eo_ext.cloud_cover = round(float(meta["properties"]["cloudcoverpercentage"]), 2)

item.common_metadata.platform = platform.value
# common
item.common_metadata.providers = [SENTINEL_PROVIDER]

sat_ext.apply(
orbit_state=sat.OrbitState[meta["properties"]["orbitdirection"].upper()], # for enum key to work
relative_orbit=int(meta["properties"]["orbitnumber"]),
)
item.common_metadata.platform = platform.value

return item

Expand Down
1 change: 1 addition & 0 deletions ukis_pysat/members.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from enum import Enum

from pydantic import BaseModel


Expand Down
40 changes: 40 additions & 0 deletions ukis_pysat/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import pystac
from geojson import Feature
from pystac import ProviderRole
from pystac.extensions.sar import FrequencyBand, SarExtension, Polarization


def fill_sar_ext(sar_ext: SarExtension, meta: Feature):
# Fixed properties
sar_ext.frequency_band = FrequencyBand("C")
sar_ext.center_frequency = 5.405
# rest (like e.g. sar:pixel_spacing_range) cannot be known from API response AFAIK

# Read properties
sar_ext.instrument_mode = meta["properties"]["sensoroperationalmode"]
sar_ext.product_type = meta["properties"]["producttype"]

# TODO maybe this is not good, because we often only use one later on
sar_ext.polarizations = [Polarization(p) for p in meta["properties"]["polarisationmode"].split(" ")]


# constants
SENTINEL_PROVIDER = pystac.Provider(
name="ESA",
roles=[
ProviderRole.PRODUCER,
ProviderRole.PROCESSOR,
ProviderRole.LICENSOR,
],
url="https://earth.esa.int/web/guest/home",
)

LANDSAT_PROVIDER = pystac.Provider(
name="USGS",
roles=[
ProviderRole.PRODUCER,
ProviderRole.PROCESSOR,
ProviderRole.LICENSOR,
],
url="https://earthexplorer.usgs.gov/",
)

0 comments on commit 4e7af2d

Please sign in to comment.