zoukankan      html  css  js  c++  java
  • AE 创建

    using System;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using ESRI.ArcGIS.ADF;
    using ESRI.ArcGIS.ADF.BaseClasses;
    using ESRI.ArcGIS.ADF.CATIDs;
    using ESRI.ArcGIS.Controls;
    using ESRI.ArcGIS.GlobeCore;
    using ESRI.ArcGIS.Carto;
    using ESRI.ArcGIS.Display;
    using ESRI.ArcGIS.Geometry;
    using ESRI.ArcGIS.esriSystem;
    using ESRI.ArcGIS.Analyst3D;
    using System.Windows.Forms;
     
    using ESRI.ArcGIS.DataSourcesFile;
    using ESRI.ArcGIS.DataSourcesGDB;
    using ESRI.ArcGIS.Framework;
    using ESRI.ArcGIS.Geodatabase;
    using ESRI.ArcGIS.SystemUI;
     
    namespace TestDrapeApplication
    {
        /// <summary>
        /// Command that works in ArcGlobe or GlobeControl
        /// </summary>
        [Guid("2d4a8248-b8d1-459f-aa4d-c73fdd4cde3b")]
        [ClassInterface(ClassInterfaceType.None)]
        [ProgId("TestDrapeApplication.AddShapeFileMemory")]
        public sealed class AddShapeFileMemory : BaseCommand
        {
            #region COM Registration Function(s)
            [ComRegisterFunction()]
            [ComVisible(false)]
            static void RegisterFunction(Type registerType)
            {
                // Required for ArcGIS Component Category Registrar support
                ArcGISCategoryRegistration(registerType);
     
                //
                // TODO: Add any COM registration code here
                //
            }
     
            [ComUnregisterFunction()]
            [ComVisible(false)]
            static void UnregisterFunction(Type registerType)
            {
                // Required for ArcGIS Component Category Registrar support
                ArcGISCategoryUnregistration(registerType);
     
                //
                // TODO: Add any COM unregistration code here
                //
            }
     
            #region ArcGIS Component Category Registrar generated code
            /// <summary>
            /// Required method for ArcGIS Component Category registration -
            /// Do not modify the contents of this method with the code editor.
            /// </summary>
            private static void ArcGISCategoryRegistration(Type registerType)
            {
                string regKey = string.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID);
                GMxCommands.Register(regKey);
                ControlsCommands.Register(regKey);
            }
            /// <summary>
            /// Required method for ArcGIS Component Category unregistration -
            /// Do not modify the contents of this method with the code editor.
            /// </summary>
            private static void ArcGISCategoryUnregistration(Type registerType)
            {
                string regKey = string.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID);
                GMxCommands.Unregister(regKey);
                ControlsCommands.Unregister(regKey);
            }
     
            #endregion
            #endregion
     
            private IGlobeHookHelper m_globeHookHelper = null;
     
            public AddShapeFileMemory()
            {
                //
                // TODO: Define values for the public properties
                //
                base.m_category = "Add Shape File to map"; //localizable text
                base.m_caption = "Add Shape File";  //localizable text
                base.m_message = "Add shape File to Map";  //localizable text 
                base.m_toolTip = "Add Shape File to Map";  //localizable text
                base.m_name = "AddShapeFileMemory";   //unique id, non-localizable (e.g. "MyCategory_MyCommand")
     
                try
                {
                    //
                    // TODO: change bitmap name if necessary
                    //
                    string bitmapResourceName = GetType().Name + ".bmp";
                    base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
                }
            }
     
            #region Overriden Class Methods
     
            /// <summary>
            /// Occurs when this command is created
            /// </summary>
            /// <param name="hook">Instance of the application</param>
            public override void OnCreate(object hook)
            {
                if (hook == null)
                    return;
     
                try
                {
                    m_globeHookHelper = new GlobeHookHelperClass();
                    m_globeHookHelper.Hook = hook;
                    if (m_globeHookHelper.ActiveViewer == null)
                    {
                        m_globeHookHelper = null;
                    }
                }
                catch
                {
                    m_globeHookHelper = null;
                }
     
                if (m_globeHookHelper == null)
                    base.m_enabled = false;
                else
                    base.m_enabled = true;
     
                // TODO:  Add other initialization code
            }
     
            /// <summary>
            /// Occurs when this command is clicked
            /// </summary>
            public override void OnClick()
            {
                //This is run after adding document with elevation Raster layer
                IGlobeDisplay globeDisplay = new GlobeDisplayClass();
     
                globeDisplay = m_globeHookHelper.GlobeDisplay;
     
     
                double lon = -86.00;
                double lat = 37.9166;
                double alt = 100.0;
                double azimuth = 175.0;
                double range = 1000; //ConvertMetersToDatasetUnits((IGlobe2)globeDisplay.Globe, 1000.0);
                double fov = 60.0;
     
                m_globeHookHelper.GlobeDisplay.RefreshViewers();
                //Elevation present to here.
                AddElement(ref globeDisplay, azimuth, fov, range, lat, lon, alt);
                // still have elevation with polygon under elevated layer.
                m_globeHookHelper.GlobeDisplay.RefreshViewers();
     
            }
     
            #endregion
     
            private void AddElement(ref IGlobeDisplay globeDisplay, double azimuth, double fov, double range, double lat, double lon, double alt)
            {
                //Depending on the ASCII file type set a variable which will control the flow of the application
                string shapeType = null;
                string sensorID = "Sim.Trip1";
                //shapeType = "points";
                //    shapeType = "polylines";
                shapeType = "polygons";
     
                string datasetType = "Shapefile";
                IWorkspace workSpace = null;
                workSpace = this.CreateWorkspace();
                IFields fields = CreateFields(shapeType);
                //Create the Feature Class 
                IFeatureClass featureClass = CreateFeatureClass(workSpace, null, shapeType, fields, null, null, "");
     
                AddShape(ref featureClass, ref workSpace, azimuth, fov, range, lat, lon, alt, sensorID);
     
                //Create a Feature Layer to display the data in ArcMap
                IFeatureLayer featureLayer = new FeatureLayerClass();
                featureLayer.FeatureClass = featureClass;
                featureLayer.Name = featureClass.AliasName;
                featureLayer.Visible = true;
                IGeoFeatureLayer lyr = (IGeoFeatureLayer)featureLayer;
                IRgbColor lyrColor = new RgbColorClass();
                lyrColor.Red = 255;
                lyrColor.Green = 0;
                lyrColor.Blue = 0; 
                ISimpleFillSymbol sfSymbol = new SimpleFillSymbolClass();
                sfSymbol.Color = lyrColor;
                sfSymbol.Outline.Width = 0.4;
                sfSymbol.Style = esriSimpleFillStyle.esriSFSSolid;
                ISimpleRenderer lyrSimRend = new SimpleRendererClass();
                lyrSimRend.Symbol = (ISymbol)sfSymbol;
     
                lyr.Renderer = (IFeatureRenderer)lyrSimRend;
     
                ((IScene)globeDisplay.Globe).AddLayer(featureLayer, true);
                ILayer lyrCreated = featureLayer;
                
                ((IActiveView)globeDisplay.Globe).Extent = lyrCreated.AreaOfInterest;
            }
            private IWorkspace CreateWorkspace()
            {
                try
                {
     
                    IWorkspaceFactory workspaceFactory = null;
                    // Instantiate a Shapefile workspace factory
                    //workspaceFactory = new ShapefileWorkspaceFactoryClass();
                    Type factoryType = Type.GetTypeFromProgID("esriDataSourcesFile.ShapefileWorkspaceFactory");
                    workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
     
                    //Create a directory hierarchy to seperate out datasets created for Points, Polylines, and Polygons
     
                    IWorkspaceName workspaceName = workspaceFactory.Create(Application.StartupPath + @"ShapeFile", "Shapefile", null, 0);
                    IName Name = (IName)workspaceName;
                    IWorkspace workspace = (IWorkspace)(Name.Open());
                    return workspace;
                }
                catch (Exception ex)
                {
                    String mess = ex.Message;
                    MessageBox.Show(mess);
                    return null;
                }
     
     
            }
     
            private IFields CreateFields(string shapeType)
            {
     
                // Create a new fields collection.
                IFields fields = new FieldsClass();
     
                // Cast to IFieldsEdit to modify the properties of the fields collection.
                IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
     
                // Set the number of fields the collection will contain.
                fieldsEdit.FieldCount_2 = 5;
     
                // Create the ObjectID field.
                IField oidField = new FieldClass();
                IFieldEdit oidFieldEdit = (IFieldEdit)oidField;
                oidFieldEdit.Name_2 = "ObjectID";
                oidFieldEdit.AliasName_2 = "FID";
                oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
                fieldsEdit.set_Field(0, oidField);
     
                // Create the myID field.
                IField myIDField = new FieldClass();
                IFieldEdit myIDFieldEdit = (IFieldEdit)myIDField;
                myIDFieldEdit.Name_2 = "SensorID";
                myIDFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                fieldsEdit.set_Field(1, myIDField);
     
                // Create the text field.
                IField textField = new FieldClass();
                IFieldEdit textFieldEdit = (IFieldEdit)textField;
                textFieldEdit.Length_2 = 30; // Only string fields require that you set the length.
                textFieldEdit.Name_2 = "Str_Att1";
                textFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                fieldsEdit.set_Field(2, textField);
     
                // Create the numeric field.
                IField numericField = new FieldClass();
                IFieldEdit numericFieldEdit = (IFieldEdit)numericField;
                numericFieldEdit.Name_2 = "Num_Att1";
                numericFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
                fieldsEdit.set_Field(3, numericField);
     
                //Create the SHAPE field.
                IField shapeField = new FieldClass();
                IFieldEdit shapeFieldEdit = (IFieldEdit)shapeField;
                shapeFieldEdit.Name_2 = "SHAPE";
                shapeFieldEdit.IsNullable_2 = true;
                shapeFieldEdit.Required_2 = true;
     
                IGeometryDef geometryDef = new GeometryDefClass();
                IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
                geometryDefEdit.AvgNumPoints_2 = 1;
                geometryDefEdit.GridCount_2 = 0;
                geometryDefEdit.HasM_2 = false;
                geometryDefEdit.HasZ_2 = false;
     
                //Depending on the feature type (ie. Point, Polyline, or Polygon)
                //set the appropriate .Type_2 and .GeometryType_2 Properties.
                if (shapeType == "points")
                {
                    shapeFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                    geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
                }
                else if (shapeType == "polylines")
                {
                    shapeFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                    geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
                }
                else if (shapeType == "polygons")
                {
                    shapeFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                    geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
                }
     
                //Generate a default Spatial Reference
                ISpatialReference spatialReference = MakeSpatialReference(esriSRProjCSType.esriSRProjCS_Sphere_AzimuthalEquidistant);
                geometryDefEdit.SpatialReference_2 = spatialReference;
     
                shapeFieldEdit.GeometryDef_2 = (GeometryDef)geometryDefEdit;
                fieldsEdit.set_Field(4, shapeFieldEdit);
     
                return fields;
     
            }
     
     
            ///<summary>Helper to create a Feature Class.</summary>
            public IFeatureClass CreateFeatureClass(IWorkspace workspace, IFeatureDataset featureDataset, System.String featureClassName, IFields fields, ESRI.ArcGIS.esriSystem.UID CLSID, ESRI.ArcGIS.esriSystem.UID CLSEXT, System.String strConfigKeyword)
            {
     
                if (featureClassName == "")
                {
                    return null; // name was not passed in
                }
                featureClassName = "newShapeFile";
                IFeatureClass featureClass = null;
                IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace; // Explicit Cast
     
                // assign the class id value if not assigned
                if (CLSID == null)
                {
                    CLSID = new ESRI.ArcGIS.esriSystem.UIDClass();
                    CLSID.Value = "esriGeoDatabase.Feature";
                }
     
                System.String strShapeField = "";
     
                // locate the shape field
                //for (Int32 j = 0; j < fields.FieldCount; j++)
                //{
                //    if (fields.get_Field(j).Type == esriFieldType.esriFieldTypeGeometry)
                //    {
                //        strShapeField = fields.get_Field(j).Name;
                //    }
                //}
                strShapeField = "SHAPE";
                // finally create and return the feature class
     
                // no feature dataset passed in, create at the workspace level
                try
                {
                    featureClass = featureWorkspace.CreateFeatureClass(featureClassName, fields, CLSID, CLSEXT, esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);
                }
                catch (Exception ex)
                {
                    String mess = ex.Message;
                    MessageBox.Show(mess);
                }
                    return featureClass;
     
            }
     
            public ISpatialReference MakeSpatialReference(esriSRProjCSType coordinateSystem)
            {
     
                ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
     
                //Create a projected coordinate system and define its domain, resolution, and x,y tolerance.
                ISpatialReferenceResolution spatialReferenceResolution = spatialReferenceFactory.CreateProjectedCoordinateSystem(System.Convert.ToInt32(coordinateSystem)) as ISpatialReferenceResolution;
                spatialReferenceResolution.ConstructFromHorizon();
                ISpatialReferenceTolerance spatialReferenceTolerance = spatialReferenceResolution as ISpatialReferenceTolerance;
                spatialReferenceTolerance.SetDefaultXYTolerance();
                ISpatialReference spatialReference = spatialReferenceResolution as ISpatialReference;
     
                return spatialReference;
     
            }
     
            private void AddShape(ref IFeatureClass FeatureClass, ref IWorkspace workspace, double azimuth, double fov, double range, double lat, double lon, double alt, String sensorID)
            {
                // Start an edit session and edit operation.
                IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
                workspaceEdit.StartEditing(true);
                workspaceEdit.StartEditOperation();
     
                int IDAttributeFieldIndex = FeatureClass.FindField("SensorID");
                int StringAttributeFieldIndex = FeatureClass.FindField("Str_Att1");
                int NumericAttributeFieldIndex = FeatureClass.FindField("Num_Att1");
     
                ComReleaser comReleaser = new ComReleaser();
                // Create a new insert cursor with buffering.
                IFeatureCursor featureCursor = FeatureClass.Insert(true);
                comReleaser.ManageLifetime(featureCursor);
     
                // Create a feature buffer. This will store the values common to every
                // feature to be installed.
                IFeatureBuffer featureBuffer = FeatureClass.CreateFeatureBuffer();
                comReleaser.ManageLifetime(featureBuffer);
     
     
                IPolygon polygon = makePolygon(azimuth, fov, range, lat, lon, alt);
                featureBuffer.Shape = (IGeometry)polygon;
                featureBuffer.set_Value(IDAttributeFieldIndex, sensorID);
                featureBuffer.set_Value(StringAttributeFieldIndex, "Try this");
                featureBuffer.set_Value(IDAttributeFieldIndex, 2);
                featureCursor.InsertFeature(featureBuffer);
     
                // Flush the cursor.
                featureCursor.Flush();
     
                // All of the features were successfully inserted; stop the edit operation
                // and stop the edit session, saving the changes made in edit operations.
                workspaceEdit.StopEditOperation();
                workspaceEdit.StopEditing(true);
            }
            #region "Build Polygon"
     
            /// <summary>
            /// Takes input of azimuth field of view and range with position and altitude
            /// to make a circular arc polygon to add as a symbol for element in layer.
            /// </summary>
            /// <param name="azimuth"></param>
            /// <param name="fov"></param>
            /// <param name="range"></param>
            /// <param name="lat"></param>
            /// <param name="lon"></param>
            /// <param name="alt"></param>
            /// <returns>IPolygon polygon</returns>
            private IPolygon makePolygon(double azimuth, double fov, double range, double lat, double lon, double alt)
            {
                object missing = System.Reflection.Missing.Value;
                //IZAware zAware;
                IPolygon polygon = new PolygonClass();
     
                IPoint centerPoint = new PointClass();
                IPoint startPoint = new PointClass();
                IPoint endPoint = new PointClass();
                Boolean isCCW = true;
                Boolean isMinor = false;
                centerPoint.SpatialReference = MakeSpatialReference(esriSRProjCSType.esriSRProjCS_Sphere_AzimuthalEquidistant);
                startPoint.SpatialReference = centerPoint.SpatialReference;
                endPoint.SpatialReference = centerPoint.SpatialReference;
                //zAware = centerPoint as IZAware;
                ////zAware.ZAware = true;
     
                //zAware = startPoint as IZAware;
                ////zAware.ZAware = true;
     
                //zAware = endPoint as IZAware;
                ////zAware.ZAware = true;
     
                centerPoint.PutCoords(lon, lat);
                ////centerPoint.Z = alt;
                double Xray = centerPoint.X;
                double Yankee = centerPoint.Y;
     
                ICircularArc circularArc = new CircularArcClass();
     
     
                ISegmentCollection ring1 = new RingClass();
                ring1.AddSegment(circularArc as ISegment, ref missing, ref missing);
                double fovRadian = 0.0;
                fovRadian = (fov * 2 * Math.PI) / 360;
                circularArc.PutCoordsByAngle(centerPoint, GetFromAngle(azimuth, fov), fovRadian, range);
     
                circularArc.QueryCoords(centerPoint, startPoint, endPoint, ref isCCW, ref isMinor);
     
                ILine lineOut = new LineClass();
                ILine lineIn = new LineClass();
                lineOut.PutCoords(centerPoint, startPoint);
                lineIn.PutCoords(endPoint, centerPoint);
     
                ISegmentCollection segColl = new PolygonClass();
                segColl.AddSegment((ISegment)lineOut, ref missing, ref missing);
                segColl.AddSegment((ISegment)circularArc, ref missing, ref missing);
                segColl.AddSegment((ISegment)lineIn, ref missing, ref missing);
                polygon = segColl as IPolygon;
                //IGeometryCollection geometryCollection = polygon as IGeometryCollection;
                //geometryCollection.AddGeometry(segColl as IGeometry, ref missing, ref missing);
     
                //geometryCollection.GeometriesChanged();
                return polygon;
     
            }
     
            /// <summary>
            /// Converts Azimuth and Field of View width to geometric 
            /// start angle of circular arc.
            /// </summary>
            /// <param name="azimuth"></param>
            /// <param name="FOV"></param>
            /// <returns>Double startAngle</returns>
            private double GetFromAngle(double azimuth, double FOV)
            {
                double startAngle = 0.0;
                double fovRadian = 0.0;
                fovRadian = (FOV * 2 * Math.PI) / 360;
                startAngle = AzimuthToAngle(azimuth) - (.5 * fovRadian);
                return startAngle;
            }
            /// <summary>
            /// Converts Azimuth to geometric angle of arc.
            /// </summary>
            /// <param name="azimuth"></param>
            /// <returns>double angle</returns>
            private double AzimuthToAngle(double azimuth)
            {
                double angle = 0.0;
                double angleRadian = 0.0;
     
                angleRadian = (azimuth * 2 * Math.PI) / 360;
                angle = (2 * Math.PI) - (angleRadian - Math.PI / 2);
                if (angle >= 2 * Math.PI)
                {
                    angle -= 2 * Math.PI;
                }
                return angle;
            }
     
            private double ConvertMetersToDatasetUnits(IGlobe2 globe, double meters)
            {
                try
                {
                    esriUnits units = globe.GlobeUnits;
                    IUnitConverter cvtr = new UnitConverter();
                    double mapUnits = cvtr.ConvertUnits(meters, esriUnits.esriMeters, units);
                    return mapUnits;
                }
                catch (Exception ex)
                {
                    String mess = ex.Message;
                    return -1.0;
                }
     
            }
     
     
            #endregion
     
        }
    }
    

      

  • 相关阅读:
    【译】SQL Server误区30日谈Day3即时文件初始化特性可以在SQL Server中开启和关闭
    有关TSQL的10个好习惯
    【译】SQL Server误区30日谈Day6有关NULL位图的三个误区
    一次由重复索引导致的问题
    【译】SQL Server误区30日谈Day2DBCC CHECKDB会导致阻塞
    【译】SQL Server误区30日谈Day1正在运行的事务在服务器故障转移后继续执行
    CodeFileBaseClass 属性
    Mako 模板系统文档翻译(2) 语法
    终于搞定了 django 的 ajax 方式上传图片
    ASP.NET Ajax 调试技巧:用 FireBug 调试 UpdatePanel 不更新问题
  • 原文地址:https://www.cnblogs.com/liuyongpingblog/p/9077879.html
Copyright © 2011-2022 走看看