# How can I extract the satellite longitude and latitude of Sentinel 2 satellite

Hello，
I am currently working on a project related to Sentinel-2 aerosol remote sensing retrieval. The project involves using Sentinel-2 data, the Deep Blue algorithm, and the 6S model to perform aerosol retrieval. In the process of establishing the AOD lookup table, I need to obtain the satellite zenith angle and azimuth angle for each pixel in a Sentinel-2 image.
These two pieces of data require the satellite longitude and latitude for calculation.Therefore, I would like to know how to obtain the satellite longitude and latitude of Sentinel-2 through the Sentinel-2 toolbox. Or do you have any other better methods to obtain the two angle images of each pixel?

Here’s how I get longitude and latitude at a pixel in a Sentinel-2 L2A image file.
Every product comes with an `MTD_MSIL2A.xml` file that contains the UTM coordinates of the upper left corner of the image denoted as `ulx` and `uly`.
Each product tile is notionally 100km x 100km but actually has an encompassing margin of 4.9km,
So given a pixel in the image (`width x height`) at `posX, posY` you can calculate its UTM northing and easting coordinate as:

``````utm_x = Math.floor( ulx + (posX * 109800)/  width ); // 109800 = 100km + 2 margins of 4900 m
utm_y = Math.floor( uly - (posY * 109800)/  height);
``````

Now you can transform those coordinate into lat, lng using the standard code adapted from Open source PHP function for converting UTM coordinates to latitude and longitude? - Stack Overflow here given in javascript:

``````
function UTM2latlng( northing, easting, zone )  //  adapted from https://stackoverflow.com/a/25709233/3507061
{ // zone has postfix N or S for hemisphere - eg 32N or 52S

var FalseNorth = 0.   // South or North?
if ( zone.includes('S') ) FalseNorth = 10000000.  // South or North?
zone = parseInt( zone );

var  d = 0.99960000000000004;
var d1 = 6378137;
var d2 = 0.0066943799999999998;

var  d4 = (1 - Math.sqrt(1-d2))/(1 + Math.sqrt(1 - d2));
var d15 = easting - 500000;
var d16 = northing;
var d11 = ((zone - 1) * 6 - 180) + 3;

var  d3 = d2/(1 - d2);
var d10 = (d16 - FalseNorth ) / d; // 10000000
var d12 = d10 / (d1 * (1 - d2/4 - (3 * d2 *d2)/64 - (5 * Math.pow(d2,3))/256));
var d14 = d12 + ((3*d4)/2 - (27*Math.pow(d4,3))/32) * Math.sin(2*d12) + ((21*d4*d4)/16 - (55 * Math.pow(d4,4))/32) * Math.sin(4*d12)
+ ((151 * Math.pow(d4,3))/96) * Math.sin(6*d12);
var d13 = d14 * 180 / Math.PI;
var  d5 = d1 / Math.sqrt(1 - d2 * Math.sin(d14) * Math.sin(d14));
var  d6 = Math.tan(d14)*Math.tan(d14);
var  d7 = d3 * Math.cos(d14) * Math.cos(d14);
var  d8 = (d1 * (1 - d2))/Math.pow(1-d2*Math.sin(d14)*Math.sin(d14),1.5);

var  d9 = d15/(d5 * d);
var d17 = d14 - ((d5 * Math.tan(d14))/d8)*(((d9*d9)/2-(((5 + 3*d6 + 10*d7) - 4*d7*d7-9*d3)*Math.pow(d9,4))/24)
+ (((61 +90*d6 + 298*d7 + 45*d6*d6) - 252*d3 -3 * d7 *d7) * Math.pow(d9,6))/720);
d17 = d17 * 180 / Math.PI;
var d18 = ((d9 - ((1 + 2 * d6 + d7) * Math.pow(d9,3))/6)
+ (((((5 - 2 * d7) + 28*d6) - 3 * d7 * d7) + 8 * d3 + 24 * d6 * d6) * Math.pow(d9,5))/120)/Math.cos(d14);
d18 = d11 + d18 * 180 / Math.PI;
return [ d17, d18 ];
}
``````

where the function returns an array `[ d17, d18 ]` where `d17` is latitude and `d18` longitude.

The calculation of azumith and zenith angles is not as simple as you seem to think. The values are, however, available. See the Sentinel-2 Products Specification Document (S2-PDGS-TAS-DI-PSD-V14.9.pdf): Geometric_Info/Granule_Position provides azimuth and zenith.

The question was about satellite position, not ground pixel position.