About creating a custom vertical coordinate system
The ISpatialReferenceFactory interface allows you to create the Datum, VerticalDatum, and LinearUnit component parts. These components can also be created using a similar Define method available on their classes.
- The following code example creates a gravity-related VCS that uses a vertical datum:
private IVerticalCoordinateSystem CreateVerticalCoordinateSystem()
{
// 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;
// Creates a gravity-related vertical datum.
IVerticalDatum verticalDatum = spatialReferenceFactory.CreateVerticalDatum((int)
esriSRVerticalDatumType.esriSRVertDatum_Taranaki);
// Because a VCS can be based upon Datum or VerticalDatum, IHVDatum is used
// when defining a VCS.
IHVDatum hvDatum = verticalDatum as IHVDatum;
ILinearUnit linearUnit = spatialReferenceFactory.CreateUnit((int)
esriSRUnitType.esriSRUnit_Meter)as ILinearUnit;
// The direction is set to –1 and the VerticalShift is set to 40.
IVerticalCoordinateSystemEdit verticalCoordinateSystemEdit = new
VerticalCoordinateSystemClass();
object name = "New VCoordinateSystem";
object alias = "VCoordinateSystem alias";
object abbreviation = "abbr";
object remarks = "Test for options";
object usage = "New Zealand";
object hvDatumObject = hvDatum as object;
object unitObject = linearUnit as object;
object verticalShift = 40 as object;
object positiveDirection = - 1 as object;
verticalCoordinateSystemEdit.Define(ref name, ref alias, ref abbreviation, ref
remarks, ref usage, ref hvDatumObject, ref unitObject, ref verticalShift,
ref positiveDirection);
IVerticalCoordinateSystem verticalCoordinateSystem =
verticalCoordinateSystemEdit as IVerticalCoordinateSystem;
return verticalCoordinateSystem;
}
[VB.NET]
Private Function CreateVerticalCoordinateSystem() As IVerticalCoordinateSystem
' 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)
' Creates a gravity-related vertical datum.
Dim verticalDatum As IVerticalDatum = spatialReferenceFactory.CreateVerticalDatum(CInt(esriSRVerticalDatumType.esriSRVertDatum_Taranaki))
' Because a VCS can be based upon Datum or VerticalDatum, IHVDatum is used
' when defining a VCS.
Dim hvDatum As IHVDatum = TryCast(verticalDatum, IHVDatum)
Dim linearUnit As ILinearUnit = CType(spatialReferenceFactory.CreateUnit(CInt(esriSRUnitType.esriSRUnit_Meter)), ILinearUnit)
' The direction is set to –1 and the VerticalShift is set to 40.
Dim verticalCoordinateSystemEdit As IVerticalCoordinateSystemEdit = New VerticalCoordinateSystemClass()
Dim Name As Object = "New VCoordinateSystem"
' Note: Alias is a reserved keyword in VB .NET. To use it as a variable name, encase it in brackets [ ].
Dim [Alias] As Object = "VCoordinateSystem alias"
Dim abbreviation As Object = "abbr"
Dim remarks As Object = "Test for options"
Dim usage As Object = "New Zealand"
Dim hvDatumObject As Object = TryCast(hvDatum, Object)
Dim unitObject As Object = TryCast(linearUnit, Object)
Dim verticalShift As Object = TryCast(40, Object)
Dim positiveDirection As Object = TryCast( -1, Object)
verticalCoordinateSystemEdit.Define(Name, [Alias], abbreviation, remarks, usage, hvDatumObject, unitObject, verticalShift, positiveDirection)
Dim verticalCoordinateSystem As IVerticalCoordinateSystem = TryCast(verticalCoordinateSystemEdit, IVerticalCoordinateSystem)
Return verticalCoordinateSystem
End Function
- The following code example creates an ellipsoid-based VCS:
private IVerticalCoordinateSystem CreateEllipsoidBasedVerticalCoordinateSystem()
{
// 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;
// Creates an ellipsoid-based datum.
IDatum datum = spatialReferenceFactory.CreateDatum((int)
esriSRDatumType.esriSRDatum_WGS1984);
// Because a VCS can be based upon Datum or VerticalDatum, IHVDatum is used
// when defining a VCS.
IHVDatum hvDatum = datum as IHVDatum;
ILinearUnit linearUnit = spatialReferenceFactory.CreateUnit((int)
esriSRUnitType.esriSRUnit_Foot)as ILinearUnit;
//Direction is again positive down, while the vertical shift is 0.4839.
IVerticalCoordinateSystemEdit verticalCoordinateSystemEdit = new
VerticalCoordinateSystemClass();
object name = "WGS84 vcs";
object alias = "WGS84 ellipsoid";
object abbreviation = "w84 3d";
object remarks = "WGS84 ell-based vcs";
object usage = "everywhere!";
object hvDatumObject = hvDatum as object;
object unitObject = linearUnit as object;
object verticalShift = 0.4839 as object;
object positiveDirection = - 1 as object;
verticalCoordinateSystemEdit.Define(ref name, ref alias, ref abbreviation, ref
remarks, ref usage, ref hvDatumObject, ref unitObject, ref verticalShift,
ref positiveDirection);
IVerticalCoordinateSystem verticalCoordinateSystem =
verticalCoordinateSystemEdit as IVerticalCoordinateSystem;
return verticalCoordinateSystem;
}
[VB.NET]
Private Function CreateEllipsoidBasedVerticalCoordinateSystem() As IVerticalCoordinateSystem
' 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
' Creates an ellipsoid-based datum.
Dim datum As IDatum = spatialReferenceFactory.CreateDatum(CInt(esriSRDatumType.esriSRDatum_WGS1984))
' Because a VCS can be based upon Datum or VerticalDatum, IHVDatum is used
' when defining a VCS.
Dim hvDatum As IHVDatum = TryCast(datum, IHVDatum)
Dim linearUnit As ILinearUnit = CType(spatialReferenceFactory.CreateUnit(CInt(esriSRUnitType.esriSRUnit_Foot)), ILinearUnit)
' Direction is again positive down, while the vertical shift is 0.4839.
Dim verticalCoordinateSystemEdit As IVerticalCoordinateSystemEdit = New VerticalCoordinateSystemClass()
Dim Name As Object = "WGS84 vcs"
' Note: Alias is a reserved keyword in VB .NET. To use it as a variable name, encase it in brackets [ ].
Dim [Alias] As Object = "WGS84 ellipsoid"
Dim abbreviation As Object = "w84 3d"
Dim remarks As Object = "WGS84 ell-based vcs"
Dim usage As Object = "everywhere!"
Dim hvDatumObject As Object = TryCast(hvDatum, Object)
Dim unitObject As Object = TryCast(linearUnit, Object)
Dim verticalShift As Object = TryCast(0.4839, Object)
Dim positiveDirection As Object = TryCast( -1, Object)
verticalCoordinateSystemEdit.Define(Name, [Alias], abbreviation, remarks, usage, hvDatumObject, unitObject, verticalShift, positiveDirection)
Dim verticalCoordinateSystem As IVerticalCoordinateSystem = TryCast(verticalCoordinateSystemEdit, IVerticalCoordinateSystem)
Return verticalCoordinateSystem
End Function
See Also:
Creating a predefined vertical coordinate systemTo 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 |