Как разбить линию на множество равноотстоящих точек

11

Раньше для этого полагался на XTools, но в моей нынешней среде у меня нет к нему доступа.

Я пытаюсь сделать это в ArcMap10.

Цель состоит в том, чтобы разбить линейное представление потока на набор точек, расположенных на одинаковом расстоянии, чтобы в конечном итоге определить значения z в этих точках, чтобы я мог определить градиент.


Мой предполагаемый рабочий процесс как таковой.

  1. разделить поток на точки
  2. пересекают точки с помощью матрицы высот, используя GME
  3. Определив расстояние между точками, я должен быть в состоянии определить, что градиент равен.
  4. Похоже, имело бы смысл интегрировать точечные данные обратно в исходные линии тока. Не уверен насчет этого шага.

Я ценю любую критику моего метода, но в данный момент мой приоритет - преобразование этих потоков в точки.

Спасибо!

Жак Тарди
источник
1
Вы хотите, чтобы расстояние было относительно меры (м) или было простым на основе контурного расстояния х / у?
Кирк Куйкендалл
Что касается меры Кирк.
Жак Тарди

Ответы:

6

Я еще не использую ArcGIS 10, но в 9.3.1 вы можете начать сеанс редактирования на своем линейном слое, выделите объект, который вы хотите разделить, а затем на панели инструментов редактора выберите опцию Разделить. Здесь вы можете указать расстояние, на которое нужно разделить выбранный объект. Затем вы можете использовать инструмент «Экспорт узлов» в ET GeoWizard (бесплатный инструмент), чтобы получить точечный слой для каждого сегмента разделенной линии.

Вы можете использовать пространственное соединение, чтобы поместить информацию о точечных данных обратно в линейный слой. Щелкните правой кнопкой мыши на линейном слое в ArcMap TOC и выберите Join and Relates> Join. В первом раскрывающемся списке выберите параметр «Объединить данные из другого слоя на основе пространственного местоположения».

artwork21
источник
Спасибо, я сделаю попытку позже сегодня. Звучит очень разумно для меня! Спасибо :)
Жак Тарди
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, если это был достойный подход!

djq
источник