2

簡単な質問で申し訳ありませんが、私はPythonを初めて使用するので、同じ助けが必要です。

私のデータはポイント形式です:X、Y、Z。ここで、XとYは座標、zは値です。

私の問題は次のとおりです。各ピクセルの値がZの平均である0.5mx 0.5 m(または1 x 1 m)のラスター(TIFまたはASCII)を作成します。ピクセルにポイントがない場合-i値はNANである必要があります。

勉強して実装できるコードを手伝ってくれて本当にうれしいです。

助けてくれてありがとう、私は本当に必要です。

私はコードを研究して書き込もうとしました:

from osgeo import gdal, osr, ogr
import math, numpy
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml
import matplotlib.delaunay

tiff = 'test.tif'

gridSize = 0.5
# my area boundary
xmax, xmin = 640000.06, 636999.83
ymax, ymin = 6070000.3, 6066999.86

# number of row and columns
nx = int(math.ceil(abs(xmax - xmin)/gridSize))
ny = int(math.ceil(abs(ymax - ymin)/gridSize))

# Plot the points
plt.scatter(x,y,c=z)
plt.axis([xmin, xmax, ymin, ymax])
plt.colorbar()
plt.show()

# Generate a regular grid.
xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)
xi, yi = np.meshgrid(xi, yi)

この点から、どこにドロップするかを知るために、x、y、zポイントにインデックスを付ける方法を理解するのに問題があります。私の最初のアイデアは、メッシュグリッドにインデックスを付け、ポイントをマークすることです。その後、ピクセル内のポイントの平均をとることができます。空のピクセル(現在のポイントがない場合)はNANです。

しかし、それが私のデータを処理する正しい方法かどうかはわかりません。

その後、GDAL経由でTIFF形式で保存する次のコードを作成しました

target_ds = gdal.GetDriverByName('GTiff').Create(tiff, nx,ny, 1, gdal.GDT_Byte) #gdal.GDT_Int32
target_ds.SetGeoTransform((xmin, gridSize, 0,ymax, 0, -gridSize,))

if EPSG == None:
    proj = osr.SpatialReference()
    proj.ImportFromEPSG(EPSG)
    # Make the target raster have the same projection as the source
    target_ds.SetProjection(proj.ExportToWkt())
else:
    # Source has no projection (needs GDAL >= 1.7.0 to work)
    target_ds.SetProjection('LOCAL_CS["arbitrary"]')

target_ds.GetRasterBand(1).WriteArray(numpy.zeros((ny,nx)))
target_ds = None

本当にすべての助けに感謝します

4

1 に答える 1

6

行く方法:

  • グリッドspacing(浮動小数点数) を定義します。これは、同じ次元の 2 つのピクセル/ボクセルの中間点間の距離です。
  • 必要なグリッドのサイズ、つまり と のグリッド ポイントの数、x、および をy計算N_xN_yます。
  • numpy例を使用して、すべての値がゼロであるそのサイズの2つの配列を作成しますnp.zeros([N_x, N_y])
  • (x、y、v)ポイントのセットを反復処理し、
    • 各 (x, y) ペアを対応するピクセルに射影し、2 つの (整数) インデックスで識別します。x_i, y_i = tuple([int(c//spacing) for c in (x, y)])
    • その場所の1つの配列に1を追加し(x_i, y_i)ます(「カウント」を保持)
    • v値を他の配列の場所に追加します(x_i, y_i)(値の合計を保持します)
  • 2 つの配列に値を入力したら、値の合計配列をカウント配列で割ります。0/0.0 は自動的に に割り当てられNaN、c/0.0 は に割り当てられますInf
于 2012-09-27T12:59:30.757 に答える