from textwrap import dedent 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))