[ArcEngine]Geotransformation地理变换

Geotransformation 地理变换

The Abridged Molodensky transformation is a three parameter transformation三参 that converts between two geographic coordinate systems (datums)两个基准面. The parameters are three translations in meters. The translation values are in XYZ space. This method is a quicker but less accurate version of the Molodensky method.

 

A CoordinateFrameTransformation布尔莎 is a seven parameter geographic (datum) transformation.七参 The seven parameters are three translations in meters三个平移量, three rotations in arc seconds三个旋转变量, and a scale factor缩放因子 in parts per million. The parameters refer to XYZ space. The conversion of features to and from XYZ space is done automatically as part as the method. If the input and output spheroids (ellipsoids) are different, that is also handled automatically. The PositionVectorTransformation is similar but uses a different convention when handling the rotation values. To convert between a coordinate frame and position vector methods, change the signs of the rotation values.

 

The GeocentricTranslation method is a three parameter transformation三参 that converts between two geographic coordinate systems (datums).两个不同的基准面 The parameters are three translations in meters where the translations occur in XYZ space. The conversion of features to and from XYZ space is done automatically as part as the method. If the input and output spheroids (ellipsoids) are different, that is also handled automatically.

 

The HARNTransformation coclass implements the HARN (HPGN) geographic (datum) transformation method. This is a grid-based method格网方法. The grids for forty-nine states (Alaska is the exception) and five territories are available.

See the IGridTransformation interface for the dataset name parameter.

 

The longitude rotation transformation converts data between two geographic coordinate system by applying a shift to the longitude values. Usually it's used to convert two geographic coordinate systems that are defined on different prime meridians, like Monte Mario (Rome) to Monte Mario (based on Greenwich).

 

A MolodenskyBadekasTransformation is a ten parameter geographic (datum) transformation十参数基准面转换. The ten parameters are three translations in meters, three rotations in arc seconds, a scale factor in parts per million, and the datum origin point in meters基准面原点. The parameters refer to XYZ space. The conversion of features to and from XYZ space is done automatically as part as the method. If the input and output spheroids (ellipsoids) are different, that is also handled automatically. The convention for the rotation values is the same as the CoordinateFrameTransformation.

 

The Molodensky transformation 莫洛金斯基模型is a three parameter transformation that converts between two geographic coordinate systems (datums).三参 The parameters are three translations in meters.(米为单位) The translation values are in XYZ space. This method is a slower but more accurate version 比慢但更精确of the Abridged Molodensky method.

 

The NADCONTransformation coclass implements the base NADCON geographic (datum) transformation method. This is a grid-based method格网. The grids for the contiguous United States, Alaska, Hawaii, and Puerto Rico/Virgin Islands are available.

See the IGridTransformation interface for the parameter, the dataset name.

 

The NTv2Transformation method converts between two geographic coordinate systems (datums) using a file用一个文件. The method was created by the Geodetics Division of Natural Resources Canada and has since been used by several other countries including Australia, New Zealand, and Germany. The file format is documented online and a script exists that can convert information stored in a shapefile to an NTv2-format file. See http://arcscripts.esri.com/details.asp?dbid=13654

 

A PositionVectorTransformation is a seven parameter geographic (datum) transformation七参数. The seven parameters are three translations in meters, three rotations in arc seconds, and a scale factor in parts per million. The parameters refer to XYZ space. The conversion of features to and from XYZ space is done automatically as part as the method. If the input and output spheroids (ellipsoids) are different, that is also handled automatically. The CoordinateFrameTransformation is similar but uses a different convention when handling the rotation values. To convert between a position vector and coordinate frame methods, change the signs of the rotation values.

七参数法:(包括布尔莎模型,一步法模型,海尔曼特等)

 

IGeometry2.ProjectEx Method

By default, ProjectEx will not densify geometries as they are projected. This can lead to the output geometries not reflecting the 'true' shape in the new coordinate system. A straight line in one coordinate system is not necessarily a straight line in a different coordinate system. Set the bAngularDensify parameterif you want to densify the geometries while they are projected.

[C#]

    //This example demonstrates how to use IGeometry2::ProjectEx
    public void ProjectExExample()
    {
        //Create source spatial reference
        ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
        ISpatialReference spatialReference = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
        spatialReference.SetFalseOriginAndUnits(-80.0000000232831, 39.9999999767169, 42949672.9);
        //Create envelope and define its spatial reference
        IEnvelope envelope = new EnvelopeClass();
        envelope.PutCoords(-68.6076204314651, 49.6186709634653, -68.5531907607304, 49.6530789785679);
        envelope.SpatialReference = spatialReference;
        //Destination spatial reference
        IProjectedCoordinateSystem projectedCoordinateSystem = spatialReferenceFactory.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_NAD1927UTM_19N);
        //Define the XYDomain equivalent to SetFalseOriginAndUnits
        projectedCoordinateSystem.SetDomain(500000, 600000, 5300000, 5600000);
        //Create a Geotransformation (Datum transformation)
        IGeoTransformation geoTransformation = spatialReferenceFactory.CreateGeoTransformation((int)esriSRGeoTransformationType.esriSRGeoTransformation_NAD1927_To_WGS1984_12) as IGeoTransformation;

        String report = "Print envelope coordinates before projection:\n" +
        envelope.XMin + " , " + envelope.YMin + " , " + envelope.XMax + " , " + envelope.YMax + "\n\n\n";

        //Project envelope
        IGeometry2 geometry = envelope as IGeometry2;
        geometry.ProjectEx(projectedCoordinateSystem as ISpatialReference, esriTransformDirection.esriTransformReverse, geoTransformation, false, 0, 0);

        report = report + "Print envelope coordinates after projection:\n" +
        envelope.XMin + " , " + envelope.YMin + " , " + envelope.XMax + " , " + envelope.YMax;
        System.Windows.Forms.MessageBox.Show(report);
    }

 

About custom geotransformations

[C#]

private void CustomGT()

{ 

    // Initialize a new spatial reference environment.

    // SpatialReferenceEnvironment is a singleton object and needs to use the Activator class.

    Type factoryType = Type.GetTypeFromProgID(

        "esriGeometry.SpatialReferenceEnvironment");

    System.Object obj = Activator.CreateInstance(factoryType);

    ISpatialReferenceFactory2 pSRF = obj as ISpatialReferenceFactory2;

    // Initialize and create the input and output coordinate systems.

    IProjectedCoordinateSystem2 pPCSin = new

        ESRI.ArcGIS.Geometry.ProjectedCoordinateSystemClass();

    IProjectedCoordinateSystem2 pPCSout = new

        ESRI.ArcGIS.Geometry.ProjectedCoordinateSystemClass();

    pPCSin = (IProjectedCoordinateSystem2)pSRF.CreateProjectedCoordinateSystem((int)

        esriSRProjCSType.esriSRProjCS_Abidjan1987UTM_30N);

    pPCSout = (IProjectedCoordinateSystem2)pSRF.CreateProjectedCoordinateSystem((int)

        esriSRProjCSType.esriSRProjCS_WGS1984UTM_30N);

    // Retrieve the geographic coordinate systems from the two projected

    // coordinate systems.

    IGeographicCoordinateSystem2 pGCSto = (IGeographicCoordinateSystem2)

        pPCSout.GeographicCoordinateSystem;

    IGeographicCoordinateSystem2 pGCSfrom = (IGeographicCoordinateSystem2)

        pPCSin.GeographicCoordinateSystem;

 

    // Initialize and create an appropriate geographic transformation.

    ICoordinateFrameTransformation pCFT = new CoordinateFrameTransformationClass();

    pCFT.PutParameters(1.234,  - 2.345, 658.3, 4.3829,  - 2.48591, 2.18943, 2.48585);

    pCFT.PutSpatialReferences(pGCSfrom, pGCSto);

    pCFT.Name = "Custom GeoTran"; 

    // The SpatialReferenceEnvironment has a GeoTransformationOperationSet that you

    // can use to maintain a list of active geographic transformations.

    // Once you add a geographic transformation to the operation set, many operations

    // can access the transformations.

    // Add the transformation to the operation set.

    IGeoTransformationOperationSet pGTSet = pSRF.GeoTransformationDefaults;

    // Always add a geographic transformation in both directions.

    pGTSet.Set(esriTransformDirection.esriTransformForward, pCFT);

    pGTSet.Set(esriTransformDirection.esriTransformReverse, pCFT);

}

How to use the IGeoTransformationOperationSet methods

[C#]

public void Test()

{

    //Create source spatial reference.

    Type factoryType = Type.GetTypeFromProgID( "esriGeometry.SpatialReferenceEnvironment");

    System.Object obj = Activator.CreateInstance(factoryType);

    ISpatialReferenceFactory3 spatialReferenceFactory = obj as ISpatialReferenceFactory3;

 

    ISpatialReference spatialReference =

        spatialReferenceFactory.CreateGeographicCoordinateSystem((int)

        esriSRGeoCSType.esriSRGeoCS_WGS1984);

    spatialReference.SetFalseOriginAndUnits( - 80.0000000232831, 39.9999999767169, 42949672.9);

    //Create an envelope and define its spatial reference.

    IEnvelope envelope = new EnvelopeClass();

    envelope.PutCoords( - 68.6076204314651, 49.6186709634653,  - 68.5531907607304, 49.6530789785679);

    envelope.SpatialReference = spatialReference;

    //Destination spatial reference.

    ISpatialReference projectedCoordinateSystem = spatialReferenceFactory.CreateProjectedCoordinateSystem((int)

        esriSRProjCSType.esriSRProjCS_NAD1927UTM_19N);

    //Define the XYDomain equivalent to SetFalseOriginAndUnits.

    projectedCoordinateSystem.SetDomain(500000, 600000, 5300000, 5600000);

    String report = "Print envelope coordinates before projection:\n" +

        envelope.XMin + " , " + envelope.YMin + " , " + envelope.XMax + " , " +

        envelope.YMax + "\n\n\n";

    //Project envelope.

    IGeometry geometry = envelope as IGeometry2;

    geometry.Project(projectedCoordinateSystem as ISpatialReference);

    report = report + "Print envelope coordinates after projection:\n" +

        envelope.XMin + " , " + envelope.YMin + " , " + envelope.XMax + " , " +

        envelope.YMax;

    System.Windows.Forms.MessageBox.Show(report);

}

 

//This example demonstrates how to use the IGeoTransformationOperationSet methods.

//Set up a few GeoTransformations.

public void ChangeCoordinateSystem1()

{

    ISpatialReferenceFactory2 spatialReferenceFactory = new  SpatialReferenceEnvironmentClass();

    IGeoTransformationOperationSet geoTransformationOperationSet =   spatialReferenceFactory.GeoTransformationDefaults;

    //NAD 1927 to WGS 1984 30.

    IGeoTransformation geoTransformation =   spatialReferenceFactory.CreateGeoTransformation((int)

        esriSRGeoTransformationType.esriSRGeoTransformation_NAD1927_To_WGS1984_12)as  IGeoTransformation;

    geoTransformationOperationSet.Set(esriTransformDirection.esriTransformForward,    geoTransformation);

    geoTransformationOperationSet.Set(esriTransformDirection.esriTransformReverse,   geoTransformation);

    //Amersfoort to WGS 1984.

    geoTransformation = spatialReferenceFactory.CreateGeoTransformation(8012) as IGeoTransformation;

    geoTransformationOperationSet.Set(esriTransformDirection.esriTransformForward, geoTransformation);

    geoTransformationOperationSet.Set(esriTransformDirection.esriTransformReverse,  geoTransformation);

}

 

Projecting a raster with a datum transformation

When projecting raster data, you can specify a transformation if the spatial references of the input and output are based on different datum. See the following code example:

public static void ProjectRasterWithDatumTransformation(IRasterDataset2

    rasterDataset, ISpatialReference outSR, esriSRGeoTransformation2Type geoTrans)

{

    //This example shows how to specify a datum transformation when projecting raster data.

    //rasterDataset—Represents input of a raster dataset that has a known spatial reference.

    //outSR—Represents the spatial reference of the output raster dataset.

    //geoTrans—Represents the geotransformation between the input and output spatial reference.

    //Set output spatial reference.

    IRaster raster = rasterDataset.CreateFullRaster();

    IRasterProps rasterProps = (IRasterProps)raster;

    rasterProps.SpatialReference = outSR; 

    //Specify the geotransformation.

    ISpatialReferenceFactory2 srFactory = new SpatialReferenceEnvironmentClass();

    IGeoTransformation geoTransformation = (IGeoTransformation) srFactory.CreateGeoTransformation((int)geoTrans);

    //Add to the geotransformation operation set.

    IGeoTransformationOperationSet operationSet = new   GeoTransformationOperationSetClass();

    operationSet.Set(esriTransformDirection.esriTransformForward, geoTransformation);

    operationSet.Set(esriTransformDirection.esriTransformReverse, geoTransformation);

    //Set the geotransformation on the raster.

    IRaster2 raster2 = (IRaster2)raster;

    raster2.GeoTransformations = operationSet;

    //Save the result.

    ISaveAs saveas = (ISaveAs)raster;

    saveas.SaveAs(@"c:\temp\outputRaster.img", null, "IMAGINE Image");

}

你可能感兴趣的:(transform)