2016-08-20 3 views
0

私は、測定の場所を含むCSVファイルを取り込み、その測定値に基づいて確率マップを作成するスクリプトに取り組んでいます。私はGeoTIFFに確率を書き込むためにGDALを使用していますが、データのどれもGeoTIFFに正しく書き込まれていないことに気づいています。ヒートマップを生成するとき、numpyを使用してデータをX行Y列に格納し、その配列をGeoTIFFに書き込みます。私が260 x 262メートルで測定している現在のデータセット、そして結果として得られるGeoTIFFは正しい次元を持ち、適切に地理参照されています。ヒートマップデータのピクセル値は-51から0までですが、GeoTIFFをQGISに読み込むと、QGISの値は-51から-31までしかありません。GDALを使用してジオテフにデータが書き込まれるようにするにはどうすればよいですか?

GeoTIFFは32ビット浮動小数点データとロスレス圧縮として保存する必要があります。そのため、データ範囲や圧縮の問題ではありません。

私は、下記の関連するコードを添付しました:

import sys 
import numpy as np 
import matplotlib 
matplotlib.use('Agg') 
import matplotlib.pyplot as plot 
# USING utm 0.4.0 from https://pypi.python.org/pypi/utm 
import utm 
import os 
import argparse 
import fileinput 
from osgeo import gdal 
import osr 
import math 

# finalLon and finalLat are 1-D arrays containing the UTM coordinates for each measurement 
tiffXSize = int(max(finalLon)) - int(min(finalLon)) + maxRange * 2 
tiffYSize = int(max(finalLat)) - int(min(finalLat)) + maxRange * 2 
pixelSize = 1 
heatMapArea = np.zeros((tiffXSize, tiffYSize)) # y, x 
refLat = min(finalLat) - maxRange 
maxLat = max(finalLat) + maxRange 
refLon = max(finalLon) + maxRange 
minLon = min(finalLon) - maxRange 
# some code to set values in the heatMapArea array 

outputFileName = '%s/RUN_06d_COL_%06d.tiff' % (output_path, run_num, num_col) 
driver = gdal.GetDriverByName('GTiff') 
dataset = driver.Create(
    outputFileName, 
    tiffYSize, 
    tiffXSize, 
    1, 
    gdal.GDT_Float32, ['COMPRESS=LZW']) 

spatialReference = osr.SpatialReference() 
spatialReference.SetUTM(zonenum, zone >= 'N') 
spatialReference.SetWellKnownGeogCS('WGS84') 
wkt = spatialReference.ExportToWkt() 
retval = dataset.SetProjection(wkt) 
dataset.SetGeoTransform((
    refLat, # 0 
    1, # 1 
    0,      # 2 
    refLon, # 3 
    0,      # 4 
    -1)) 
band = dataset.GetRasterBand(1) 
band.SetNoDataValue(100) 
print(tiffXSize) 
print(tiffYSize) 
print(np.amin(heatMapArea)) 
print(np.amax(heatMapArea)) 
print(np.mean(heatMapArea)) 
print(np.std(heatMapArea)) 
print((heatMapArea > -30).sum()) 
band.WriteArray(heatMapArea) 
band.SetStatistics(np.amin(heatMapArea), np.amax(heatMapArea), np.mean(heatMapArea), np.std(heatMapArea)) 
dataset.FlushCache() 
dataset = None 

答えて

1

問題はQGISはGeoTIFFのの最大値と最小値を計算する方法です。 GeoTIFFレイヤーのプロパティに移動し、スタイルタブを開いてバンドレンダリングの下に最小/最大値をロードする方法を選択できます。デフォルトでは、QGISは最小値と最大値として2%~98%のカウントを使用しますが、最小値/最大値が必要です。

関連する問題