摘自:http://blog.csdn.net/kikitamoon/article/details/18408695
根据arcgis中坐标系统的设置,实现坐标转换可能存在下面几种情况:
1、
不涉及到地理坐标系变换的坐标变换,这个参数完全不需要,而不是 optional 哦。
例如:从 GCS_Xian_1980 进行投影变换,转换为 Xian_1980_3_Degree_GK_CM_120E 投影坐标系。
整过转换中,仅使用了高斯克吕格投影变换,没有涉及到地理坐标变换。
情景2:
涉及到地理坐标系变换的坐标变换,并且ArcGIS 已知二者之间的变换方法,这个参数是必须的,在已知列表中做选择或者自定义。(自定义见:情景3)
例如:从 GCS_Beijing_1954,转换为 GCS_WGS_1984坐标系。
转换过程中涉及到地理坐标系变换,也就是进行了椭球体变换
情景3:
涉及到地理坐标系变换的坐标变换,并且ArcGIS 未知二者之间的变换方法,也就是ArcGIS没有提供转换方法,但是这个参数是必须的,需要自定义,这个参数前会亮绿灯,告诉用户,必须要填写。另外,上 面情景2中,ArcGIS给出的方法,如果都不是自己需要的,也需要自定义。
例如:从 GCS_Beijing_1954,转换为 GCS_Xian_1980坐标系。
而针对第三种应用在实际项目中用到的比较多。一般情况下catalog中自带的gp工具是可以在ae中调用的,但我研究过这个 Geogriphic Transformation实在找不到相应的参数怎么写,在catalog中操作时是先使用Create Custom Geographic Transformation工具创建自定义的坐标转换参数,然后再使用Project gp选择已建的转换方法及相关参数进行坐标转换。现使用arcgis engine实现。
创建转换方式,使用七参的
private IGeoTransformation CreateGeoTransformation(ISpatialReference pInputSR, ISpatialReference pOutputSR,SevenParameters parameters) { IGeoTransformation pGeoTrans; pGeoTrans = new CoordinateFrameTransformationClass(); ((ICoordinateFrameTransformation)pGeoTrans).PutSpatialReferences(pInputSR, pOutputSR); ((ICoordinateFrameTransformation)pGeoTrans).PutParameters(parameters.dx,parameters.dy,parameters.dz,parameters.wx,parameters.wy,parameters.wz,parameters.ppm); return pGeoTrans; }
实现转换:
public void Project(IFeatureClass fromFeatureClass, string outPath, string outFileName, ISpatialReference inRe, ISpatialReference outRe, SevenParameters parameters, out string message) { message = ""; try { IWorkspaceFactory fac = new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace toSpace = (IFeatureWorkspace)fac.OpenFromFile(outPath, 0); IFields pFields = CreatFields(fromFeatureClass, outRe); IFeatureClass toFeatureClass = toSpace.CreateFeatureClass(outFileName, pFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", ""); IFeatureCursor pFC = fromFeatureClass.Search(null, false); if (pFC == null) return; IFeature fromFeature = pFC.NextFeature(); IFeatureCursor pFeatureCursor = null; IGeoTransformation pCoordinateFrameTransformation = CreateGeoTransformation(inRe,outRe,parameters); while (fromFeature != null) { IPointCollection toPC = new PolygonClass(); IGeometry2 pGeometry = (IGeometry2)fromFeature.ShapeCopy; pGeometry.ProjectEx(outRe,esriTransformDirection.esriTransformForward,pCoordinateFrameTransformation,false,0,0); pGeometry.SpatialReference = outRe; pFeatureCursor = toFeatureClass.Insert(true); IFeatureBuffer pf = toFeatureClass.CreateFeatureBuffer(); IFields fromFields = fromFeature.Fields; IFields toFields = pf.Fields; for (int i = 0; i < toFields.FieldCount; i++) { IField field = toFields.get_Field(i); if (field.Name.ToUpper() == "SHAPE" || field.Name.ToUpper() == "OBJECTID" || field.Name.ToUpper() == "SHAPE_LENGTH" || field.Name.ToUpper() == "SHAPE_AREA" || field.Name.ToUpper() == "FID") { continue; } int index = fromFields.FindField(field.Name); if (index == -1) { continue; } object o = fromFeature.get_Value(index); if (o != null) pf.set_Value(i, o); } pf.Shape = pGeometry; pFeatureCursor.InsertFeature(pf); System.Runtime.InteropServices.Marshal.ReleaseComObject(pf); fromFeature = pFC.NextFeature(); } System.Runtime.InteropServices.Marshal.ReleaseComObject(pFC); System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor); } catch (Exception ex) { } finally { } }