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
ArcView ArcView
ArcEditor ArcEditor
ArcInfo ArcInfo
Engine Developer Kit Engine Runtime