Cara membagi garis menjadi satu set poin yang berjarak sama

11

Dulu mengandalkan XTools untuk ini, tetapi di lingkungan saya saat ini, saya tidak memiliki akses ke sana.

Saya mencoba melakukan ini di ArcMap10.

Tujuannya adalah untuk memecah representasi garis dari aliran ke dalam satu set titik yang sama-spasi untuk akhirnya menentukan nilai z pada titik-titik tersebut sehingga saya dapat menentukan gradien.


Alur kerja yang saya maksudkan adalah seperti itu.

  1. Bagi aliran menjadi poin
  2. memotong titik dengan DEM menggunakan GME
  3. Dengan menentukan jarak antara titik-titik, saya harus dapat menentukan bahwa gradiennya.
  4. Sepertinya masuk akal untuk mengintegrasikan data titik kembali ke aliran arus asli. Tidak yakin tentang langkah ini.

Saya menghargai kritik dari metode saya, tetapi prioritas saya pada saat ini adalah mengubah aliran tersebut menjadi poin.

Terima kasih!

Jacques Tardie
sumber
1
Apakah Anda ingin jarak sehubungan dengan mengukur (m) atau sederhana berdasarkan jarak x / y planimetri?
Kirk Kuykendall
Sehubungan dengan ukuran Kirk.
Jacques Tardie

Jawaban:

6

Saya belum menggunakan ArcGIS 10, tetapi di 9.3.1 Anda dapat memulai sesi edit pada layer baris Anda, sorot fitur yang ingin Anda bagi kemudian turun pada Editor Toolbar drop down pilih opsi Divide. Di sini Anda dapat menentukan jarak untuk membagi fitur yang dipilih. Anda kemudian dapat menggunakan alat Node Ekspor dalam ET GeoWizard (alat gratis) untuk mendapatkan lapisan titik untuk setiap segmen garis yang dibagi.

Anda bisa menggunakan gabungan spasial untuk mengembalikan info data titik ke dalam layer garis. Klik kanan layer baris Anda di ArcMap TOC dan pilih Gabung dan Relasikan> Gabung. Pada drop down pertama pilih opsi "Gabungkan data dari lapisan lain berdasarkan lokasi spasial".

artwork21
sumber
Terima kasih karya seni, saya akan coba ini hari ini. Kedengarannya sangat masuk akal bagi saya! Terima kasih :)
Jacques Tardie
4

Saya tidak mengetahui alat di UI yang melakukan ini, tetapi dapat dilakukan secara terprogram, melalui antarmuka 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;
}
Kirk Kuykendall
sumber
0

Anda bisa membuat penyangga di salah satu ujung aliran dan kemudian mengidentifikasi titik di mana penyangga Anda memotong aliran. Maka Anda bisa terus mengulangi langkah ini. Itu tidak akan memberi Anda jarak yang tepat dari aliran (karena itu adalah garis lurus, bukan panjang aliran), tetapi jika Anda bisa membagi garis menjadi beberapa bagian berdasarkan pada titik-titik ini, dan menggunakan panjang garis-garis tersebut memperkirakan gradien.

Ini bisa ditulis dalam python jika itu merupakan pendekatan yang layak!

djq
sumber