2 votos

¿Cómo guardar los resultados raster de IExtractionOp?

Estoy usando IExtractionOp para recortar un raster por polígono:

IExtractionOp operation = (IExtractionOp)(new RasterExtractionOp());
IRasterBandCollection rasterBandCollection = (IRasterBandCollection)operation.Polygon((IGeoDataset)rasterDataset, polygon, true);

He intentado guardar a través de

// Fails with exception
IRasterDataset dataset = rasterBandCollection.Item(0).RasterDataset;
dataset.Copy("temp" + extension, (IWorkspace)rasterWorkspace);

// Successful, but does not show any pixels in ArcMap when opened
rasterBandCollection.SaveAs("temp" + extension, (IWorkspace)rasterWorkspace, rasterDataset.Format);

// Same result as SaveAs
((ITemporaryDataset)dataset).MakePermanentAs("temp" + extension, (IWorkspace)rasterWorkspace, rasterDataset.Format);

Ninguno de los tres métodos anteriores funcionó... Puedo utilizar el resultado devuelto y añadirlo al mapa, por lo que la extracción parece ser válida, pero soy incapaz de almacenarlo de cualquier manera.

2voto

Rae Puntos 140

Con ArcGIS 10 existen dos posibilidades documentadas:

Usando ITemporaryDataset.MakePermanentAs como documentado aquí .

Sin embargo, esto conduce al resultado descrito anteriormente: se genera un archivo muy pequeño (inutilizable). Me di cuenta de que a veces el archivo cambia a un archivo utilizable después de que el proceso de depuración se cierra (respectivamente ArcMap). He descubierto que explícitamente liberar el resultado de MakePermanentAs conduce al mismo resultado, que es una solución aceptable para mí.

IDataset raster = temporaryDataset.MakePermanentAs(filename, (IWorkspace)rasterWorkspace, format);

// Free result explicitly (workaround)
Marshal.ReleaseComObject(raster);

La segunda posibilidad es utilizar IRasterOPBase como se describe aquí :

// Creates RasterDatasetName object as output dataset name
IDatasetName datasetName = (IDatasetName)new RasterDatasetName();
datasetName.WorkspaceName = (IWorkspaceName)((IDataset)rasterWorkspace).FullName;
datasetName.Name = filename;

// Adds output dataset name to Op (force 10 execution path)
IRasterOpBase rasterOpBase = (IRasterOpBase)operation;
rasterOpBase.AddOutputDatasetName(0, datasetName);

Sin embargo, esto falla al azar cuando se utiliza en un hilo STA - así que tengo que seguir con la solución número uno.

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