線を等距離点のセットに分割する方法


11

以前はこれをXToolsに依存していましたが、現在の環境では、XToolsにアクセスできません。

これをArcMap10で実行しようとしています。

目標は、ストリームのライン表現を等間隔のポイントのセットに分割して、最終的にそれらのポイントでz値を決定し、勾配を決定できるようにすることです。


私の意図したワークフローはそういうものです。

  1. ストリームをポイントに分割します
  2. GMEを使用してポイントをDEMと交差させる
  3. ポイント間の距離を決定することにより、勾配があることを決定できるはずです。
  4. ポイントデータを元のストリームラインに統合することは理にかなっているようです。このステップについては不明です。

私の方法に対する批判はありますが、この時点での優先事項は、これらのストリームをポイントに変換することです。

ありがとうございました!


1
距離を測定(m)に関して、または平面のx / y距離に基づいて単純にしたいですか?
カーククイケンドール

対策カークに関して。
ジャックターディー

回答:


6

まだArcGIS 10を使用していませんが、9.3.1ではラインレイヤーで編集セッションを開始し、分割する機能を強調表示してから、エディターツールバーのドロップダウンで[分割]オプションを選択します。ここで、選択したフィーチャを分割する距離を指定できます。次に、ET GeoWizard内のノードのエクスポートツール(無料ツール)を使用して、分割された各ラインセグメントのポイントレイヤーを取得できます。

空間結合を使用して、ポイントデータ情報をラインレイヤーに戻すことができます。ArcMap TOCでラインレイヤーを右クリックし、[結合とリレート]> [結合]を選択します。最初のドロップダウンで、[空間位置に基づいて別のレイヤーからデータを結合する]オプションを選択します。


アートワークのおかげで、今日はこれを試してみます。私には非常に合理的ですね!ありがとう:)
ジャックターディー

4

これを行うUIのツールは知りませんが、IMSegmentation3インターフェイスを介してプログラムで実行できます。

protected override void OnClick()
{
    try
    {
        var fSel = ArcMap.Document.FocusMap.get_Layer(1) as IFeatureSelection;
        if (fSel.SelectionSet.Count == 0)
        {
            MessageBox.Show("choose a line feature first");
            return;
        }
        var gc = ArcMap.Document.FocusMap as IGraphicsContainer;
        IFeature feat = ((IFeatureLayer)fSel).FeatureClass.GetFeature(fSel.SelectionSet.IDs.Next());
        var pnts = GetPoints((IPolyline)feat.ShapeCopy, 2.0);
        foreach (IPoint pnt in pnts)
        {
            var elem = new MarkerElementClass() as IElement;
            elem.Geometry = pnt;
            ((IMarkerElement)elem).Symbol = new SimpleMarkerSymbolClass();
            gc.AddElement(elem, 0);
        }
        ((IActiveView)ArcMap.Document.FocusMap).PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

/// <summary>
/// Get points at evenly spaced measures along a polyline
/// </summary>
/// <param name="polyline"></param>
/// <param name="count"></param>
/// <returns></returns>
private List<IPoint> GetPoints(IPolyline polyline, double mspacing)
{
    var outList = new List<IPoint>();

    var mseg = polyline as IMSegmentation3;
    if (mseg.MMonotonic == esriMMonotonicEnum.esriMNotMonotonic)
        throw new Exception("polyline not monotonic");
    for (double m = mseg.MMin; m <= mseg.MMax; m += mspacing)
    {
        var geomcoll = mseg.GetPointsAtM(m, 0.0);
        if (geomcoll != null && geomcoll.GeometryCount > 0)
        {
            var pnt = geomcoll.get_Geometry(0) as IPoint;
            outList.Add(pnt);
        }
    }
    return outList;
}

0

ストリームの一端にバッファを作成し、バッファがストリームと交差するポイントを特定できます。その後、この手順を繰り返し続けることができます。(ストリームの長さではなく直線であるため)ストリームの正確な距離はわかりませんが、これらのポイントに基づいてラインをセクションに分割し、それらのラインの長さを使用して勾配を推定できます。

価値のあるアプローチであれば、Pythonでスクリプト化できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.