Constructing a high- or low-precision spatial reference


About constructing a high- or low-precision spatial reference

Each feature dataset or stand-alone feature class in a geodatabase has a coordinate grid. Coordinate values are snapped to the grid when added or edited. The grid's extent is called the x,y domain while the cell spacing is the x,y resolution. Z and measure values also have a spatial domain and resolution values. Before ArcGIS 9.2, geodatabases used a basic or low-precision model. A grid's precision was 1/resolution. At ArcGIS 9.2, a high-precision model was introduced. If you have to work with data that is at ArcGIS 9.1 or earlier, you might need to create a low-precision spatial reference.
For more information on the spatial reference, see Understanding Coordinate Management in the Geodatabase.
The following code example determines whether you are constructing a high- or low-precision spatial reference and sets the default resolution and tolerance values:
[C#]
private void ConstructCoordinateSystem(bool highPrecision)
{
    // 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 a geographic coordinate system from a .prj file that contains the well-known string.
    // You might need to update the file location.
    ISpatialReference3 spatialReference =
        spatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile(
        "C:\\Program Files\\ArcGIS\\Desktop10.0\\Coordinate Systems\\Geographic Coordinate Systems\\World\\WGS 1984.prj")as ISpatialReference3;

    // Determines whether you are constructing a high- or low-precision spatial reference.
    IControlPrecision2 controlPrecision = spatialReference as IControlPrecision2;
    controlPrecision.IsHighPrecision = highPrecision;

    ISpatialReferenceResolution spatialReferenceResolution = spatialReference as
        ISpatialReferenceResolution;
    ISpatialReferenceTolerance spatialReferenceTolerance = spatialReference as
        ISpatialReferenceTolerance;

    // The following three methods are key: construct horizon, then set the default x,y resolution and tolerance.
    spatialReferenceResolution.ConstructFromHorizon();
    spatialReferenceResolution.SetDefaultXYResolution();
    spatialReferenceTolerance.SetDefaultXYTolerance();

    // Check the x,y spatial domain.
    double xMin;
    double xMax;
    double yMin;
    double yMax;
    spatialReference.GetDomain(out xMin, out xMax, out yMin, out yMax);

    //System.Windows.Forms.MessageBox.Show("Domain : "+ xMin +", "+  xMax + ", "+ yMin +", "+ yMax);
}
[VB.NET]
Private Sub ConstructCoordinateSystem(ByVal highPrecision As Boolean)
    
    ' 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 spatialReferenceFactory As ISpatialReferenceFactory3 = CType(Activator.CreateInstance(t), ISpatialReferenceFactory3)
    
    Dim spatialReference As ISpatialReference3 = CType(spatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile _
                                                 ("C:\Program Files\ArcGIS\Desktop10.0\Coordinate Systems\Geographic Coordinate Systems\World\WGS 1984.prj"), ISpatialReference3)
    
    ' Determines whether you are constructing a high- or low-precision spatial reference.
    Dim controlPrecision As IControlPrecision2 = CType(spatialReference, IControlPrecision2)
    controlPrecision.IsHighPrecision = highPrecision
    
    Dim spatialReferenceResolution As ISpatialReferenceResolution = CType(spatialReference, ISpatialReferenceResolution)
    Dim spatialReferenceTolerance As ISpatialReferenceTolerance = CType(spatialReference, ISpatialReferenceTolerance)
    
    ' The following three methods are key: construct horizon, then set the default x,y resolution and tolerance.
    spatialReferenceResolution.ConstructFromHorizon()
    spatialReferenceResolution.SetDefaultXYResolution()
    spatialReferenceTolerance.SetDefaultXYTolerance()
    
    ' Check the x,y spatial domain.
    Dim xMin As Double
    Dim xMax As Double
    Dim yMin As Double
    Dim yMax As Double
    
    spatialReference.GetDomain(xMin, xMax, yMin, yMax)
    
    'System.Windows.Forms.MessageBox.Show("Domain : " & xMin & ", " & xMax & ", " & yMin & ", " & yMax)
    
End Sub


See Also:

How to import or export a spatial reference




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