Jak podzielić linię na zestaw równo odległych punktów


11

Kiedyś polegałem na XTools, ale w moim obecnym środowisku nie mam do niego dostępu.

Próbuję to zrobić w ArcMap10.

Celem jest podzielenie reprezentacji liniowej strumienia na zestaw punktów o równych odstępach, aby ostatecznie określić wartości Z w tych punktach, dzięki czemu mogę określić gradient.


Mój planowany przepływ pracy jest taki.

  1. podziel strumień na punkty
  2. przecinaj punkty za pomocą DEM za pomocą GME
  3. Określając odległość między punktami, powinienem być w stanie określić, że gradient jest.
  4. Wydaje się, że sensowne byłoby zintegrowanie danych punktowych z powrotem z pierwotnymi usprawnieniami. Nie jestem pewien tego kroku.

Doceniam wszelkie krytyki mojej metody, ale moim priorytetem w tym momencie jest konwersja tych strumieni na punkty.

Dziękuję Ci!


1
Czy chcesz, aby odległość była w stosunku do miary (m) czy prosta w oparciu o planimetryczną odległość x / y?
Kirk Kuykendall

W odniesieniu do miary Kirk.
Jacques Tardie,

Odpowiedzi:


6

Nie korzystam jeszcze z ArcGIS 10, ale w 9.3.1 możesz rozpocząć sesję edycji na warstwie linii, zaznacz funkcję, którą chcesz podzielić, a następnie na rozwijanym pasku narzędzi edytora wybierz opcję Podziel. Tutaj możesz określić odległość, przez którą ma zostać podzielony wybrany obiekt. Następnie możesz użyć narzędzia Eksportuj węzły w ET GeoWizard (darmowe narzędzie), aby uzyskać warstwę punktową dla każdego podzielonego segmentu linii.

Możesz użyć sprzężenia przestrzennego, aby umieścić informacje o danych punktów z powrotem w warstwie linii. Kliknij warstwę liniową prawym przyciskiem myszy w ArcMap TOC i wybierz Połącz i Relacje> Dołącz. Przy pierwszym menu rozwijanym wybierz opcję „Połącz dane z innej warstwy na podstawie lokalizacji przestrzennej”.


Dzięki dziełu, spróbuję tego dzisiaj. Brzmi dla mnie bardzo rozsądnie! Dziękuję :)
Jacques Tardie,

4

Nie znam narzędzia w interfejsie użytkownika, które to robi, ale można to zrobić programowo poprzez interfejs 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

Możesz utworzyć bufor na jednym końcu strumienia, a następnie zidentyfikować punkt, w którym bufor przecina strumień. Następnie możesz po prostu powtarzać ten krok. Nie dałoby to dokładnej odległości strumienia (ponieważ jest to prosta linia, a nie długość strumienia), ale gdybyś mógł następnie podzielić linię na sekcje w oparciu o te punkty i używając długości tych linii oszacuj gradient.

To może być napisane w Pythonie, jeśli byłoby to godne podejście!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.