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 for Desktop Basic ArcGIS for Desktop Basic
ArcGIS for Desktop Standard ArcGIS for Desktop Standard
ArcGIS for Desktop Advanced ArcGIS for Desktop Advanced
Engine Developer Kit Engine