2

我有一个光栅文件和一个 WGS84 纬度/经度点。

我想知道栅格中的哪个值与该点相对应。

我的感觉是我应该GetSpatialRef()在光栅对象或其一个波段上使用,然后将 aogr.osr.CoordinateTransformation()应用于该点以将其映射到光栅空间。

我希望那时我可以简单地询问光栅乐队当时的情况。

但是,栅格对象似乎没有GetSpatialRef()访问地理定位点的方法或方法,因此我对如何执行此操作有些茫然。

有什么想法吗?

4

3 回答 3

2

假设我有一个 geotiff 文件 test.tif。然后下面的代码应该在像素附近的某处查找值。我对查找单元格的部分没有那么自信,并且会修复存在错误。这个页面应该有帮助,“GDAL 数据模型”

此外,如果您还没有,您可以访问gis.stackexchange.com寻找专家。

import gdal, osr

class looker(object):
    """let you look up pixel value"""

    def __init__(self, tifname='test.tif'):
       """Give name of tif file (or other raster data?)"""

        # open the raster and its spatial reference
        self.ds = gdal.Open(tifname)
        srRaster = osr.SpatialReference(self.ds.GetProjection())

        # get the WGS84 spatial reference
        srPoint = osr.SpatialReference()
        srPoint.ImportFromEPSG(4326) # WGS84

        # coordinate transformation
        self.ct = osr.CoordinateTransformation(srPoint, srRaster)

        # geotranformation and its inverse
        gt = self.ds.GetGeoTransform()
        dev = (gt[1]*gt[5] - gt[2]*gt[4])
        gtinv = ( gt[0] , gt[5]/dev, -gt[2]/dev, 
                gt[3], -gt[4]/dev, gt[1]/dev)
        self.gt = gt
        self.gtinv = gtinv

        # band as array
        b = self.ds.GetRasterBand(1)
        self.arr = b.ReadAsArray()

    def lookup(self, lon, lat):
        """look up value at lon, lat"""

        # get coordinate of the raster
        xgeo,ygeo,zgeo = self.ct.TransformPoint(lon, lat, 0)

        # convert it to pixel/line on band
        u = xgeo - self.gtinv[0]
        v = ygeo - self.gtinv[3]
        # FIXME this int() is probably bad idea, there should be 
        # half cell size thing needed
        xpix =  int(self.gtinv[1] * u + self.gtinv[2] * v)
        ylin = int(self.gtinv[4] * u + self.gtinv[5] * v)

        # look the value up
        return self.arr[ylin,xpix]

# test
l = looker('test.tif')
lon,lat = -100,30
print l.lookup(lon,lat)

lat,lon =28.816944, -96.993333
print l.lookup(lon,lat)
于 2012-11-19T00:21:38.133 回答
2

是的,API 不一致。栅格(数据源)有一个GetProjection()方法(返回 WKT)。

这是一个执行您想要的功能(从此处绘制):

def extract_point_from_raster(point, data_source, band_number=1):
    """Return floating-point value that corresponds to given point."""

    # Convert point co-ordinates so that they are in same projection as raster
    point_sr = point.GetSpatialReference()
    raster_sr = osr.SpatialReference()
    raster_sr.ImportFromWkt(data_source.GetProjection())
    transform = osr.CoordinateTransformation(point_sr, raster_sr)
    point.Transform(transform)

    # Convert geographic co-ordinates to pixel co-ordinates
    x, y = point.GetX(), point.GetY()
    forward_transform = Affine.from_gdal(*data_source.GetGeoTransform())
    reverse_transform = ~forward_transform
    px, py = reverse_transform * (x, y)
    px, py = int(px + 0.5), int(py + 0.5)

    # Extract pixel value
    band = data_source.GetRasterBand(band_number)
    structval = band.ReadRaster(px, py, 1, 1, buf_type=gdal.GDT_Float32)
    result = struct.unpack('f', structval)[0]
    if result == band.GetNoDataValue():
        result = float('nan')
    return result

其文档如下(取自此处):

spatial.extract_point_from_raster(point, data_source, band_number=1)

data_source 是一个 GDAL 栅格,而 point 是一个 OGR 点对象。该函数返回data_source指定波段中离点最近的像素值。

point 和 data_source 不必在同一个参考系中,但它们都必须定义适当的空间参考。

如果该点不在栅格中,则会引发 RuntimeError。

于 2015-01-30T14:30:21.657 回答
-1
project = self.ds.GetProjection()
srPoint = osr.SpatialReference(wkt=project)

完成...这样,矢量文件采用了输入光栅文件的投影

于 2013-11-26T14:45:42.883 回答