zoukankan      html  css  js  c++  java
  • 我最近的研究成果(IGeometry.Project and IGeometry.SpatialReference)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Collections;


    using ESRI.ArcGIS.Geodatabase;
    using ESRI.ArcGIS.SystemUI;
    using ESRI.ArcGIS.esriSystem;
    using ESRI.ArcGIS.Carto;
    using ESRI.ArcGIS.Controls;
    using ESRI.ArcGIS.DataSourcesGDB;
    using ESRI.ArcGIS.DataSourcesFile;
    using ESRI.ArcGIS.Geometry;
    using ESRI.ArcGIS.Display;
    using ESRI.ArcGIS.AnalysisTools; //使用GP工具
    using ESRI.ArcGIS.Geoprocessing;
    using ESRI.ArcGIS.Geoprocessor;



    namespace SearchAndDisplay
    {
        public partial class Form1 : Form
        {
            //传递数据之用
            private IFeatureClass pCommonPolygonClass;
            private IFeatureClass pCommonPolylineClass;
            private IFeatureClass pCommonPointClass;
            private IFeatureWorkspace pPublicFeatureWorkspace=null;

            private IArray pArray;
            private bool isFileExist;
            private bool isGDBExist;

            //传递数据库中的数据
            private string XY;
            private string Globle;
            private double falseEasting;
            private double falseNorthing;
            private double centralMeridian;
            private double scaleFactor;
            private double latitudeOfOrigion;

            private string[] XandY;
            private IFeatureClass pPublicInMemoryClass;
            public Form1()
            {
                InitializeComponent();
            }

            //Create GCS:Beijing54
            private ISpatialReference GetGCSBeijing54()
            {
                ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
                ISpatialReference pSR = pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954);
                pSR.SetDomain(-400,-400,400,400);
                return pSR;
     
            }


            //Create GCS:Xi'an80
            private ISpatialReference GetGCSXian80()
            {
                ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
                //pSRF.CreateProjectedCoordinateSystem(esriSRProjCS4Type.esriSRProjCS_Xian1980_GK_Zone_19);
                //pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCS3Type.esriSRGeoCS_Xian1980);
                ISpatialReference pSR = pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCS3Type.esriSRGeoCS_Xian1980);
                pSR.SetDomain(-400, -400, 400, 400);
                return pSR;
            }


            //Create GCS:WGS1984
            private ISpatialReference GetGCSWGS1984()
            {
                ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
                ISpatialReference pSR = pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
                pSR.SetDomain(-400, -400, 400, 400);
                return pSR;
            }
            //Create PCS:Xian80 zone19
            private ISpatialReference GetPCSXian80()
            {
                ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
                ISpatialReference pSR = pSRF.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Xian1980_GK_Zone_19);
                pSR.SetDomain(13876800, -10002100, 900709923374.099, 900733802274.099);
                return pSR;
            }


           //Create PCS:Beijng54 zone19
           private ISpatialReference GetPCSBeijing54()
           {
               ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
               ISpatialReference pSR = pSRF.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_Beijing1954GK_19);
               pSR.SetDomain(14876700, -10002300, 900734802174.099, 900709923174.099);
               return pSR;

            }
            
           //Create PCS:WGS1984 zong49
           private ISpatialReference    GetPCSWGS1984()
           {
               ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
               ISpatialReference pSR = pSRF.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_WGS1984UTM_49N);
               pSR.SetDomain(-5120900, -9998100, 900714804574.099, 900709927374.099);
               return pSR;

            }
           
            //Load 3 featureClasses with different spatial reference
            private void Form1_Load(object sender, EventArgs e)
            {
                axMapControl1.Map.SpatialReference = GetPCSBeijing54();
                axMapControl2.Map.SpatialReference = GetPCSXian80();
                axMapControl3.Map.SpatialReference = GetPCSWGS1984();

            }
            private void TabsChanged()
            {
              
            }
            
            //add 3 layers to 3 mapcontrols with the different spatial reference
            private void button8_Click(object sender, EventArgs e)
            {
                IPoint pPoint=null ;
                IPolyline pL = null;
                object _missing = Type.Missing;


                IWorkspaceFactory pSdeWorkspaceFactory = new SdeWorkspaceFactory();
                IPropertySet pPropertySet= new PropertySetClass();
                pPropertySet.SetProperty("Server","siwei-gr7bzmd3q");
                pPropertySet.SetProperty("Instance","5008");
                pPropertySet.SetProperty("Database","sdeTest");
                pPropertySet.SetProperty("user","sa");
                pPropertySet.SetProperty("password","zhangjun1130");
                pPropertySet.SetProperty("version","sde.DEFAULT");
                IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pSdeWorkspaceFactory.Open(pPropertySet, 0);
                pPublicFeatureWorkspace =pFeatureWorkspace;
                
                IWorkspaceEdit pWorkspaceEdit = (IWorkspaceEdit)pFeatureWorkspace;
                IFeatureClass pFeatureClass;
                IFeatureLayer pFeatureLayer;

                pFeatureClass = pFeatureWorkspace.OpenFeatureClass("sdeTest.DBO.DomBeijing54");
                pFeatureLayer = new FeatureLayerClass();
                pFeatureLayer.FeatureClass = pFeatureClass;
                axMapControl1.AddLayer(pFeatureLayer);

                pFeatureClass = pFeatureWorkspace.OpenFeatureClass("sdeTest.DBO.DomXian80");
                pFeatureLayer = new FeatureLayerClass();
                pFeatureLayer.FeatureClass = pFeatureClass;
                axMapControl2.AddLayer(pFeatureLayer);

                pFeatureClass = pFeatureWorkspace.OpenFeatureClass("sdeTest.DBO.DomWGS84");
                pFeatureLayer = new FeatureLayerClass();
                pFeatureLayer.FeatureClass = pFeatureClass;
                axMapControl3.AddLayer(pFeatureLayer);




                #region 暂时不用
                //// 摄区
                //#region 搞摄区
                //pWorkspaceEdit.StartEditing(true);
                //pWorkspaceEdit.StartEditOperation();

                //    IFeatureClass pPolygonsClassOld = pFeatureWorkspace.OpenFeatureClass("polygons");
                //    ITable pTable = (ITable)pPolygonsClassOld;
                //    if (pTable != null)
                //    {
                //        pTable.DeleteSearchedRows(null);

                //    }

                //IFeatureClass pPolygonsClass = pFeatureWorkspace.OpenFeatureClass("polygons");
                //isGDBExist = true;

                //IFeature pPolygonsFeaure;
                //pPolygonsFeaure= pPolygonsClass.CreateFeature();

                //IPolygon pPolygon = new PolygonClass();
                //IPointCollection pPointCollection = (IPointCollection)pPolygon;
                //pPoint = new PointClass();
                //pPoint.PutCoords(10, 10);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(15, 10);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(15, 8);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(18, 8);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(18, 4);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(10, 4);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPolygonsFeaure.Shape = pPolygon;
                //pPolygon.Close();
                //pPolygonsFeaure.Store();



                //pPolygonsFeaure = pPolygonsClass.CreateFeature();
                //pPolygon = new PolygonClass();
                //pPointCollection = (IPointCollection)pPolygon;
                //pPoint = new PointClass();
                //pPoint.PutCoords(20, 8);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(25, 8);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(25, 4);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(20, 4);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPolygonsFeaure.Shape = pPolygon;
                //pPolygon.Close();
                //pPolygonsFeaure.Store();


                //#endregion

                //// 航线
                //#region 搞航线
                //IFeatureClass pPolylineClass = pFeatureWorkspace.OpenFeatureClass("polylines");
                //IFeature pPolylinesFeature = null;

                //pPolylinesFeature = pPolylineClass.CreateFeature();
                //pL = new PolylineClass();
                //pPointCollection = (IPointCollection)pL;
                //pPoint = new PointClass();
                //pPoint.PutCoords(9.5, 9.5);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(15.5, 9.5);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPolylinesFeature.Shape = pL;
                //pPolylinesFeature.Store();

                //pPolylinesFeature = pPolylineClass.CreateFeature();
                //pL = new PolylineClass();
                //pPointCollection = (IPointCollection)pL;
                //pPoint = new PointClass();
                //pPoint.PutCoords(9.5, 6.5);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(15.5, 6.5);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPolylinesFeature.Shape = pL;
                //pPolylinesFeature.Store();

                //pPolylinesFeature = pPolylineClass.CreateFeature();
                //pL = new PolylineClass();
                //pPointCollection = (IPointCollection)pL;
                //pPoint = new PointClass();
                //pPoint.PutCoords(9.5, 4.5);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPoint.PutCoords(15.5, 4.5);
                //pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                //pPolylinesFeature.Shape = pL;
                //pPolylinesFeature.Store();
                //#endregion

                //// 像点
                //#region 搞像点
                //IFeatureClass pPointClass = pFeatureWorkspace.OpenFeatureClass("points");
                //IFeature pPointFeature = null;

                //pPointFeature = pPointClass.CreateFeature();
                //pPoint = new PointClass();
                //pPoint.PutCoords(9.7, 9.5);
                //pPointFeature.Shape = pPoint;
                //pPointFeature.Store();

                //pPointFeature = pPointClass.CreateFeature();
                //pPoint = new PointClass();
                //pPoint.PutCoords(12.7, 9.5);
                //pPointFeature.Shape = pPoint;
                //pPointFeature.Store();

                //pPointFeature = pPointClass.CreateFeature();
                //pPoint = new PointClass();
                //pPoint.PutCoords(14.7, 9.5);
                //pPointFeature.Shape = pPoint;
                //pPointFeature.Store();

                //pPointFeature = pPointClass.CreateFeature();
                //pPoint = new PointClass();
                //pPoint.PutCoords(9.7, 6.5);
                //pPointFeature.Shape = pPoint;
                //pPointFeature.Store();

                //pPointFeature = pPointClass.CreateFeature();
                //pPoint = new PointClass();
                //pPoint.PutCoords(12.7, 6.5);
                //pPointFeature.Shape = pPoint;
                //pPointFeature.Store();

                //pPointFeature = pPointClass.CreateFeature();
                //pPoint = new PointClass();
                //pPoint.PutCoords(14.7, 6.5);
                //pPointFeature.Shape = pPoint;
                //pPointFeature.Store();

                //pPointFeature = pPointClass.CreateFeature();
                //pPoint = new PointClass();
                //pPoint.PutCoords(9.7, 4.5);
                //pPointFeature.Shape = pPoint;
                //pPointFeature.Store();

                //pPointFeature = pPointClass.CreateFeature();
                //pPoint = new PointClass();
                //pPoint.PutCoords(12.7, 4.5);
                //pPointFeature.Shape = pPoint;
                //pPointFeature.Store();

                //pPointFeature = pPointClass.CreateFeature();
                //pPoint = new PointClass();
                //pPoint.PutCoords(14.7, 4.5);
                //pPointFeature.Shape = pPoint;
                //pPointFeature.Store();

                //#endregion

                //pWorkspaceEdit.StopEditOperation();
                //pWorkspaceEdit.StopEditing(true);

                //pCommonPolygonClass = pPolygonsClass;
                //pCommonPolylineClass = pPolylineClass;
                //pCommonPointClass = pPointClass;
                #endregion

            }

            private void button9_Click(object sender, EventArgs e)
            {


                IWorkspaceFactory pFeatureWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
                IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pFeatureWorkspaceFactory.OpenFromFile("D:/Work", 0);
                IFields pFields = pCommonPolygonClass.Fields;
                if (isFileExist == true)
                {
                    IFeatureClass pPolygonsFeatureClassOld = pFeatureWorkspace.OpenFeatureClass("Newpolygons");
                    ITable pTable = (ITable)pPolygonsFeatureClassOld;
                    if (pTable != null)
                    {
                        pTable.DeleteSearchedRows(null);
                    }
                }
                #region 摄区出库
        
                IFeatureClass pPolygonsFeatureClass = pFeatureWorkspace.CreateFeatureClass("Newpolygons", pFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
                isFileExist = true;
                IFeature pPolygonFeaure;
                IFeature pConvertFeature;
                //IFeatureCursor pPolygonCursor = pCommonPolygonClass.Search(null, true);
                //IFeature pFeaure = pPolygonCursor.NextFeature();

                for (int i = 0; i < pArray.Count;i++ )
                {
                    pPolygonFeaure = pPolygonsFeatureClass.CreateFeature();
                    pConvertFeature = (IFeature)pArray.get_Element(i);
                    pPolygonFeaure.Shape = pConvertFeature.Shape;
                    pPolygonFeaure.Store();

                }
                #endregion

                #region 航线出库
                //pFields = pCommonPolylineClass.Fields;
                //IFeatureClass pPolylineFeatureClass = pFeatureWorkspace.CreateFeatureClass("Newpolines", pFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
                //IFeature pPloylineFeature;

                //IFeatureCursor pPolylineCursor = pCommonPolylineClass.Search(null, true);
                //IFeature pFeature1 = pPolylineCursor.NextFeature();
                //while (pFeature1!= null)
                //{
                //    pPloylineFeature = pPolylineFeatureClass.CreateFeature();
                //    pPloylineFeature.Shape = pFeature1.Shape;
                //    pPloylineFeature.Store();
                //    pFeature1 = pPolylineCursor.NextFeature();

                //}

                #endregion

                #region 像点
                //pFields = pCommonPointClass.Fields;
                //IFeatureClass pPointsFeatureClass = pFeatureWorkspace.CreateFeatureClass("Newpoints", pFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
                //IFeature pPointFeaure;

                //IFeatureCursor pPointCursor = pCommonPointClass.Search(null, true);
                //IFeature pFeature2 = pPointCursor.NextFeature();
                
                //while(pFeature2!=null)
                //{
                //    pPointFeaure=pPointsFeatureClass.CreateFeature();
                //    pPointFeaure.Shape = pFeature2.Shape;
                //    pPointFeaure.Store();
                //    pFeature2 = pPointCursor.NextFeature();



                //}


                #endregion


            }

            private void radioButton2_CheckedChanged(object sender, EventArgs e)
            {

            }

            private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
            {

            }

            private void button1_Click(object sender, EventArgs e)
            {
                IFeatureLayer pPolygonLayer=new FeatureLayerClass();
                IFeatureLayer pPolylineLayer= new FeatureLayerClass();
                IFeatureLayer pPointLayer= new FeatureLayerClass();
                pPolygonLayer.FeatureClass=pCommonPolygonClass;
                pPolylineLayer.FeatureClass=pCommonPolylineClass;
                pPointLayer.FeatureClass=pCommonPointClass;

                axMapControl1.AddLayer(pPolygonLayer);
                axMapControl1.AddLayer(pPolylineLayer);
                axMapControl1.AddLayer(pPointLayer);





            }

            private void axMapControl1_OnMouseDown_1(object sender, IMapControlEvents2_OnMouseDownEvent e)
            {
                if (e.button == 2)
                {
                    ISpatialReference pSR = axMapControl1.Map.SpatialReference;
                    ILayer pLayer = axMapControl1.Map.get_Layer(0);
                    IFeatureLayer pFeatureLayer = (IFeatureLayer)pLayer;
                    int count = pFeatureLayer.FeatureClass.FeatureCount(null);
                    MessageBox.Show("投影名字是:" + pSR.Name + "  图层Feature个数是:" + count);
                }
            }

            private void axMapControl2_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
            {
                if (e.button == 2)
                {
                    ISpatialReference pSR = axMapControl2.Map.SpatialReference;
                    ILayer pLayer = axMapControl2.Map.get_Layer(0);
                    IFeatureLayer pFeatureLayer = (IFeatureLayer)pLayer;
                    int count = pFeatureLayer.FeatureClass.FeatureCount(null);
                    MessageBox.Show("投影名字是:" + pSR.Name + "  图层Feature个数是:" + count);
                }
            }

            private void axMapControl3_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
            {
                if (e.button == 2)
                {
                    ISpatialReference pSR = axMapControl3.Map.SpatialReference;
                    ILayer pLayer = axMapControl3.Map.get_Layer(0);
                    IFeatureLayer pFeatureLayer = (IFeatureLayer)pLayer;
                    int count = pFeatureLayer.FeatureClass.FeatureCount(null);
                    MessageBox.Show("投影名字是:" + pSR.Name + "  图层Feature个数是:" + count);
                }
            }

            private void tabControl1_Selected(object sender, TabControlEventArgs e)
            {


            }

            private void tabControl1_Click(object sender, EventArgs e)
            {
               

            }

            private void axMapControl3_TabIndexChanged(object sender, EventArgs e)
            {



            }

            //切换Tabs使用的方法
            private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
            {
                switch (tabControl1.SelectedIndex)
                {
                    case 0:
                        axToolbarControl1.SetBuddyControl(axMapControl1);
                        Console.WriteLine("0");
                        break;
                    case 1:

                        axToolbarControl1.SetBuddyControl(axMapControl2);
                        Console.WriteLine("1");
                        break;
                    case 2:
                        axToolbarControl1.SetBuddyControl(axMapControl3);
                        Console.WriteLine("2");
                        break;
                    default:
                        break;
                }

            }

            private void button2_Click(object sender, EventArgs e)
            {
                IEnvelope pEnvelop = new EnvelopeClass();
                ILayer pLayer=axMapControl1.Map.get_Layer(0);
                IFeatureLayer pFeatureLayer=(IFeatureLayer)pLayer;
                IFeatureClass pFeatureClass=pFeatureLayer.FeatureClass;
                IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
                IFeature pFeature = pFeatureCursor.NextFeature();
                while (pFeature != null)
                {
                    pEnvelop.Union(pFeature.Shape.Envelope);
                    pFeature = pFeatureCursor.NextFeature();
                }
                pEnvelop.Expand(1.2, 1.2, true);
                axMapControl1.ActiveView.Extent = pEnvelop.Envelope;
                axMapControl1.Refresh();
            }

            private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
            {
                label2.Text = e.mapX.ToString();
                label3.Text = e.mapY.ToString();
            }

            private void axMapControl2_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
            {
                label2.Text = e.mapX.ToString();
                label3.Text = e.mapY.ToString();
            }

            private void axMapControl3_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
            {
                label2.Text = e.mapX.ToString();
                label3.Text = e.mapY.ToString();
            }

            private void button3_Click(object sender, EventArgs e)
            {
                ICommand command = new ControlsAddDataCommandClass();
                command.OnCreate(axMapControl1.Object);
                command.OnClick();
            }


            //新建类似西安80PCS
            private IProjectedCoordinateSystem CreatePCSBasedOnXianan80(IGeographicCoordinateSystem pGCS, double falseEasting, double fasleNorthing,
               double centralMeridian, double scaleFactor, double latitudeOfOrigion)//
            {       
                 ISpatialReferenceFactory2 pSpatialReferenceFactory2=new SpatialReferenceEnvironmentClass();
                 IProjectionGEN pProjectionGEN=(IProjectionGEN)pSpatialReferenceFactory2.CreateProjection((int)esriSRProjectionType.esriSRProjection_GaussKruger);
                 IGeographicCoordinateSystem pGeographicCoordinateSystem = pSpatialReferenceFactory2.CreateGeographicCoordinateSystem((int)esriSRGeoCS3Type.esriSRGeoCS_Xian1980);
                 (pGeographicCoordinateSystem as ISpatialReference).SetDomain(-400, -400, 400, 400);
                 ILinearUnit pLinearUnit=(ILinearUnit)pSpatialReferenceFactory2.CreateUnit((int)esriSRUnitType.esriSRUnit_Meter);
                 IParameter[] pParameters=pProjectionGEN.GetDefaultParameters();
                 for( int i=0;i< pParameters.Length;i++)
                 {
                      IParameter currentParameter=pParameters[i];
                  }
                    //修改parameters
                IParameter falseEastingParameter = pParameters[0];
                falseEastingParameter.Value = falseEasting;
                IParameter fasleNorthingParameter = pParameters[1];
                fasleNorthingParameter.Value = fasleNorthing;
                IParameter centralMeridianParameter = pParameters[2];
                centralMeridianParameter.Value =centralMeridian;
                IParameter scaleFactorParameter = pParameters[3];
                scaleFactorParameter.Value =scaleFactor;
                IParameter latitudeOfOrigionParameter = pParameters[4];
                latitudeOfOrigionParameter.Value =latitudeOfOrigion;
                IProjectedCoordinateSystemEdit pPCSE = new ProjectedCoordinateSystemClass();
                object name = "new Dom Project cooridinate system";
                object alias="nDPos";
                object abbreviation="NDPCS";
                object remarks = "most eastern province in China";
                object usage="when making maps of new Dom";
                object gcsobject = pGeographicCoordinateSystem as object;
                object unitobject = pLinearUnit as object;
                object projection = pProjectionGEN as object;
                object parameters = pParameters as object;

                pPCSE.Define(ref name,ref alias,ref abbreviation,ref remarks,ref usage,ref gcsobject,ref unitobject,ref projection,ref parameters);
                IProjectedCoordinateSystem pPCS = (IProjectedCoordinateSystem)pPCSE;
                {
                    (pPCS as ISpatialReferenceTolerance).XYTolerance = 0.000001;
                    pPCS.SetDomain(-10002100, -10002100, 900709923374.099, 900733802274.099);
           
                }
                return pPCS;
                


             }

            //新建类似北京54PCS
            private IProjectedCoordinateSystem CreatePCSBasedOnBeijing54(IGeographicCoordinateSystem pGCS, double falseEasting, double fasleNorthing,
              double centralMeridian, double scaleFactor, double latitudeOfOrigion)//
            {
                ISpatialReferenceFactory2 pSpatialReferenceFactory2 = new SpatialReferenceEnvironmentClass();
                IProjectionGEN pProjectionGEN = (IProjectionGEN)pSpatialReferenceFactory2.CreateProjection((int)esriSRProjectionType.esriSRProjection_GaussKruger);
                IGeographicCoordinateSystem pGeographicCoordinateSystem = pSpatialReferenceFactory2.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954);
                (pGeographicCoordinateSystem as ISpatialReference).SetDomain(-400, -400, 400, 400);
                ILinearUnit pLinearUnit = (ILinearUnit)pSpatialReferenceFactory2.CreateUnit((int)esriSRUnitType.esriSRUnit_Meter);
                IParameter[] pParameters = pProjectionGEN.GetDefaultParameters();
                for (int i = 0; i < pParameters.Length; i++)
                {
                    IParameter currentParameter = pParameters[i];
                }
                //修改parameters
                IParameter falseEastingParameter = pParameters[0];
                falseEastingParameter.Value = falseEasting;
                IParameter fasleNorthingParameter = pParameters[1];
                fasleNorthingParameter.Value = fasleNorthing;
                IParameter centralMeridianParameter = pParameters[2];
                centralMeridianParameter.Value = centralMeridian;
                IParameter scaleFactorParameter = pParameters[3];
                scaleFactorParameter.Value = scaleFactor;
                IParameter latitudeOfOrigionParameter = pParameters[4];
                latitudeOfOrigionParameter.Value = latitudeOfOrigion;
                IProjectedCoordinateSystemEdit pPCSE = new ProjectedCoordinateSystemClass();
                object name = "new Dom Project cooridinate system";
                object alias = "nDPos";
                object abbreviation = "NDPCS";
                object remarks = "most eastern province in China";
                object usage = "when making maps of new Dom";
                object gcsobject = pGeographicCoordinateSystem as object;
                object unitobject = pLinearUnit as object;
                object projection = pProjectionGEN as object;
                object parameters = pParameters as object;

                pPCSE.Define(ref name, ref alias, ref abbreviation, ref remarks, ref usage, ref gcsobject, ref unitobject, ref projection, ref parameters);
                IProjectedCoordinateSystem pPCS = (IProjectedCoordinateSystem)pPCSE;
                {
                    (pPCS as ISpatialReferenceTolerance).XYTolerance = 0.000001;
                    pPCS.SetDomain(-10002300, -10002300, 900734802174.099, 900709923174.099);
                }
                return pPCS;



            }


            //新建类似WGS1984PCS
            private IProjectedCoordinateSystem CreatePCSBasedOnWGS1984(IGeographicCoordinateSystem pGCS, double falseEasting, double fasleNorthing,
              double centralMeridian, double scaleFactor, double latitudeOfOrigion)//
            {
                ISpatialReferenceFactory2 pSpatialReferenceFactory2 = new SpatialReferenceEnvironmentClass();
                IProjectionGEN pProjectionGEN = (IProjectionGEN)pSpatialReferenceFactory2.CreateProjection((int)esriSRProjectionType.esriSRProjection_GaussKruger);
                IGeographicCoordinateSystem pGeographicCoordinateSystem = pSpatialReferenceFactory2.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
                (pGeographicCoordinateSystem as ISpatialReference).SetDomain(-400, -400, 400, 400);
                ILinearUnit pLinearUnit = (ILinearUnit)pSpatialReferenceFactory2.CreateUnit((int)esriSRUnitType.esriSRUnit_Meter);
                IParameter[] pParameters = pProjectionGEN.GetDefaultParameters();
                for (int i = 0; i < pParameters.Length; i++)
                {
                    IParameter currentParameter = pParameters[i];
                }
                //修改parameters
                IParameter falseEastingParameter = pParameters[0];
                falseEastingParameter.Value = falseEasting;
                IParameter fasleNorthingParameter = pParameters[1];
                fasleNorthingParameter.Value = fasleNorthing;
                IParameter centralMeridianParameter = pParameters[2];
                centralMeridianParameter.Value = centralMeridian;
                IParameter scaleFactorParameter = pParameters[3];
                scaleFactorParameter.Value = scaleFactor;
                IParameter latitudeOfOrigionParameter = pParameters[4];
                latitudeOfOrigionParameter.Value = latitudeOfOrigion;
                IProjectedCoordinateSystemEdit pPCSE = new ProjectedCoordinateSystemClass();
                object name = "new Dom Project cooridinate system";
                object alias = "ndpos";
                object abbreviation = "NDPCS";
                object remarks = "most eastern province in China";
                object usage = "when making maps of new Dom";
                object gcsobject = pGeographicCoordinateSystem as object;
                object unitobject = pLinearUnit as object;
                object projection = pProjectionGEN as object;
                object parameters = pParameters as object;

                pPCSE.Define(ref name, ref alias, ref abbreviation, ref remarks, ref usage, ref gcsobject, ref unitobject, ref projection, ref parameters);
                IProjectedCoordinateSystem pPCS = (IProjectedCoordinateSystem)pPCSE;
                {
                    (pPCS as ISpatialReferenceTolerance).XYTolerance = 0.000001;
                    pPCS.SetDomain(-9998100, -9998100, 900714804574.099, 900709927374.099);
                    
                }
                return pPCS;
            }


            private void button1_Click_1(object sender, EventArgs e)
            {
                ITable pTable=pPublicFeatureWorkspace.OpenTable("DomDataTest");
                int indexofArea=pTable.Fields.FindField("AreaDefinition2");
                int indexofGCS = pTable.Fields.FindField("Globle");
                int indexoffalseEasting = pTable.Fields.FindField("falseEasting");
                int indexoffalseNorthing = pTable.Fields.FindField("falseNorthing");
                int indexofcentralMeridian = pTable.Fields.FindField("centralMeridian");
                int indexofscaleFactor = pTable.Fields.FindField("scaleFactor");
                int indexoflatitudeOfOrigion = pTable.Fields.FindField("LatitudeOfOrigion");
                ICursor pCursor=pTable.Search(null,false);
                IRow pRow=pCursor.NextRow();
                string StrXY=string.Empty;
                string StrGCS = string.Empty;
                while(pRow!=null)
                 {
                     StrGCS = (string)pRow.get_Value(indexofGCS);
                     //如果pRow的“数据坐标系”是北京54  
                    switch ( StrGCS )
                    {
                        case "北京54":

                            Globle = "北京54";
                            StrXY = (string)pRow.get_Value(indexofArea);
                            XY = StrXY;
                            falseEasting = (double)pRow.get_Value(indexoffalseEasting);
                            falseNorthing = (double)pRow.get_Value(indexoffalseNorthing);
                            centralMeridian=(double) pRow.get_Value(indexofcentralMeridian);
                            scaleFactor = (double)pRow.get_Value(indexofscaleFactor);
                            latitudeOfOrigion = (double)pRow.get_Value(indexoflatitudeOfOrigion);

                            break;
                        case  "西安80":
                            StrXY = (string)pRow.get_Value(indexofArea);
                            XY = StrXY;

                            break;
                        case  "WGS84":
                            StrXY = (string)pRow.get_Value(indexofArea);
                            XY=StrXY;

                            break;
                        default:
                            break;

                    }           
                     //如果pRow的“数据坐标系”是西安80                                   




                     //如果pRow的“数据坐标系”是WGS84
                    pRow = pCursor.NextRow();

                  }

     


            }

            //解析字符串
            private string[] ParseAreaDefinition2(string AreaStr)
            {
                int begin;
                int end;
                string[] split2=null;
                string[] split1;
                string sub = string.Empty;
                    
                split1 = AreaStr.Split(new char[] { '+' });
                foreach (string a in split1)
                {
                    if (a.Trim() != "")
                    {
                        begin = a.IndexOf('(');
                        end = a.IndexOf(')');
                        sub = a.Substring(begin + 1, end - begin - 1);
                        split2 = sub.Split(new char[] { ';' });
                    }

                }
                return split2;

            }



            //Create inMemoryWorkspace
            private IWorkspace CreateInMemoryWorkspace()
            {
                // Create an InMemory workspace factory.
                IWorkspaceFactory workspaceFactory = new InMemoryWorkspaceFactoryClass();
                // Create an InMemory geodatabase.
                IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace",
                  null, 0);
                // Cast for IName.
                IName name = (IName)workspaceName;
                //Open a reference to the InMemory workspace through the name object.
                IWorkspace workspace = (IWorkspace)name.Open();
                return workspace;
            }


            private void button2_Click_1(object sender, EventArgs e)
            {

                IWorkspace pInMemoryWorkspace = CreateInMemoryWorkspace();
                IFeatureWorkspace pInMemoryFeatureWorkspace = (IFeatureWorkspace)pInMemoryWorkspace;
                //-----------------------------------------------------------------------------

                IFields pFields = new FieldsClass();
                IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;

                IGeometryDef pGometryDef = new GeometryDefClass();
                IGeometryDefEdit pGeometryDefEdit = (IGeometryDefEdit)pGometryDef;
                {
                    pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
                    pGeometryDefEdit.GridCount_2 = 1;
                    pGeometryDefEdit.AvgNumPoints_2 = 2;
                    pGeometryDefEdit.HasM_2 = false;
                    pGeometryDefEdit.HasZ_2 = false;
                    pGeometryDefEdit.set_GridSize(0, 10);
                    pGeometryDefEdit.SpatialReference_2 = (ISpatialReference)CreatePCSBasedOnBeijing54((IGeographicCoordinateSystem)GetGCSBeijing54(), falseEasting, falseNorthing,
                         centralMeridian, scaleFactor, latitudeOfOrigion);
                }
                IField pField = new FieldClass();
                IFieldEdit pFieldEdit = (IFieldEdit)pField;

                pFieldEdit.Name_2 = "Globle";
                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                pFieldEdit.Length_2 = 50;
                pFieldsEdit.AddField(pField);

                pField = new FieldClass();
                pFieldEdit = (IFieldEdit)pField;
                pFieldEdit.Name_2 = "Shape";
                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                pFieldEdit.GeometryDef_2 = pGometryDef;
                pFieldsEdit.AddField(pField);

                pField = new FieldClass();
                pFieldEdit = (IFieldEdit)pField;
                pFieldEdit.Name_2 = "OBJECTID";
                pFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
                pFieldsEdit.AddField(pField);

                IFeatureClass pInMemoryFeatureClass = pInMemoryFeatureWorkspace.CreateFeatureClass("InMemory", pFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");

                //--------------------------------------------------------------------------------

                IWorkspaceEdit pWorkspaceEdit = (IWorkspaceEdit)pInMemoryFeatureWorkspace;

                pWorkspaceEdit.StartEditing(true);
                pWorkspaceEdit.StartEditOperation();


                //设置几何字段

                string[] strXY = ParseAreaDefinition2(XY);

                IPolygon pPolygon = new PolygonClass();
                IPointCollection pPointCollection = (IPointCollection)pPolygon;
                IPoint pPoint;
                object _missing = Type.Missing;
                double x, y;
                for (int i = 0; i < strXY.Length; i++)
                {
                    XandY = strXY[i].Split(new char[] { ',', ',' });
                    x = double.Parse(XandY[0]);
                    y = double.Parse(XandY[1]);
                    pPoint = new PointClass();
                    pPoint.PutCoords(x, y);
                    pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                }
                pPolygon.Close();

                //------------------------------------------------------------------------

                IFeatureBuffer pFeatureBuffer = pInMemoryFeatureClass.CreateFeatureBuffer();
                IFeatureCursor pFeatureCursor = pInMemoryFeatureClass.Insert(true);

                int index;
                {
                    try
                    {
                        pFeatureBuffer.Shape = pPolygon;
                        index = pInMemoryFeatureClass.Fields.FindField("Globle");
                        pFeatureBuffer.set_Value(index, Globle);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
                pFeatureCursor.InsertFeature(pFeatureBuffer);
                pFeatureCursor.Flush();
                //-----------------------------------------------------------------------
                pPublicInMemoryClass = pInMemoryFeatureClass;
                IFeatureLayer pFL = new FeatureLayerClass();
                pFL.FeatureClass = pInMemoryFeatureClass;
                axMapControl1.AddLayer(pFL);

                //------------------------------------------------------------------------

            }


            //复制字段,包括几何字段、非几何字段和空间参考的设置
            private IFields CloneFeatureClassFields(IFeatureClass pFeatureClass, ISpatialReference pSpatialReference)
            {
                IFields pInputFields = pFeatureClass.Fields;
                IFields pOutputFields = null;
                IField pShapeField = null;
                IGeometryDefEdit pSFGeoDefEdit = null;
                IFieldChecker pFieldChecker = new FieldCheckerClass();
                IEnumFieldError obj = null;
                pFieldChecker.Validate(pInputFields, out obj, out pOutputFields);
                pShapeField = pOutputFields.get_Field(pOutputFields.FindField(pFeatureClass.ShapeFieldName));
                pSFGeoDefEdit = (IGeometryDefEdit)pShapeField.GeometryDef;
                pSFGeoDefEdit.SpatialReference_2 = pSpatialReference;
                return pOutputFields;

            }
            //创建内存FeatureClass
            private IFeatureClass CreateInMemoryFeatureClass(string name, IFields pInputFields)
            {
                IWorkspaceFactory pInMemoryWorkspaceFactory = new InMemoryWorkspaceFactoryClass();
                IWorkspaceName pWorkspaceName = pInMemoryWorkspaceFactory.Create("", "InMemoryWorkspace", null, 0);
                IName pName = (IName)pWorkspaceName;
                IWorkspace pInMemoryWorkspace = (IWorkspace)pName.Open();
                IFeatureWorkspace pInMemoryFeatureWorkspace = (IFeatureWorkspace)pInMemoryWorkspace;
                IFeatureClass pInMemoryFeatureClass = pInMemoryFeatureWorkspace.CreateFeatureClass(name, pInputFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
                return pInMemoryFeatureClass;

            }

            private void button3_Click_1(object sender, EventArgs e)
            {
                IFeatureClass pFC = pPublicInMemoryClass;

                IFeatureClass pInsertFC = pPublicFeatureWorkspace.OpenFeatureClass("InsertDomBeijing54");

                { }



            }

            private void button4_Click(object sender, EventArgs e)
            {

            }

            //非常重要
            private void button4_Click_1(object sender, EventArgs e)
            {

                string[] strXY = ParseAreaDefinition2(XY);

                IPolygon pPolygon = new PolygonClass();
                pPolygon.SpatialReference = (ISpatialReference)CreatePCSBasedOnBeijing54((IGeographicCoordinateSystem)GetGCSBeijing54(), falseEasting, falseNorthing,
             centralMeridian, scaleFactor, latitudeOfOrigion);
                IPointCollection pPointCollection = (IPointCollection)pPolygon;
                IPoint pPoint;
                object _missing = Type.Missing;
                double x, y;
                for (int i = 0; i < strXY.Length; i++)
                {
                    XandY = strXY[i].Split(new char[] { ',', ',' });
                    x = double.Parse(XandY[0]);
                    y = double.Parse(XandY[1]);
                    pPoint = new PointClass();
                    pPoint.PutCoords(x, y);
                    pPointCollection.AddPoint(pPoint, ref _missing, ref _missing);
                }
                pPolygon.Close();
                pPolygon.Project(GetPCSBeijing54());


                IFeatureClass pInsertFC = pPublicFeatureWorkspace.OpenFeatureClass("InsertDomBeijing54");
                IFeatureBuffer pInsertFB = pInsertFC.CreateFeatureBuffer();
                IFeatureCursor pInsertFCursor = pInsertFC.Insert(true);
                {
                    pInsertFB.Shape = pPolygon;

                }
                pInsertFCursor.InsertFeature(pInsertFB);
                pInsertFCursor.Flush();


            }
            //解析字符串






        }
    }
  • 相关阅读:
    tmp
    【ask】ghost分区还原win7出现蓝屏,试图加载CLASSPNP驱动时出现
    手动编译svn
    【ask】Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
    c++11小计
    入门系列-ABP CLI
    入门系列-参数验证集成
    入门系列-异常处理
    .NET Core 控制台启动失败“以一种访问权限不允许的方式做了一个访问套接字的尝试”
    入门系列-虚拟文件系统
  • 原文地址:https://www.cnblogs.com/zhangjun1130/p/1457710.html
Copyright © 2011-2022 走看看