Как создать сетку из точек LiDAR (X, Y, Z) с помощью GDAL python?

Я новичок в программировании на Python, и мне просто интересно, можете ли вы создать обычную сетку с разрешением 0,5 на 0,5 м, используя точки LiDAR.

Мои данные в формате LAS (чтение из файла импорта liblas как lasfile) и имеют следующий формат: X, Y, Z. Где X и Y - координаты.

Точки расположены случайным образом, и некоторые пиксели пусты (значение NAN), а в некоторых пикселях больше одной точки. Там, где есть больше одной точки, я хочу получить среднее значение. В конце концов мне нужно сохранить данные в формате TIF или формате Ascii.

Я изучаю модуль osgeo и GDAL, но, честно говоря, я не знаю, является ли модуль osgeo лучшим решением.

Я очень рад за помощь с некоторым кодом, который я могу изучить и реализовать,

Заранее спасибо за помощь, мне очень нужна.

Я не знаю, как лучше всего получить сетку с такими параметрами.


person Gianni Spear    schedule 25.09.2012    source источник


Ответы (3)


Немного поздно, но, возможно, этот ответ будет полезен для других, если не для вас...

Я сделал это с Numpy и Pandas, и это довольно быстро. Я использовал данные TLS и мог без проблем сделать это с несколькими миллионами точек данных на приличном ноутбуке 2009 года выпуска. Ключом является «биннинг» путем округления данных, а затем использование методов GroupBy Pandas для агрегирования и вычисления средних значений.

Если вам нужно округлить до степени 10, вы можете использовать np.round, в противном случае вы можете округлить до произвольного значения, создав для этого функцию, которую я сделал, изменив этот ТАК ответ.

import numpy as np
import pandas as pd

# make rounding function:
def round_to_val(a, round_val):
    return np.round( np.array(a, dtype=float) / round_val) * round_val

# load data
data = np.load( 'shape of ndata, 3')
n_d = data.shape[0]

# round the data
d_round = np.empty( [n_d, 5] )
d_round[:,0] = data[:,0]
d_round[:,1] = data[:,1]
d_round[:,2] = data[:,2]

del data  # free up some RAM

d_round[:,3] = round_to_val( d_round[:,0], 0.5)
d_round[:,4] = round_to_val( d_round[:,1], 0.5)

# sorting data
ind = np.lexsort( (d_round[:,4], d_round[:,3]) )
d_sort = d_round[ind]

# making dataframes and grouping stuff
df_cols = ['x', 'y', 'z', 'x_round', 'y_round']
df = pd.DataFrame( d_sort)
df.columns = df_cols
df_round = df[['x_round', 'y_round', 'z']]
group_xy = df_round.groupby(['x_round', 'y_round'])

# calculating the mean, write to csv, which saves the file with:
# [x_round, y_round, z_mean] columns.  You can exit Python and then start up 
# later to clear memory if that's an issue.
group_mean = group_xy.mean()
group_mean.to_csv('your_binned_data.csv')

# Restarting...
import numpy as np
from scipy.interpolate import griddata

binned_data = np.loadtxt('your_binned_data.csv', skiprows=1, delimiter=',')
x_bins = binned_data[:,0]
y_bins = binned_data[:,1]
z_vals = binned_data[:,2]

pts = np.array( [x_bins, y_bins])
pts = pts.T

# make grid (with borders rounded to 0.5...)
xmax, xmin = 640000.5, 637000
ymax, ymin = 6070000.5, 6067000

grid_x, grid_y = np.mgrid[640000.5:637000:0.5, 6067000.5:6070000:0.5]

# interpolate onto grid
data_grid = griddata(pts, z_vals, (grid_x, grid_y), method='cubic')

# save to ascii
np.savetxt('data_grid.txt', data_grid)

Когда я сделал это, я сохранил вывод в формате .npy и преобразовал в TIFF с помощью библиотеки изображений, а затем привязал к географическому положению в ArcMap. Вероятно, есть способ сделать это с помощью osgeo, но я его не использовал.

Надеюсь, это поможет хоть кому-то...

person cossatot    schedule 18.03.2013

Вы можете использовать функцию гистограммы в Numpy для объединения, например:

import numpy as np
points = np.random.random(1000)
#create 10 bins from 0 to 1
bins = np.linspace(0, 1, 10)
means = (numpy.histogram(points, bins, weights=data)[0] /
             numpy.histogram(points, bins)[0])
person reptilicus    schedule 25.09.2012
comment
Однако здесь вам придется использовать np.histogram2d. - person letmaik; 24.05.2014

Попробуйте LAStools, особенно lasgrid или las2dem.

person Mike T    schedule 26.09.2012
comment
Спасибо, Майк, но цель - использовать код снаружи. Мне нужно рассчитать несколько новых индексов вне LAStools. Но Спасибо за поддержку!!! :) - person Gianni Spear; 27.09.2012