Comment diviser une ligne en un ensemble de points équidistants

11

J'avais l'habitude de compter sur XTools pour cela, mais dans mon environnement actuel, je n'y ai pas accès.

J'essaie de le faire dans ArcMap10.

Le but est de décomposer une représentation linéaire d'un flux en un ensemble de points également espacés afin de déterminer éventuellement les valeurs z à ces points afin que je puisse déterminer le gradient.


Mon workflow prévu est en tant que tel.

  1. diviser le flux en points
  2. intersecter les points avec un DEM en utilisant GME
  3. En déterminant la distance entre les points, je devrais pouvoir déterminer que le gradient est.
  4. Il semble qu'il serait judicieux de réintégrer les données de point dans les lignes de flux d'origine. Je ne suis pas sûr de cette étape.

J'apprécie toute critique de ma méthode, mais ma priorité à ce stade est de convertir ces flux en points.

Je vous remercie!

Jacques Tardie
la source
1
Voulez-vous que la distance soit par rapport à la mesure (m) ou simple basée sur la distance planimétrique x / y?
Kirk Kuykendall
En ce qui concerne une mesure Kirk.
Jacques Tardie

Réponses:

6

Je n'utilise pas encore ArcGIS 10, mais dans 9.3.1, vous pouvez démarrer une session de modification sur votre couche de lignes, mettre en surbrillance l'entité que vous souhaitez diviser, puis dans la liste déroulante de la barre d'outils de l'éditeur, sélectionnez l'option Diviser. Ici, vous pouvez spécifier la distance de division de l'entité sélectionnée. Vous pouvez ensuite utiliser l'outil Export Nodes dans ET GeoWizard (outil gratuit) pour obtenir une couche de points pour chaque segment de ligne divisé.

Vous pouvez utiliser une jointure spatiale pour replacer les informations de données de point dans la couche de ligne. Cliquez avec le bouton droit sur votre couche de lignes dans la table des matières ArcMap et sélectionnez Joindre et associer> Joindre. Dans la première liste déroulante, sélectionnez l'option "Joindre les données d'une autre couche en fonction de l'emplacement spatial".

oeuvre21
la source
Merci oeuvre, je vais essayer plus tard dans la journée. Cela me semble très raisonnable! Merci :)
Jacques Tardie
4

Je ne suis pas au courant d'un outil sur l'interface utilisateur qui fait cela, mais cela peut être fait par programme, via l' interface 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;
}
Kirk Kuykendall
la source
0

Vous pouvez créer un tampon à une extrémité du flux, puis identifier le point où votre tampon intersecte le flux. Ensuite, vous pouvez continuer à répéter cette étape. Cela ne vous donnerait pas la distance exacte du flux (car il s'agit d'une ligne droite plutôt que d'une longueur de flux), mais si vous pouviez ensuite diviser la ligne en sections en fonction de ces points, et en utilisant la longueur de ces lignes, estimez le gradient.

Cela pourrait être scripté en python si c'était une bonne approche!

djq
la source