'UTM to WGS 84 conversion issue

I am trying to use ESRI latest land use data and downloaded a tif image from https://www.arcgis.com/apps/instant/media/index.html?appid=fc92d38533d440078f17678ebc20e8e2 for example, shown here https://lulctimeseries.blob.core.windows.net/lulctimeseriespublic/lc2021/16R_20210101-20220101.tif enter image description here

When I load the image to ArcGIS pro, the longitude between A and B (corners) is 6 degrees, which is expected. The tif image is in WGS84/UTM 16N projection. I want to be able to find longitude and latitude of each pixels on the tif file, so I converted it to WGS 84 coordinate. However, after I converted it (by GDAL and ArcGIS), the longitude span between A and B is larger than 6 degrees. It looks like the transformer treat each grid on the image as equal distance instead of equal longitude/latitude. Am I doing something wrong here?

def wgs_transformer(img):
  """Giving geoio image, return two transformers from image crs to wgs84 and wgs84 to image crs
    They can be used to translate between pixels and lat/long
  """
  assert isinstance(img, geoio.base.GeoImage), 'img is not geoio.base.GeoImage type object'
  old_cs= osr.SpatialReference()
  old_cs.ImportFromWkt(img.ds.GetProjectionRef())
  # create the new coordinate system
  new_cs = osr.SpatialReference()
  new_cs.ImportFromEPSG(4326)
  # create a transform object to convert between coordinate systems
  transform_img_wgs = osr.CoordinateTransformation(old_cs,new_cs)
  transform_wgs_img = osr.CoordinateTransformation(new_cs, old_cs)
  return transform_img_wgs, transform_wgs_img

def pixels_to_latlong(img, px, py, transform, arr=None, return_band=False):
  """Giving pixels x, y cordinates, return latitude and longitude
    Args:
      img: geoio.base.GeoImage 
      px: float, x cordinate
      py: float, y cordinate
      transfrom: osgeo.osr.CoordinateTransformation
      arr: np array, band info of the img 
      return_band: bool, if Ture, return band info for the pixel
    Returns:
      latitude, longitude
  """
  assert isinstance(img, geoio.base.GeoImage), 'img is not geoio.base.GeoImage type object'
  assert isinstance(transform, osgeo.osr.CoordinateTransformation), 'transform has to be osgeo.osr.CoordinateTransformation object'
  band, width, height = img.shape
  assert 0 <= px < width and 0 <= py < height, f'px {px}, py {py} are beyond the img shape ({width}, {height})'
  if return_band:
    assert isinstance(arr, np.ndarray), 'arr needs to be numpy.ndarray'
  lat, long, _ = transform.TransformPoint(*img.raster_to_proj(px, py))
  if return_band:
    band_val = arr[py-1, px-1]
    return lat, long, band_val
  else:
    return lat, long, 0


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source