簡體   English   中英

使用python和gdal從.geotiff中的像素點查找緯度/經度坐標

[英]Find lat/long coordinates from pixel point in .geotiff using python and gdal

我在 .geotiff 圖像中由像素坐標定義了點。

我正在嘗試將這些像素坐標轉換為經度和緯度。

起初,我試圖從我之前在這里問的反向問題中調整給定的代碼

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))。

我究竟做錯了什么 ?

您已經改變了在像素、投影坐標和經緯度之間轉換的順序。 您正在執行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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM