So teilen Sie eine Linie in äquidistante Punkte

11

Früher habe ich mich dafür auf XTools verlassen, aber in meiner aktuellen Umgebung habe ich keinen Zugriff darauf.

Ich versuche dies in ArcMap10 zu tun.

Das Ziel ist es, eine Liniendarstellung eines Stroms in eine Reihe von Punkten mit gleichem Abstand zu unterteilen, um schließlich z-Werte an diesen Punkten zu bestimmen, damit ich den Gradienten bestimmen kann.


Mein beabsichtigter Workflow ist als solcher.

  1. Teilen Sie den Stream in Punkte
  2. Schneiden Sie die Punkte mit einem DEM unter Verwendung von GME
  3. Durch Bestimmen des Abstands zwischen den Punkten sollte ich in der Lage sein, den Gradienten zu bestimmen.
  4. Es scheint sinnvoll, die Punktdaten wieder in die ursprünglichen Stromlinien zu integrieren. Unsicher über diesen Schritt.

Ich schätze jede Kritik an meiner Methode, aber meine Priorität an dieser Stelle ist die Umwandlung dieser Streams in Punkte.

Vielen Dank!

Jacques Tardie
quelle
1
Möchten Sie, dass der Abstand in Bezug auf das Maß (m) oder einfach basierend auf dem planimetrischen x / y-Abstand ist?
Kirk Kuykendall
In Bezug auf eine Maßnahme Kirk.
Jacques Tardie

Antworten:

6

Ich verwende ArcGIS 10 noch nicht, aber in 9.3.1 können Sie eine Bearbeitungssitzung auf Ihrer Linienebene starten, die zu teilende Funktion markieren und dann in der Dropdown-Liste der Editor-Symbolleiste die Option Teilen auswählen. Hier können Sie den Abstand angeben, durch den das ausgewählte Feature geteilt werden soll. Sie können dann das Werkzeug Knoten exportieren in ET GeoWizard (kostenloses Werkzeug) verwenden, um eine Punktebene für jedes geteilte Liniensegment zu erhalten.

Sie können eine räumliche Verknüpfung verwenden, um die Punktdateninformationen wieder in die Linienebene einzufügen. Klicken Sie im ArcMap-Inhaltsverzeichnis mit der rechten Maustaste auf Ihre Linienebene und wählen Sie Verbinden und Verwandte> Verbinden. Wählen Sie in der ersten Dropdown-Liste die Option "Daten aus einer anderen Ebene basierend auf der räumlichen Position verbinden".

Artwork21
quelle
Danke Artwork, ich werde es später heute versuchen. Klingt für mich sehr vernünftig! Vielen Dank :)
Jacques Tardie
4

Mir ist kein Tool auf der Benutzeroberfläche bekannt, das dies ausführt , aber es kann programmgesteuert über die IMSegmentation3- Schnittstelle ausgeführt werden.

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
quelle
0

Sie können einen Puffer an einem Ende des Streams erstellen und dann den Punkt identifizieren, an dem Ihr Puffer den Stream schneidet. Dann könnten Sie diesen Schritt einfach wiederholen. Es würde Ihnen nicht den genauen Abstand des Streams geben (da es sich eher um eine gerade Linie als um die Streamlänge handelt), aber wenn Sie die Linie dann basierend auf diesen Punkten in Abschnitte aufteilen und die Länge dieser Linien verwenden könnten, schätzen Sie den Gradienten.

Dies könnte in Python geschrieben werden, wenn es ein würdiger Ansatz wäre!

djq
quelle