问题
I have points defined by pixel coordinates in a .geotiff imagesat.
I am trying to convert these pixel coordinates into longitude and latitude.
At first a tried to adapt the given code from the inverse question i previously asked here
def pixel_to_world(geo_matrix, x, y):
ul_x = geo_matrix[0]
ul_y = geo_matrix[3]
x_dist = geo_matrix[1]
y_dist = geo_matrix[5]
_x = x * x_dist + ul_x
_y = y * y_dist + ul_y
return (_x, _y)
def build_transform_inverse(dataset, EPSG):
source = osr.SpatialReference(wkt=dataset.GetProjection())
target = osr.SpatialReference()
target.ImportFromEPSG(4326)
return osr.CoordinateTransformation(source, target)
def find_spatial_coordinate_from_pixel(dataset, transform, x, y):
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(float(x), float(y))
point.Transform(transform)
return pixel_to_world(dataset.GetGeoTransform(), point.GetX(), point.GetY())
ds = gdal.Open(source_directory_path + filename)
_t = build_transform_inverse(ds, 4326)
coordinates = find_spatial_coordinate_from_pixel(ds, _t, point[0], point[1])
But my final coordinates are incorrect, i get something like (-1528281.9351183572, 1065990.778732022) instead of (-13.728790283203121, 9.531686027524676) with
ul_x = -1528281.943533814,
ul_y = 1065990.7964650677,
x_dist = 0.5970709765586435,
y_dist = -0.5972870511184641
I also tried the rasterio approach like :
import rasterio
with rasterio.open('path/to/file.tiff') as map_layer:
pixels2coords = map_layer.xy(2679,2157)
print(pixels2coords)
Witch fails to return a proper long lat coordinate couple ( it returns (-1526993.7629018887, 1064390.365811596) ).
What am i doing wrong ?
回答1:
You have flipped the order in which you convert between pixels, projected coordinates and lat longs. You are doing the order pixels -> lat lngs -> projected
it should be pixels -> projected -> lat lngs
.
The following should work
from osgeo import osr, ogr, gdal
def pixel_to_world(geo_matrix, x, y):
ul_x = geo_matrix[0]
ul_y = geo_matrix[3]
x_dist = geo_matrix[1]
y_dist = geo_matrix[5]
_x = x * x_dist + ul_x
_y = y * y_dist + ul_y
return _x, _y
def build_transform_inverse(dataset, EPSG):
source = osr.SpatialReference(wkt=dataset.GetProjection())
target = osr.SpatialReference()
target.ImportFromEPSG(EPSG)
return osr.CoordinateTransformation(source, target)
def find_spatial_coordinate_from_pixel(dataset, transform, x, y):
world_x, world_y = pixel_to_world(dataset.GetGeoTransform(), x, y)
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(world_x, world_y)
point.Transform(transform)
return point.GetX(), point.GetY()
ds = gdal.Open(source_directory_path + filename)
_t = build_transform_inverse(ds, 4326)
coordinates = find_spatial_coordinate_from_pixel(ds, _t, point[0], point[1])
print(coordinates)
In find_spatial_coordinate_from_pixel
i have flipped the order, such that pixel_to_world
is now called first, before the coordinate transformation.
来源:https://stackoverflow.com/questions/59052516/find-lat-long-coordinates-from-pixel-point-in-geotiff-using-python-and-gdal