Creating a custom geographic coordinate system (ArcObjects .NET 10.6 SDK)
ArcObjects Help for .NET developers > Developing with ArcGIS > Learning ArcObjects > Managing data > Working with spatial references > Creating a custom geographic coordinate system (ArcObjects .NET 10.6 SDK)

Creating a custom geographic coordinate system


Summary
This topic shows two methods to create a user-defined geographic coordinate system (GCS).

About creating a custom geographic coordinate system

A GCS includes a name, angular unit of measure, datum (which includes a spheroid), and a prime meridian. It is a model of the earth in a three-dimensional (3D) coordinate system. Latitude-longitude or lat/lon data is in a GCS. You can access the majority of the properties and methods through the IGeographicCoordinateSystem interface with additional properties that are available in IGeographicCoordinateSystem2. Although most developers will not need to create a custom GCS, IGeographicCoordinateSystemEdit contains the Define and DefineEx methods.
The following code example shows how to use the Define method to create a user-defined GCS. The ISpatialReferenceFactory interface allows you to create the Datum, PrimeMeridian, and AngularUnit component parts. These components can also be created using a similar Define method available on their classes.
[C#]
private IGeographicCoordinateSystem CreateGeographicCoordinateSystem()
{


    // Set up the SpatialReferenceEnvironment.
    // SpatialReferenceEnvironment is a singleton object and needs to use the Activator class.
    Type factoryType=Type.GetTypeFromProgID(
        "esriGeometry.SpatialReferenceEnvironment");
    System.Object obj=Activator.CreateInstance(factoryType);
    ISpatialReferenceFactory3 spatialReferenceFactory=obj as
        ISpatialReferenceFactory3;

    // Create the datum, prime meridian, and angular unit from existing definitions.
    IDatum datum=spatialReferenceFactory.CreateDatum((int)
        esriSRDatumType.esriSRDatum_OSGB1936);
    IPrimeMeridian primeMeridian=spatialReferenceFactory.CreatePrimeMeridian((int)
        esriSRPrimeMType.esriSRPrimeM_Greenwich);
    IUnit unit=spatialReferenceFactory.CreateUnit((int)
        esriSRUnitType.esriSRUnit_Degree);

    IGeographicCoordinateSystemEdit geographicCoordinateSystemEdit=new
        GeographicCoordinateSystemClass();

    object name="UserDefined Geographic Coordinate System";
    object alias="UserDefined GCS";
    object abbreviation="UserDefined";
    object remarks="User Defined Geographic Coordinate System based on OSGB1936";
    object usage="Suitable for the UK";
    object datumObject=datum as object;
    object primeMeridianObject=primeMeridian as object;
    object unitObject=unit as object;

    geographicCoordinateSystemEdit.Define(ref name, ref alias, ref abbreviation, ref
        remarks, ref usage, ref datumObject, ref primeMeridianObject, ref unitObject)
        ;

    IGeographicCoordinateSystem userDefinedGeographicCoordinateSystem =
        geographicCoordinateSystemEdit as IGeographicCoordinateSystem;
    return userDefinedGeographicCoordinateSystem;

}
[VB.NET]
Private Function CreateGeographicCoordinateSystem() As IGeographicCoordinateSystem
    
    
    ' Set up the SpatialReferenceEnvironment.
    ' SpatialReferenceEnvironment is a singleton object and needs to use the Activator class.
    
    Dim factoryType As Type=Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment")
    Dim spatialReferenceFactory As ISpatialReferenceFactory3=CType(Activator.CreateInstance(factoryType), ISpatialReferenceFactory3)
    
    ' Create the datum, prime meridian, and angular unit from existing definitions.
    Dim datum As IDatum=spatialReferenceFactory.CreateDatum(CInt(esriSRDatumType.esriSRDatum_OSGB1936))
    Dim primeMeridian As IPrimeMeridian=spatialReferenceFactory.CreatePrimeMeridian(CInt(esriSRPrimeMType.esriSRPrimeM_Greenwich))
    Dim unit As IUnit=spatialReferenceFactory.CreateUnit(CInt(esriSRUnitType.esriSRUnit_Degree))
    
    Dim geographicCoordinateSystemEdit As IGeographicCoordinateSystemEdit=New GeographicCoordinateSystemClass()
    
    Dim Name As Object="UserDefined Geographic Coordinate System"
    
    ' Note: Alias is a reserved keyword in VB .NET. To use it as a variable name, encase it in brackets [ ].
    
    Dim [Alias] As Object="UserDefined GCS"
    Dim abbreviation As Object="UserDefined"
    Dim remarks As Object="User Defined Geographic Coordinate System based on OSGB1936"
    Dim usage As Object="Suitable for the UK"
    Dim datumObject As Object=TryCast(datum, Object)
    Dim primeMeridianObject As Object=TryCast(primeMeridian, Object)
    Dim unitObject As Object=TryCast(unit, Object)
    
    geographicCoordinateSystemEdit.Define(Name, [Alias], abbreviation, remarks, usage, datumObject, primeMeridianObject, unitObject)
    
    Dim userDefinedGeographicCoordinateSystem As IGeographicCoordinateSystem=TryCast(geographicCoordinateSystemEdit, IGeographicCoordinateSystem)
    
    Return userDefinedGeographicCoordinateSystem
    
End Function
The following code example shows how the DefineEx method can be used. It uses SpatialReferenceEnvironment to create the Datum, PrimeMeridian, and Unit components:
[C#]
private IGeographicCoordinateSystem CreateGeographicCoordinateSystemEx()
{

    // Set up the SpatialReferenceEnvironment.
    // SpatialReferenceEnvironment is a singleton object and needs to use the Activator class.
    Type t=Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment");
    System.Object obj=Activator.CreateInstance(t);
    ISpatialReferenceFactory3 spatialReferenceFactory=obj as
        ISpatialReferenceFactory3;

    // Create the datum, prime meridian, and angular unit from existing definitions.

    IDatum datum=spatialReferenceFactory.CreateDatum((int)
        esriSRDatumType.esriSRDatum_OSGB1936);
    IPrimeMeridian primeMeridian=spatialReferenceFactory.CreatePrimeMeridian((int)
        esriSRPrimeMType.esriSRPrimeM_Greenwich);
    IUnit unit=spatialReferenceFactory.CreateUnit((int)
        esriSRUnitType.esriSRUnit_Degree);

    IGeographicCoordinateSystemEdit geographicCoordinateSystemEdit=new
        GeographicCoordinateSystemClass();

    String name="UserDefined Geographic Coordinate System";
    String alias="UserDefined GCS";
    String abbreviation="UserDefined";
    String remarks="User Defined Geographic Coordinate System based on OSGB1936";
    String usage="Suitable for the UK";

    geographicCoordinateSystemEdit.DefineEx(name, alias, abbreviation, remarks,
        usage, datum, primeMeridian, unit as IAngularUnit);

    IGeographicCoordinateSystem userDefinedGeographicCoordinateSystem =
        geographicCoordinateSystemEdit as IGeographicCoordinateSystem;

    return userDefinedGeographicCoordinateSystem;

}
[VB.NET]
Private Function CreateGeographicCoordinateSystemEx() As IGeographicCoordinateSystem
    
    ' Set up the SpatialReferenceEnvironment.
    ' SpatialReferenceEnvironment is a singleton object and needs to use the Activator class.
    
    Dim t As Type=Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment")
    Dim obj As System.Object=Activator.CreateInstance(t)
    Dim spatialReferenceFactory As ESRI.ArcGIS.Geometry.ISpatialReferenceFactory3=obj
    
    ' Create the datum, prime meridian, and angular unit from existing definitions.
    
    Dim datum As IDatum=spatialReferenceFactory.CreateDatum(CInt(esriSRDatumType.esriSRDatum_OSGB1936))
    Dim primeMeridian As IPrimeMeridian=spatialReferenceFactory.CreatePrimeMeridian(CInt(esriSRPrimeMType.esriSRPrimeM_Greenwich))
    Dim unit As IUnit=spatialReferenceFactory.CreateUnit(CInt(Fix(esriSRUnitType.esriSRUnit_Degree)))
    
    Dim geographicCoordinateSystemEdit As IGeographicCoordinateSystemEdit=New GeographicCoordinateSystemClass()
    
    Dim Name As String="UserDefined Geographic Coordinate System"
    
    ' Note: Alias is a reserved keyword in VB .NET. To use it as a variable name, encase it in brackets [ ].
    
    Dim [Alias] As String="UserDefined GCS"
    Dim abbreviation As String="UserDefined"
    Dim remarks As String="User Defined Geographic Coordinate System based on OSGB1936"
    Dim usage As String="Suitable for the UK"
    
    geographicCoordinateSystemEdit.DefineEx(Name, [Alias], abbreviation, remarks, usage, datum, primeMeridian, TryCast(unit, IAngularUnit))
    
    Dim userDefinedGeographicCoordinateSystem As IGeographicCoordinateSystem=TryCast(geographicCoordinateSystemEdit, IGeographicCoordinateSystem)
    
    Return userDefinedGeographicCoordinateSystem
    
End Function






To use the code in this topic, reference the following assemblies in your Visual Studio project. In the code files, you will need using (C#) or Imports (VB .NET) directives for the corresponding namespaces (given in parenthesis below if different from the assembly name):
Development licensing Deployment licensing
ArcGIS Desktop Basic ArcGIS Desktop Basic
ArcGIS Desktop Standard ArcGIS Desktop Standard
ArcGIS Desktop Advanced ArcGIS Desktop Advanced
Engine Developer Kit Engine