6 votos

¿Cuál es la mejor práctica para leer datos de una banda de trama con Java y GDAL?

Después de usar GDAL con Python para un año o así que ahora, me estoy poniendo de nuevo en Java y tratando de averiguar cómo utilizar GDAL con ella. Me pregunto si alguien ha tenido experiencia con la lectura de datos desde un ráster de la banda con GDAL y Java. Puedo leer el conjunto de datos y la banda de la siguiente manera:

Dataset theDataset = gdal.Open("k:/dem.asc", gdalconst.GA_ReadOnly);
Band theBand = theDataset.GetRasterBand(1);

...pero no estoy seguro de cómo leer los datos de theBand. A partir de la documentación de la API parece que tengo que configurar una matriz en primer lugar, lo que significa que tengo que saber cuántos elementos hay en el bloque de datos que quiero extraer de la banda. Como este:

double[] arr = new double[3];
theBand.ReadRaster(0, 0, 3, 1, arr);

Supongo que funciona bien si usted sólo quiere extraer una fila de datos, como en el anterior, porque puedes terminar con un array de una dimensión. La referenciación de los elementos es bastante fácil. Pero si quiero extraer un multi-fila de bloques de datos, tiene que ser forzado en una matriz unidimensional. Algo como esto:

double[] arr = new double[9];
theBand.ReadRaster(0, 0, 3, 3, arr);

Entonces, si quiero hacer referencia a un individuo de celda ráster en la matriz me acaba de extraer (por ejemplo, si quiero proceso el bloque de celda por celda), que necesito para convertir mi cuadrícula bidimensional de coordenadas (proxy de la coordenada y coordenada y) en un uno-dimensional entero índice de la matriz.

Supongo que no es demasiado difícil escribir un pequeño método para convertir de una cuadrícula de referencia a la esencia de un vector de referencia, pero parece una especie de complicado, sobre todo después de estar acostumbrado al uso de la cuadrícula de referencias directamente en Python-numpy-GDAL.

Así es esta la única manera de extraer los datos de una banda en Java/GDAL? Por lo que puedo decir, que lo es, pero tengo la esperanza de que hay una manera más intuitiva de procesamiento de grandes bloques de datos.

2voto

Adrian Godong Puntos 332

Hay un par de maneras de leer los datos. Perdóname, pero yo no estoy familiarizado con los enlaces de java y la sintaxis. Un método es utilizar GDALRasterBand->ReadBlock():

http://gdal.org/classGDALRasterBand.html#a09e1d83971ddff0b43deffd54ef25eef

En la que se lee en el bloque interno definido por el conductor, que es una línea de digitalización para la aaigrid conductor. Vea el ejemplo en la documentación. Para hacer esto manualmente, similares a los de su ejemplo, el uso de GDALRasterBand->RasterIO(), que parece estar envuelto en java con ReadRaster(). Lazo sobre la trama GDALDataset->GetRasterYSize() veces y leer en una sola línea:

double[]data = new double[nXSize];
for(int i = 0; i < nYSize; i++)
{
    band.ReadRaster(0, i, nXsize, 1, data);
    //do something with your data
}

Usted puede cambiar el tamaño de la ventana de entrada de lo que te gustaría conseguir a partir de los datos. Por ejemplo, como en el anterior, el uso de una ventana de 3x3 en el ReadRaster() para calcular la pendiente y aspecto. Acabo de encontrar un enlace a la javadoc aquí:

http://gdal.org/java/

La buena suerte.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X