ArcEngine中坐标超出测量范围

在以前分析和总结过关于"坐标或测量值超出范围"的问题。如下:

坐标或测量值超出范围 - 我也是个傻瓜

但在开发和使用中也经常遇到此类问题,本文说一说在ArcEngine中的相关处理。总结下来就一点,在创建、拓扑等操作时生成的范围起出了要素的设置范围

获取要素范围

我们知道,创建一个没有任何坐标系统上要素图层,它的默认是要素范围均是:

(-450359962737.05, 450359962737.05, -450359962737.05, 450359962737.05)

创建一个有指定坐标系统的要素图层,它的默认范围是根据坐标系统自动生成的,例如:

CGCS2000_3_Degree_GK_CM_84E(-5123200, 5123200,-10002100, ,10002100)

在ArcMap中看到的不是正确值。

通过GetDomain方法,范围此范围的坐标值。

private void GetSpatialReferenceProperties(IFeatureClass featureClass)
{
    IGeoDataset geoDataset = featureClass as IGeoDataset;
    ISpatialReference spatialReference = geoDataset.SpatialReference;
    double xMin;
    double xMax;
    double yMin;
    double yMax;
    spatialReference.GetDomain(out xMin, out xMax, out yMin, out yMax);
    Console.WriteLine(xMin + ", " + xMax + ", " + yMin + ", " + yMax);
}

也可以通过GetFalseOriginAndUnits方法范围,其中falseX和falseY代表要素范围X最小值、Y最小值。

private void GetFalseOriginAndUnits(IFeatureClass featureClass)
{
    IGeoDataset geoDataset = featureClass as IGeoDataset;
    ISpatialReference spatialReference = geoDataset.SpatialReference;
    double falseX;
    double falseY;
    double xyUnits;
    spatialReference.GetFalseOriginAndUnits(out falseX, out falseY, out xyUnits);
    Console.WriteLine(falseX + ", " + falseY + ", " + xyUnits);
}

修改要素范围

使用GetDomain、GetFalseOriginAndUnits对应的SetDomain、SetFalseOriginAndUnits方法修改要素范围。

private void SetDomain (IFeatureClass featureClass)
{
    IGeoDataset geoDataset = featureClass as IGeoDataset;
    ISpatialReference spatialReference = geoDataset.SpatialReference;
    spatialReference.SetDomain(-5123200, 90000, -10002100, 10002100);
}

也可以通过spatialReferenceResolution的ConstructFromHorizon方法构造默认的要素范围。

private void SetSpatialReferenceProperties(IFeatureClass featureClass)
{
    IGeoDataset geoDataset = featureClass as IGeoDataset;
    ISpatialReference spatialReference = geoDataset.SpatialReference;
    ISpatialReferenceResolution spatialReferenceResolution = spatialReference as ISpatialReferenceResolution;
    spatialReferenceResolution.ConstructFromHorizon();
}
posted @ 2022-06-09 14:23  我也是个傻瓜  阅读(491)  评论(0编辑  收藏  举报