Raster veri dizisi çıktısı python / gdal kullanılarak x eksenine çevrildi mi?


9

Python gdal kitaplıklarını kullanarak bir tarama oluşturmaya çalışıyorum ve veri çıktı noktası noktasına aldım, ancak çıkış verileri başlangıç ​​noktasının x ekseni üzerinde çevrilir. Bir şeye bakmam gerektiğini biliyorum, ama nerede yanlış yaptığımı anlayamıyorum. Herhangi bir fikir?

Raster oluştururken sol üst x / y değerlerini ayarladım ve dizi sol üstten dizine eklenmiş gibi görünüyor ve sağ alttan aşağı doğru devam ediyor. Aşağıdaki kodda dizi satır değeri ile dolduruyorum.

Diziyi yazdırırken şöyle görünür:

[[  1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.
    1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.
    1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.
    1.   1.   1.   1.   1.   1.]
 [  2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.
    2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.
    2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.
    2.   2.   2.   2.   2.   2.]
 [  3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.
    3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.
    3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.   3.
    3.   3.   3.   3.   3.   3.]
 [  4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.
    4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.
    4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.   4.
    4.   4.   4.   4.   4.   4.]
...

Ve bu veriler tarama bandına başarıyla yazılıyor. Ancak MapWindow GIS'de görüntülendiğinde, veriler başlangıçta ayarlanmış olan sol üst başlangıç ​​noktasıyla ters yönde gidiyor ve sol alt değer olarak görünüyor.

Başka bir deyişle, veriler başlangıç ​​noktasının x eksenine çevrilir.

import gdal
import osr
import numpy

OUTPUT_FORMAT = "GTiff"
def create_raster(filename="test.tif"):
    driver = gdal.GetDriverByName(OUTPUT_FORMAT)
    band_type = gdal.GDT_Byte
    number_of_bands = 1

    x_rotation = 0 # not supported
    y_rotation = 0 # not supported
    cell_width_meters = 50
    cell_height_meters = 50

    (min_lon, min_lat, max_lon, max_lat) = _get_point_bounds() # retrieve bounds for point data        
    srs = osr.SpatialReference()
    srs.SetWellKnownGeogCS("WGS84") # Set geographic coordinate system to handle lat/lon        
    srs.SetUTM( 54, True) # Set projected coordinate system  to handle meters        

    # create transforms for point conversion
    wgs84_coordinate_system = srs.CloneGeogCS() # clone only the geographic coordinate system
    wgs84_to_utm_transform = osr.CoordinateTransformation(wgs84_coordinate_system, srs)

    # convert to UTM
    top_left_x, top_left_y, z = wgs84_to_utm_transform.TransformPoint(min_lon, max_lat, 0)     
    lower_right_x, lower_right_y, z = wgs84_to_utm_transform.TransformPoint(max_lon, min_lat, 0) 

    cols, rows = _get_raster_size(top_left_x, lower_right_y, lower_right_x, top_left_y, cell_width_meters, cell_height_meters)
    dataset = driver.Create(filename, cols, rows, number_of_bands, band_type) #

    # GeoTransform parameters
    # --> need to know the area that will be covered to define the geo tranform
    # top left x, w-e pixel resolution, rotation, top left y, rotation, n-s pixel resolution
    geo_transform = [ top_left_x, cell_width_meters, x_rotation, top_left_y, y_rotation, cell_height_meters ]
    dataset.SetGeoTransform(geo_transform)
    dataset.SetProjection(srs.ExportToWkt())

    dataset_band = dataset.GetRasterBand(1)
    data = dataset_band.ReadAsArray(0, 0, cols, rows).astype(numpy.float32) # returns empty array 

    for row in xrange(rows):
        for col in xrange(cols):
            data[row][ col] = row + 1

    dataset_band.WriteArray(data, 0, 0)
    dataset_band.SetNoDataValue(0.0)
    dataset_band.FlushCache()
    dataset = None # Close file

Ben piksel konumunu hesaplamak zaman da fark ettik, belirli bir enlem / boylam y değeri çeşit-doğru dizisi olduğunu dikkate alarak görünüyor olumsuz endeksi, sonuçları sol üst etmek düşürmek sağı .

inverse_geo_transform = gdal.InvGeoTransform(self.geo_transform)[1] # for mapping lat/lon to pixel
pixel_x, pixel_y = gdal.ApplyGeoTransform(self.inverse_geo_transform, utm_x, utm_y)

Yanıtlar:


10

Sorunu buldum ....

Sorun geo_transform'u tanımlamaktır. Aşağıdaki vardı:

x_rotation = 0 
y_rotation = 0 
cell_width_meters = 50
cell_height_meters = 50

geo_transform = [ top_left_x, cell_width_meters, x_rotation, top_left_y, y_rotation, cell_height_meters ]
dataset.SetGeoTransform(geo_transform)

Gdal belgeleri bu değerlerin ne olduğu konusunda net değildir. (Bkz. SetGeoTransform ) Geçilen değerlerin (sırayla) olması gerektiğini belirttim.

  • top_left_x
  • cell_width_meters
  • x_rotation
  • top_left_y
  • y_rotation
  • cell_height_meters

Bu doğru görünüyor, AMA GDAL API Eğitimi yeniden gözden son fark, negatif bir değer cell_height_metersverildiğini gösterildi fark ettim . Verileri beklenen yönde düzgün şekilde çıktılamak için gereken tek şey bu gibi görünüyor.

Şimdi geo_transform tanım satırını şu şekilde değiştirdim:

(Eklenen "-" öğesine dikkat edin)

geo_transform = [ top_left_x, cell_width_meters, x_rotation, top_left_y, y_rotation, -cell_height_meters ]

bu, sol üstteki kökenler ve coğrafyanın alt solu kullanma şekli gibi görüntü dünyalarıyla uğraşmanın geleneksel yoludur.
Ian Turton

Bildiğinizde mantıklıdır, ancak soruna kod örneklerinden yaklaşmak, mantığı bulmak zordur. ArcGIS belgelerinin rastlayıcılar
monkut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.