# GRID DEFINITION Space view, perspective or orthographic

# grib 1 -> 2
constant gridDefinitionTemplateNumber     = 90;

unsigned[2] Nx : dump;
alias numberOfPointsAlongXAxis = Nx;
alias Ni = Nx;
alias geography.Nx=Nx;

unsigned[2] Ny : dump;
alias numberOfPointsAlongYAxis = Ny;
alias Nj = Ny;
alias geography.Ny=Ny;

signed[3] latitudeOfSubSatellitePoint ;
meta geography.latitudeOfSubSatellitePointInDegrees  scale(latitudeOfSubSatellitePoint,oneConstant,grib1divider,truncateDegrees) : dump;
alias Lap=latitudeOfSubSatellitePoint;

signed[3] longitudeOfSubSatellitePoint ;
meta geography.longitudeOfSubSatellitePointInDegrees  scale(longitudeOfSubSatellitePoint,oneConstant,grib1divider,truncateDegrees) : dump;
alias Lop=longitudeOfSubSatellitePoint;

include "grib1/resolution_flags.def";

unsigned[3] dx : dump;
alias geography.dx=dx;

unsigned[3] dy : dump;
alias geography.dy=dy;

unsigned[2] XpInGridLengths : dump;
alias geography.XpInGridLengths=XpInGridLengths;

unsigned[2] YpInGridLengths : dump;
alias geography.YpInGridLengths=YpInGridLengths;

include "grib1/scanning_mode.def";

unsigned[3] orientationOfTheGrid : edition_specific ;
meta geography.orientationOfTheGridInDegrees  scale(orientationOfTheGrid,oneConstant,grib1divider,truncateDegrees) : dump;

unsigned[3] Nr : edition_specific,can_be_missing,no_copy;
alias altitudeOfTheCameraFromTheEarthsCentreMeasuredInUnitsOfTheEarthsRadius = Nr;
meta geography.NrInRadiusOfEarth scale(Nr,oneConstant,oneMillionConstant,truncateDegrees) : dump;
alias NrInRadiusOfEarthScaled=NrInRadiusOfEarth;

unsigned[2] Xo : dump;
alias xCoordinateOfOriginOfSectorImage=Xo;
alias geography.Xo=Xo;

unsigned[2] Yo : dump;
alias yCoordinateOfOriginOfSectorImage=Yo;
alias geography.Yo=Yo;

#Ce Length is normally 32 + stretched and/or rotated
#Ce parameters + vertical coordinate parameters + list of
#Ce numbers of points.
#Ce (Lambert conformal and Mercator are 42 octets in length,
#Ce while Space view is 40 for ECMWF (44 in GRIB specification)
if ( centre != 98 ) {
  pad padding_grid90_1(6);
}

meta numberOfDataPoints number_of_points(Ni,Nj,PLPresent,pl) : dump;
alias numberOfPoints=numberOfDataPoints;
meta numberOfValues number_of_values(values,bitsPerValue,numberOfDataPoints,bitmapPresent,bitmap,numberOfCodedValues) : dump;
#alias ls.valuesCount=numberOfValues;

iterator space_view(numberOfPoints, missingValue, values, radius,
          earthIsOblate,
          earthMajorAxis, earthMinorAxis,
          Nx, Ny,
          latitudeOfSubSatellitePointInDegrees,
          longitudeOfSubSatellitePointInDegrees,
          dx, dy, XpInGridLengths, YpInGridLengths,
          orientationOfTheGridInDegrees,
          NrInRadiusOfEarthScaled, Xo, Yo,
          iScansNegatively, jScansPositively,
          jPointsAreConsecutive, alternativeRowScanning);

nearest space_view(values,radius,Nx,Ny);

meta latLonValues latlonvalues(values);
alias latitudeLongitudeValues=latLonValues;
meta latitudes latitudes(values,0);
meta longitudes longitudes(values,0);
meta distinctLatitudes latitudes(values,1);
meta distinctLongitudes longitudes(values,1);
