Raster Fields to Files with Arcpy

2076
2
05-12-2011 06:52 PM
PeterTimmers
Occasional Contributor III
Does anyone know of a way to take a raster dataset field and write it to a file in arcpy?

I'm talking about writing a raster field to a jpg.

You're pretty much forced to store photos as a raster field if you want to do it out of the box in windows mobile.
0 Kudos
2 Replies
DarrinChristy
New Contributor
Hi timmerspk,

I don't believe there is currently any raster field export functionality in the arcpy site package, but I was able to find some sample ArcObjects code that may help you out (I believe it was written in C#).  I personally don't have experience coding in this language, but it looks like it will loop though your raster fields and use the same 'Save As' function that's present when you click the drop-down arrow for the raster field in ArcMap.  Hope this helps!

IMxDocument pDoc;
            IMap pMap;
            IFeatureLayer pFeatLayer;
            IFeatureClass pFeatClass;
            IFeature pfeature;
            IFields pFlds;
            int iRaster;
            IRasterValue pValue;
            //int i;
            IRasterDataset3 pRasterDataset;
            ISaveAs pSaveAs;
            IWorkspaceFactory pWorkspaceFactory;
            IWorkspace pWorkspace;
            IFeatureCursor pFeatcursor;

            pDoc = m_application.Document as IMxDocument;
            pMap = pDoc.Maps.get_Item(0);
            pFeatLayer = pMap.get_Layer(0)as IFeatureLayer;
            pFeatClass = pFeatLayer.FeatureClass;

            pFeatcursor = pFeatLayer.Search(null, false);
            pfeature = pFeatcursor.NextFeature();

            while (pfeature!=null)
            {
                pFlds = pFeatClass.Fields;
                iRaster = -1;
                //i = 0;
                for (int i = 0; i < pFlds.FieldCount; i++)
                {
                    if (pFlds.get_Field(i).Type==esriFieldType.esriFieldTypeRaster)
                    {
                        iRaster = i;
                    }
                }

                pValue = pfeature.get_Value(iRaster) as IRasterValue;
                pRasterDataset = pValue.RasterDataset as IRasterDataset3;

                //Define the workspace to save the result to

                pWorkspaceFactory = new RasterWorkspaceFactoryClass();

                //**********Please change output location according to your system*********************
                pWorkspace = pWorkspaceFactory.OpenFromFile(@"C:\temp\ExportOutput", 0);

                pSaveAs = pRasterDataset as ISaveAs;
                    if (pSaveAs.CanSaveAs("JPEG"))

 {
   pSaveAs.SaveAs("JPG_Raster" + pfeature.OID + ".jpg",pWorkspace,"JPEG");
         //pSaveAs.SaveAs("JPG_Raster" + pfeature.OID + ".jpg", pWorkspace, "JPEG");
 }
                pfeature = pFeatcursor.NextFeature();

            }


//System.Diagnostics.Debug.Print("Export Finished");
MessageBox.Show("Export Finished");


- Darrin C
0 Kudos
PeterTimmers
Occasional Contributor III
That worked a treat.  I modified it to strip straight from sde... Got lazy with Db.null.  If it appears in arcpy I imagine I'll be able to do the below in about a dozen lines.

Private Sub ExtractRasters(ByVal FCName As String, ByVal Fieldx As Integer, ByVal OutputDir As String)
        Dim pValue As IRasterValue
        Dim pRasterDataset As IRasterDataset3
        Dim pWorkspaceFactory As IWorkspaceFactory
        Dim pWorkspace As IWorkspace
        Dim pSaveAs As ISaveAs

        Dim pPropSet As IPropertySet = New PropertySetClass()
        With pPropSet
            .SetProperty("Server", My.Settings.Server)
            .SetProperty("Instance", My.Settings.Instance)
            .SetProperty("Database", My.Settings.Database)
            .SetProperty("AUTHENTICATION_MODE", My.Settings.AUTHENTICATION_MODE)
            .SetProperty("USER", My.Settings.USER)
            .SetProperty("PASSWORD", My.Settings.PASSWORD)
            .SetProperty("version", "sde.DEFAULT")
        End With
        Dim pSDEWorkspace As IWorkspace
        Dim pSDEWorkspaceFactory As New SdeWorkspaceFactory
        pSDEWorkspace = pSDEWorkspaceFactory.Open(pPropSet, 0)

        Dim pFeatureWorkspace As IFeatureWorkspace = pSDEWorkspace
        Dim pFeatureClass As IFeatureClass = pFeatureWorkspace.OpenFeatureClass(FCName)
        Dim pFeatcursor As IFeatureCursor = pFeatureClass.Search(Nothing, True)
        Dim pfeature As IFeature = pFeatcursor.NextFeature

        Dim pFlds As IFields = pFeatureClass.Fields

        If pFlds.Field(Fieldx).Type <> esriFieldType.esriFieldTypeRaster Then
            Console.WriteLine("Field chosen (" + Fieldx.ToString + ") is not a raster field!")
            Exit Sub
        End If

        Dim fcount As Integer = 0
        While Not pfeature Is Nothing
            Try
                pValue = pfeature.Value(Fieldx)
                pRasterDataset = pValue.RasterDataset
                pWorkspaceFactory = New RasterWorkspaceFactoryClass
                pWorkspace = pWorkspaceFactory.OpenFromFile(OutputDir, 0)
                pSaveAs = pRasterDataset

                Dim filename As String = "JPG_Raster" + pfeature.OID.ToString + ".jpg"
                If pSaveAs.CanSaveAs("JPEG") And System.IO.File.Exists(OutputDir + "\" + filename) = False Then
                    pSaveAs.SaveAs(filename, pWorkspace, "JPEG")
                    fcount += 1
                End If
            Catch ex As Exception
                Console.WriteLine(ex.Message + " CONTINUING")
            End Try
            pfeature = pFeatcursor.NextFeature
        End While
        pfeature = Nothing
        Console.WriteLine(fcount.ToString + " file/s written out.")
    End Sub
0 Kudos