等高線を抽出する

等高線は、ExtractContours()ExtractContoursAt()ExtractMajorContours()ExtractMinorContours() を使用して、サーフェス(TIN とグリッドの両方)から AutoCAD 図面オブジェクトとして抽出することができます。これらのメソッドは、ITerrainSurface インタフェースによって定義され、すべてのサーフェス クラスに実装されています。

4 つのメソッドは非常に似ていますが、用途は異なります。
  • ExtracContours() - このメソッドは、サーフェスの最低標高から順に、指定した標高間隔で等高線を抽出します。
  • ExtractContoursAt() - このメソッドは、指定した単一の標高のすべての等高線を抽出します。
  • ExtractMajorContours() - このメソッドは、サーフェスから計曲線のみを抽出します。
  • ExtractMinorContours() - このメソッドは、サーフェスから主曲線のみを抽出します。

ExtractContours() メソッドには 4 つのバージョンがあります。4 つのパラメータ指定は最も単純です。他に標高の範囲と間隔の指定があります。追加のスムージング パラメータを指定して、抽出したポリラインを滑らかにする次の 2 つのメソッド バージョンもあります。抽出された等高線は最適化 AutoCAD ポリライン オブジェクトで、このメソッドは抽出されたすべてのオブジェクトの ID を含む ObjectIdCollection を返します。このオブジェクトはサーフェスから独立しており、下のサーフェスに影響を与えずに操作することができます。

次の例では、ランダムなサーフェスを作成し、2 つの方法で等高線を抽出します。

// Setup: creates a new, random surface
// 
TinSurface surface = CreateRandomSurface("Example Surface");

// Extract contours and print information about them:
ObjectIdCollection contours;
double contourInterval = 50.0;
contours = surface.ExtractContours(contourInterval);
write("# of extracted contours: " + contours.Count + "\n");
int totalVertices = 0;
for (int i = 0; i < contours.Count; i++)
{
    ObjectId contourId = contours[i];

    // Contours are lightweight Polyline objects:
    Polyline contour = contourId.GetObject(OpenMode.ForRead) as Polyline;
    write(String.Format("Contour #{0} length:{1}, # of vertices:{2}\n",
        i, contour.Length, contour.NumberOfVertices));
    totalVertices += contour.NumberOfVertices;
}

// Extract contours with smoothing:
contours = surface.ExtractContours(contourInterval, ContourSmoothingType.AddVertices, 10);
int totalVerticesSmoothed = 0;
foreach (ObjectId contourId in contours)
{
    Polyline contour = contourId.GetObject(OpenMode.ForRead) as Polyline;
    totalVerticesSmoothed += contour.NumberOfVertices;
}

// Compare smoothing by adding vertices:
write(String.Format("Effects of smoothing:\n  total vertices no smoothing: {0}\n  total vertices with smoothing: {1}\n",
    totalVertices, totalVerticesSmoothed));

// Extract contours in a range:
double startRange = 130.0;
double endRange = 190.0;
contours = surface.ExtractContours(contourInterval, startRange, endRange);

write("# of extracted contours in range: " + contours.Count + "\n");

// You can also extract contours in a range with smoothing:
// contours = surface.ExtractContours(contourInterval, startRange, endRange, 
//    ContourSmoothingType.SplineCurve, 10);