Select to view content in your preferred language

Help on creating profile graphs from transects?

2144
2
11-13-2013 07:46 PM
WilmerMenjivar
New Contributor
Okay so, I am working on ArcGIS 10.1, and Visual Studio 2010.

My objective is to build an add-in that allows for a user to push a button and create a transect (line) in ArcGIS. That line will
output
profile graph. I know you can do this with 3D analyst, however 3D analyst does not output more than one graph at a time if you
have multiple rasters or GRIDS. So I want to be able to have 3 rasters on and create a transect and that transect will output 3 different profiles but of the same line. So far, I have been able to build the add-in up to the point of creating the line. So the code below  allows you to draw a line. But now I am stuck in how do I make this line interpolate the data from each raster and output a separate graph?

using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Carto;
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Lab5
{
    public class Tool1 : ESRI.ArcGIS.Desktop.AddIns.Tool
    {
        public Tool1()
        {
        }
        

#region "Add Graphic to Map"

///<summary>Draw a specified graphic on the map using the supplied colors.</summary>
///      
///<param name="map">An IMap interface.</param>
///<param name="geometry">An IGeometry interface. It can be of the geometry type: esriGeometryPoint, esriGeometryPolyline, or esriGeometryPolygon.</param>
///<param name="rgbColor">An IRgbColor interface. The color to draw the geometry.</param>
///<param name="outlineRgbColor">An IRgbColor interface. For those geometry's with an outline it will be this color.</param>
///      
///<remarks>Calling this function will not automatically make the graphics appear in the map area. Refresh the map area after after calling this function with Methods like IActiveView.Refresh or IActiveView.PartialRefresh.</remarks>
public void AddGraphicToMap(IMap map, IGeometry geometry, IRgbColor rgbColor, IRgbColor outlineRgbColor)
{
  IGraphicsContainer graphicsContainer = (IGraphicsContainer)map; // Explicit Cast
  IElement element = null;
  if ((geometry.GeometryType) == esriGeometryType.esriGeometryPoint)
  {
    // Marker symbols
    ISimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbolClass();
    simpleMarkerSymbol.Color = rgbColor;
    simpleMarkerSymbol.Outline = true;
    simpleMarkerSymbol.OutlineColor = outlineRgbColor;
    simpleMarkerSymbol.Size = 15;
    simpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle;

    IMarkerElement markerElement = new MarkerElementClass();
    markerElement.Symbol = simpleMarkerSymbol;
    element = (IElement)markerElement; // Explicit Cast
  }
  else if ((geometry.GeometryType) == esriGeometryType.esriGeometryPolyline)
  {
    //  Line elements
    ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass();
    simpleLineSymbol.Color = rgbColor;
    simpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid;
    simpleLineSymbol.Width = 5;

    ILineElement lineElement = new LineElementClass();
    lineElement.Symbol = simpleLineSymbol;
    element = (IElement)lineElement; // Explicit Cast
  }
  else if ((geometry.GeometryType) == esriGeometryType.esriGeometryPolygon)
  {
    // Polygon elements
    ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
    simpleFillSymbol.Color = rgbColor;
    simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSForwardDiagonal;
    IFillShapeElement fillShapeElement = new PolygonElementClass();
    fillShapeElement.Symbol = simpleFillSymbol;
    element = (IElement)fillShapeElement; // Explicit Cast
  }
  if (!(element == null))
  {
    element.Geometry = geometry;
    graphicsContainer.AddElement(element, 0);
  }
}
#endregion
        

#region "Get Polyline From Mouse Clicks"

///<summary>
///Create a polyline geometry object using the RubberBand.TrackNew method when a user click the mouse on the map control. 
///</summary>
///<param name="activeView">An ESRI.ArcGIS.Carto.IActiveView interface that will user will interace with to draw a polyline.</param>
///<returns>An ESRI.ArcGIS.Geometry.IPolyline interface that is the polyline the user drew</returns>
///<remarks>Double click the left mouse button to end tracking the polyline.</remarks>
public IPolyline GetPolylineFromMouseClicks(IActiveView activeView)
{

  IScreenDisplay screenDisplay = activeView.ScreenDisplay;

  IRubberBand rubberBand = new RubberLineClass();
  IGeometry geometry = rubberBand.TrackNew(screenDisplay, null);

  IPolyline polyline = (IPolyline)geometry;

  return polyline;

}
#endregion

        protected override void OnMouseDown(ESRI.ArcGIS.Desktop.AddIns.Tool.MouseEventArgs
arg)
{
    //Get the active view from the ArcMap static class.
    IActiveView activeView = ArcMap.Document.ActiveView;

    //If it's a polyline object, get from the user's mouse clicks.
    IPolyline polyline = GetPolylineFromMouseClicks(activeView);

    //Make a color to draw the polyline. 

    IRgbColor rgbColor = new RgbColorClass();
    rgbColor.Green = 255;

    //Add the user's drawn graphics as persistent on the map.

    AddGraphicToMap(activeView.FocusMap, polyline, rgbColor, rgbColor);

    //Best practice: Redraw only the portion of the active view that contains graphics. 
    activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}

        protected override void OnUpdate()
        {
            Enabled = ArcMap.Application != null;
        }
    }

}
0 Kudos
2 Replies
NeilClemmons
Honored Contributor
You can created the graph by using the IDataGraphT interface.  For each graph, get the surface from the elevation layer (ISurface) and use it to interpolate the z values for the polyline (you must make the polyline z-aware).  You can then create a data series on the graph using the z-values from the line.  If you like, you can plot all of the data series on the same graph.
0 Kudos
WilmerMenjivar
New Contributor
Thank you! 

I understand now, however is there any documentation I could see as an example with using (ISurface) and (IDataGraphT)?
0 Kudos