/// <summary> /// fills in the rasters within a database given the layer, extent, and spatial reference /// </summary> /// <param name="imSvLyr">raster layer</param> /// <param name="ext">spatial extent</param> /// <param name="sr">spatial reference</param> /// <returns>method messages</returns> public string fillDbRaster(IImageServerLayer imSvLyr, IWorkspace wks, ESRI.ArcGIS.Geometry.IEnvelope ext, ISpatialReference sr) { IRaster rs = null; return fillDbRaster(imSvLyr, wks, ext, sr, out rs); }
public string fillDbRaster(IImageServerLayer imSvLyr, IWorkspace wks,ESRI.ArcGIS.Geometry.IEnvelope ext,ISpatialReference sr, out IRaster outrs) { if (ext.SpatialReference.FactoryCode != sr.FactoryCode) { ext.Project(sr); } StringBuilder msg = new StringBuilder(); if (wks == null) { wks = servWks; } outrs = null; Forms.RunningProcess.frmRunningProcessDialog rp = new Forms.RunningProcess.frmRunningProcessDialog(false); rp.addMessage("Downloading images please be patient..."); rp.Show(); //rp.showInSepperateProcess(); rp.TopMost = true; rp.stepPGBar(10); rp.Refresh(); DateTime dtS = DateTime.Now; try { rasterUtil rsUtil = new rasterUtil(); int minX = System.Convert.ToInt32(ext.XMin); int maxX = System.Convert.ToInt32(ext.XMax); int minY = System.Convert.ToInt32(ext.YMin); int maxY = System.Convert.ToInt32(ext.YMax); int xDiff = System.Convert.ToInt32(ext.Width); int yDiff = System.Convert.ToInt32(ext.Height); int tile = 1; IRaster rast = rsUtil.createRaster(((IRaster2)imSvLyr.Raster).RasterDataset); ISaveAs saveas = (ISaveAs)rast; IRasterProps rasterProps = (IRasterProps)rast; imSvLyr.SpatialReference = sr; string nm = "T" + System.Guid.NewGuid().ToString().Substring(0, 3); string svImgNm = imSvLyr.ServiceInfo.Name; string rNm = nm; int mCols = System.Convert.ToInt32(imSvLyr.ServiceInfo.MaxNCols * .90); int mRows = System.Convert.ToInt32(imSvLyr.ServiceInfo.MaxNRows * .90); if (xDiff < mCols) mCols = xDiff; if (yDiff < mRows) mRows = yDiff; List<IRaster> tileLst = new List<IRaster>(); for (int i = minX; i < maxX; i += mRows) { for (int j = minY; j < maxY; j += mCols) { IEnvelope clipEnvelope = new EnvelopeClass(); clipEnvelope.PutCoords(i, j, i + mRows, j + mCols); rasterProps.Extent = clipEnvelope; rasterProps.Width = mRows; rasterProps.Height = mCols; rasterProps.SpatialReference = sr; string r = rNm + tile.ToString(); if (r.Length > 12) { rp.addMessage("Too many tiles. Ending at Tile: " + tile); msg.AppendLine("Too many tiles. Ending at Tile: " + tile); //outrs = rsUtil.mosaicRastersFunction(wks, rNm, tileLst.ToArray(),esriMosaicMethod.esriMosaicNone,rstMosaicOperatorType.MT_FIRST,true,true,false,true); return msg.ToString(); } if (((IWorkspace2)wks).get_NameExists(esriDatasetType.esriDTRasterDataset, r)) { r = rsUtil.getSafeOutputName(wks, r); //Console.WriteLine("Deleting Raster " + r); //((IRasterWorkspaceEx)wks).DeleteRasterDataset(r); } rp.addMessage("Creating tile " + r); rp.stepPGBar(5); rp.Refresh(); //Console.WriteLine("TestLength = " + testLng.ToString()); tileLst.Add(rsUtil.returnRaster((IRasterDataset)saveas.SaveAs(r, wks, "GDB"))); msg.AppendLine("Added Tile " + r); tile++; } } rp.addMessage("Merging rasters..."); rp.Refresh(); //outrs = rsUtil.mosaicRastersFunction(wks, rNm, tileLst.ToArray(), esriMosaicMethod.esriMosaicNone, rstMosaicOperatorType.MT_FIRST, true, true, false, true); } catch (Exception e) { string x = e.ToString(); msg.AppendLine(x); Console.WriteLine("Error: " + x); } finally { DateTime dtE = DateTime.Now; TimeSpan ts = dtE.Subtract(dtS); msg.AppendLine("Finished process in " + ts.TotalMinutes + " minutes."); rp.addMessage("Finished process in " + ts.TotalMinutes + " minutes."); rp.stepPGBar(100); rp.enableClose(); rp.TopMost = false; rp.Close(); } return msg.ToString(); }
/// <summary> /// fills in the rasters within a database given the layer and and extent /// </summary> /// <param name="imSvLyr">raster layer</param> /// <param name="ext">spatial extent</param> /// <returns>method messages</returns> public string fillDbRaster(IImageServerLayer imSvLyr, ESRI.ArcGIS.Geometry.IEnvelope ext) { return fillDbRaster(imSvLyr, null, ext,imSvLyr.ServiceInfo.SpatialReference); }