Як розділити лінію на набір рівновіддалених точок


11

Для цього я покладався на XTools, але в моєму поточному середовищі я не маю до нього доступу.

Я намагаюся зробити це в ArcMap10.

Мета - розбити лінійне подання потоку на набір однаково розташованих точок, щоб врешті визначити значення z у цих точках, щоб я міг визначити градієнт.


Мій робочий процес, призначений таким чином.

  1. розділити потік на точки
  2. перетинають точки з DEM за допомогою GME
  3. Визначаючи відстань між точками, я мав би змогу визначити, що це градієнт.
  4. Здається, було б сенсом інтегрувати точкові дані назад у вихідні потоки. Не впевнені в цьому кроці.

Я вдячний за будь-яку критику мого методу, але моїм пріоритетом на даний момент є перетворення цих потоків у пункти.

Дякую!


1
Ви хочете, щоб відстань була відносно вимірюваної (м) або простою на основі планіметричної відстані х / у?
Кірк Куйкендалл

Щодо міри Кірк.
Жак Тарді

Відповіді:


6

Я ще не використовую ArcGIS 10, але в 9.3.1 ви можете розпочати сеанс редагування на лінійному шарі, виділити функцію, яку ви хочете розділити, а потім на панелі інструментів редактора випадаючому меню виберіть варіант Розділити. Тут ви можете вказати відстань для поділу вибраної функції на. Потім можна скористатися інструментом "Експортні вузли" в ET GeoWizard (безкоштовний інструмент), щоб отримати точковий шар для кожного розділеного відрізка рядка.

Ви можете використовувати просторове з'єднання, щоб повернути інформацію про точкові дані назад у рівень лінії. Клацніть правою клавішею шару лінії в TOC ArcMap та виберіть Приєднатись та відносини> Приєднатися. У першому спадному меню виберіть опцію "Приєднати дані з іншого шару на основі просторового розташування".


Спасибі твори, я спробую це спробувати пізніше сьогодні. Звучить для мене дуже розумно! Дякую :)
Жак Тарді

4

Мені невідомий інструмент інтерфейсу, який робить це, але це можна зробити програмно через інтерфейс 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, якби це був гідний підхід!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.