EOX GitLab Instance

Skip to content
Snippets Groups Projects
gsc_generator.py 6.19 KiB
Newer Older
from osgeo import gdal


def positions_to_poslist(positions, projection):
    # TODO: maybe reproject if not lat, lon
    return ' '.join([
        ' '.join(pair)
        for pair in positions
    ])


def positions_from_corners(low, high):
    minx, miny = low
    maxx, maxy = high

    return [
        (minx, miny),
        (maxx, miny),
        (maxx, maxy),
        (minx, maxy),
        (minx, minx),
    ]


def get_footprint_from_browse(data_file, browse):
    btype = browse['browse_type']

    if btype == 'rectified_browse':
        low, high = browse['rectified']['coord_list']
        positions = positions_from_corners(low, high)

    elif btype == 'footprint_browse':
        positions = browse['footprint']
    elif btype == 'model_in_geotiff_browse':
        ds = gdal.Open(data_file)
        gt = ds.GetGeoTransform()
        width, height = ds.RasterXSize, ds.RasterXSize

        low = (gt[0], gt[3] + gt[5] * height)
        high = (gt[0] + gt[1] * width, gt[3])

        positions = positions_from_corners(low, high)

    elif btype == 'regular_grid_browse':
        raise NotImplementedError('Regular grid browses are not supported')

    return positions_to_poslist(
        positions,
        browse['reference_system_identifier'],
    )


def generate_gsc_metadata(metadata):
    return dedent("""\
        <?xml version='1.0' encoding='UTF-8'?>
        <gsc:report xmlns:sar="http://earth.esa.int/sar"
            xmlns:gml="http://www.opengis.net/gml"
            xmlns:eop="http://earth.esa.int/eop"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:opt="http://earth.esa.int/opt"
            xmlns:gsc="http://earth.esa.int/gsc"
            xmlns:atm="http://earth.esa.int/atm"
            xmlns:xlink="http://www.w3.org/1999/xlink" version="2.0">
            <gsc:responsibleOrgName>EOX</gsc:responsibleOrgName>
            <gsc:reportType>CIRCULATION</gsc:reportType>
            <gsc:dateTime>{now_time}</gsc:dateTime>
            <gsc:orderReference></gsc:orderReference>
            <gsc:opt_metadata version="1.2.1">
                <gml:metaDataProperty>
                <gsc:EarthObservationMetaData>
                    <eop:identifier>{identifier}</eop:identifier>
                    <!--<eop:parentIdentifier>D2_MG2b_FRTX_004a/other/FRSC_0059_001/SpotImage</eop:parentIdentifier>-->
                    <eop:acquisitionType>NOMINAL</eop:acquisitionType>
                    <eop:productType>{product_type}</eop:productType>
                    <eop:status>ARCHIVED</eop:status>
                    <eop:archivedIn>
                        <eop:ArchivingInformation>
                            <eop:archivingCenter>CDS</eop:archivingCenter>
                            <eop:archivingDate>{archiving_time}</eop:archivingDate>
                        </eop:ArchivingInformation>
                    </eop:archivedIn>
                    <gsc:deliveryInfo>
                        <gsc:deliveryDateTime>{delivery_time}</gsc:deliveryDateTime>
                        <gsc:deliveryMethod>ELECTRONIC</gsc:deliveryMethod>
                    </gsc:deliveryInfo>
                </gsc:EarthObservationMetaData>
                </gml:metaDataProperty>
                <gml:validTime>
                    <gml:TimePeriod>
                        <gml:beginPosition>{begin_time}</gml:beginPosition>
                        <gml:endPosition>{end_time}</gml:endPosition>
                    </gml:TimePeriod>
                </gml:validTime>
                <gml:using>
                    <!--<eop:EarthObservationEquipment>
                        <eop:platform>
                            <eop:Platform>
                                <eop:shortName>PH1A</eop:shortName>
                                <eop:serialIdentifier>1A</eop:serialIdentifier>
                            </eop:Platform>
                        </eop:platform>
                        <eop:instrument>
                            <eop:Instrument>
                                <eop:shortName>HR</eop:shortName>
                            </eop:Instrument>
                        </eop:instrument>
                        <eop:sensor>
                            <eop:Sensor>
                                <eop:sensorType>OPTICAL</eop:sensorType>
                                <eop:operationalMode>FUS</eop:operationalMode>
                                <eop:resolution uom="m">0.5</eop:resolution>
                            </eop:Sensor>
                        </eop:sensor>
                        <eop:acquisitionParameters>
                            <opt:Acquisition>
                                <eop:orbitNumber>118</eop:orbitNumber>
                                <eop:orbitDirection>DESCENDING</eop:orbitDirection>
                                <eop:acrossTrackIncidenceAngle uom="deg">-4.070247073869651</eop:acrossTrackIncidenceAngle>
                                <eop:alongTrackIncidenceAngle uom="deg">2.304231907410827</eop:alongTrackIncidenceAngle>
                                <opt:illuminationAzimuthAngle uom="deg">164.3516878667332</opt:illuminationAzimuthAngle>
                            </opt:Acquisition>
                        </eop:acquisitionParameters>
                    </eop:EarthObservationEquipment>-->
                </gml:using>
                <gml:target>
                    <eop:Footprint>
                        <gml:multiExtentOf>
                            <gml:MultiSurface srsName="EPSG:4326">
                                <gml:surfaceMembers>
                                    <gml:Polygon>
                                        <gml:exterior>
                                            <gml:LinearRing>
                                                <gml:posList>{footprint}</gml:posList>
                                            </gml:LinearRing>
                                        </gml:exterior>
                                    </gml:Polygon>
                                </gml:surfaceMembers>
                            </gml:MultiSurface>
                        </gml:multiExtentOf>
                    </eop:Footprint>
                </gml:target>
                <gml:resultOf/>
            </gsc:opt_metadata>
        </gsc:report>""".format(**metadata))