您的位置:首页 > Web前端

转载:我最近的研究成果(IGeometry.Project and IGeometry.SpatialReference)

2012-05-21 16:46 232 查看
查看C#代码

//我最近的研究成果(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();

}
//解析字符串

}
}


我最近的研究成果(IGeometry.Project and IGeometry.SpatialReference)
既然是别人的研究成果 先转来 看看把。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: