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 referenceTo 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 |