Come dividere una linea in un insieme di punti equidistanti


11

Utilizzato per fare affidamento su XTools per questo, ma nel mio ambiente attuale, non ho accesso ad esso.

Sto cercando di farlo in ArcMap10.

L'obiettivo è quello di spezzare una rappresentazione lineare di un flusso in un insieme di punti equidistanti al fine di determinare i valori z in quei punti in modo che io possa determinare il gradiente.


Il mio flusso di lavoro previsto è tale.

  1. dividere il flusso in punti
  2. intersecare i punti con un DEM usando GME
  3. Determinando la distanza tra i punti, dovrei essere in grado di determinare il gradiente.
  4. Sembra che avrebbe senso integrare nuovamente i dati dei punti nelle linee di flusso originali. Non sono sicuro di questo passaggio.

Apprezzo qualsiasi critica del mio metodo, ma la mia priorità a questo punto è convertire quei flussi in punti.

Grazie!


1
Vuoi che la distanza sia rispetto alla misura (m) o semplice in base alla distanza x / y planimetrica?
Kirk Kuykendall,

Rispetto a una misura Kirk.
Jacques Tardie,

Risposte:


6

Non sto ancora usando ArcGIS 10, ma in 9.3.1 puoi iniziare una sessione di modifica sul tuo livello di linea, evidenziare la funzione che vuoi dividere quindi nella barra degli strumenti dell'Editor a discesa selezionare l'opzione Dividi. Qui puoi specificare la distanza per cui dividere la funzione selezionata. È quindi possibile utilizzare lo strumento Esporta nodi in ET GeoWizard (strumento gratuito) per ottenere un livello punti per ogni segmento di linea divisa.

È possibile utilizzare un join spaziale per reinserire le informazioni sui dati dei punti nel livello linea. Fare clic con il tasto destro del mouse sul livello linea in ArcMap TOC e selezionare Partecipa e relativi> Unisci. Nel primo menu a discesa selezionare l'opzione "Unisci dati da un altro livello in base alla posizione spaziale".


Grazie opere d'arte, ci proverò più tardi oggi. Mi sembra molto ragionevole! Grazie :)
Jacques Tardie,

4

Non sono a conoscenza di uno strumento sull'interfaccia utente che lo faccia, ma può essere fatto a livello di programmazione, tramite l' interfaccia 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

È possibile creare un buffer a un'estremità del flusso e quindi identificare il punto in cui il buffer interseca il flusso. Quindi potresti semplicemente continuare a ripetere questo passaggio. Non ti darebbe la distanza esatta del flusso (dato che è una linea retta, piuttosto che la lunghezza del flusso), ma se tu potessi quindi dividere la linea in sezioni basate su questi punti, e usando la lunghezza di quelle linee stimare il gradiente.

Questo potrebbe essere scritto in Python se fosse un approccio degno!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.