2010년 2월 6일 토요일

[Tips]High and low precision spatial references

지오데이터베이스(GeoDatabase - personal geodatabase, file geodatabase, ArcSDE)에서 9.2 버전부터 high-precision spatial reference를 default로 사용한다.

9.2 이전 버전의
low-precision spatial reference를 사용하는 지오데이터베이스 피쳐클래스의 spatial reference 정보를 이용하여 high-precision 지오데이터베이스에 FeaureClass를 생성하는 경우에 다음과 같은 오류가 발생하는 경우가 있다.
<Cannot create a low precision dataset in a high precision database>
또는
<The XY domain on the spatial reference is not set or invalid>

다음은 이 오류를 해결하는 방법을 설명하며, 전체 코드는 마지막
④ 해결을 위한 전체 코드를 참고하면 된다.

현재 접속한 Workspace가 High-Precision Workspace인지를 판별하는 방법
다음 코드는 현재 접속한 Workspace가 high-precision을 사용하는 workspace인지를 판별하는 코드이다.
[code c#]
private bool IsHighPrecisionWorkspace(IWorkspace Workspace)
{
    bool isHighPrecision = false;

    if (Workspace is IWorkspaceProperties)
    {
        IWorkspaceProperties ipWsProps = (IWorkspaceProperties)Workspace;

        IWorkspaceProperty ipProp = ipWsProps.get_Property(
            esriWorkspacePropertyGroupType.esriWorkspacePropertyGroup,
            (int)esriWorkspacePropertyType.esriWorkspacePropSupportsHighPrecisionStorage);

        if (ipProp.IsSupported)
        {
            isHighPrecision = Convert.ToBoolean(ipProp.PropertyValue);
        }
    }
    return isHighPrecision;
}
[/code]
How to construct a high- or low-precision spatial reference
출처 : http://resources.esri.com/help/9.3/ArcGISEngine/dotnet/0682A7EC-2C4D-4e93-B664-957A1AE7185A.htm

다음 코드는
high-precision spatial reference와 low-precision spatial reference를 생성하며, 각 precision에 맞는 default resolution and default tolerance를 설정하는 코드이다.

펼쳐두기..

How to convert between high and low precision spatial references
출처 : http://resources.esri.com/help/9.3/ArcGISEngine/dotnet/A98B72CF-A833-4dc8-A4D3-48F5044210FF.htm

이 문서 및 샘플 코드는
low-precision spatial reference (pre-9.2)를 high-precision spatial reference로 변환하는 예이다.

펼쳐두기..

④ 오류 해결을 위한 전체 코드
다음 코드는 low-precision spatial reference를 사용하는 FeatureClass와 동일한 필드 및 spatial reference를 사용하는 FeatureClass를 high-precision Workspace에 생성하는 코드이다.

IsHighPrecision,
ConstructFromHorizon, SetDefaultXYResolution, SetDefaultXYTolerance가 이 코드의 핵심이다.

펼쳐두기..