【问题标题】:Find lat/long coordinates from pixel point in .geotiff using python and gdal使用python和gdal从.geotiff中的像素点查找纬度/经度坐标
【发布时间】:2020-03-21 23:10:39
【问题描述】:

我在 .geotiff imagesat 中有由像素坐标定义的点。

我正在尝试将这些像素坐标转换为经度和纬度。

起初,a 试图从我之前问过的逆向问题中调整给定的代码 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])

但我的最终坐标不正确,我得到类似 (-1528281.9351183572, 1065990.778732022) 而不是 (-13.728790283203121, 9.531686027524676)

ul_x = -1528281.943533814, 
ul_y = 1065990.7964650677, 
x_dist = 0.5970709765586435, 
y_dist = -0.5972870511184641

我也尝试了像这样的光栅方法:

import rasterio

with rasterio.open('path/to/file.tiff') as map_layer:
    pixels2coords = map_layer.xy(2679,2157)
    print(pixels2coords)

Witch 未能返回正确的长纬度坐标对(它返回 (-1526993.7629018887, 1064390.365811596))。

我做错了什么?

【问题讨论】:

    标签: python gdal ogr rasterio


    【解决方案1】:

    您已经颠倒了在像素、投影坐标和经度之间转换的顺序。您正在执行订单pixels -> lat lngs -> projected 它应该是pixels -> projected -> lat lngs

    以下应该可以工作

    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)
    

    find_spatial_coordinate_from_pixel 中,我颠倒了顺序,因此现在首先调用pixel_to_world,然后再进行坐标转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2013-01-09
      相关资源
      最近更新 更多