Cómo dividir una línea en un conjunto de puntos equidistantes


11

Solía ​​confiar en XTools para esto, pero en mi entorno actual, no tengo acceso a él.

Estoy tratando de hacer esto en ArcMap10.

El objetivo es dividir una representación lineal de una secuencia en un conjunto de puntos igualmente espaciados para determinar eventualmente los valores z en esos puntos para que yo pueda determinar el gradiente.


Mi flujo de trabajo previsto es como tal.

  1. dividir la corriente en puntos
  2. intersecar los puntos con un DEM usando GME
  3. Al determinar la distancia entre los puntos, debería poder determinar si el gradiente es.
  4. Parece que tendría sentido integrar los datos del punto nuevamente en las líneas de flujo originales. No estoy seguro sobre este paso.

Aprecio cualquier crítica de mi método, pero mi prioridad en este punto es convertir esas transmisiones en puntos.

¡Gracias!


1
¿Desea que la distancia sea con respecto a la medida (m) o simple según la distancia planimétrica x / y?
Kirk Kuykendall el

Con respecto a una medida de Kirk.
Jacques Tardie

Respuestas:


6

Todavía no estoy usando ArcGIS 10, pero en 9.3.1 puede comenzar una sesión de edición en su capa de línea, resaltar la entidad que desea dividir y luego en el menú desplegable de la barra de herramientas del Editor seleccionar la opción Dividir. Aquí puede especificar la distancia para dividir la entidad seleccionada por. Luego puede usar la herramienta Exportar nodos dentro de ET GeoWizard (herramienta gratuita) para obtener una capa de puntos para cada segmento de línea dividida.

Puede usar una unión espacial para volver a colocar la información de datos de puntos en la capa de línea. Haga clic derecho en su capa de línea en ArcMap TOC y seleccione Unir y Relacionar> Unir. En el primer menú desplegable, seleccione la opción "Unir datos de otra capa según la ubicación espacial".


Gracias obra de arte, intentaré esto más tarde hoy. ¡Suena muy razonable para mí! Gracias :)
Jacques Tardie

4

No conozco una herramienta en la interfaz de usuario que haga esto, pero se puede hacer mediante programación, a través de la interfaz 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

Puede hacer un búfer en un extremo de la secuencia y luego identificar el punto donde su búfer se cruza con la secuencia. Entonces podrías seguir repitiendo este paso. No le daría la distancia exacta de la secuencia (ya que es una línea recta, en lugar de la longitud de la secuencia), pero si pudiera dividir la línea en secciones basadas en estos puntos, y utilizando la longitud de esas líneas, calcule el gradiente.

¡Esto podría ser programado en Python si fuera un enfoque digno!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.