Como dividir uma linha em um conjunto de pontos equidistantes

11

Costumava confiar no XTools para isso, mas no meu ambiente atual, não tenho acesso a ele.

Estou tentando fazer isso no ArcMap10.

O objetivo é quebrar uma representação de linha de um fluxo em um conjunto de pontos igualmente espaçados, a fim de determinar os valores de z nesses pontos, para que eu possa determinar o gradiente.


Meu fluxo de trabalho pretendido é como tal.

  1. dividir o fluxo em pontos
  2. cruzar os pontos com um DEM usando GME
  3. Ao determinar a distância entre os pontos, devo poder determinar que o gradiente é.
  4. Parece que faria sentido integrar os dados do ponto novamente às linhas de fluxo originais. Não tem certeza sobre esta etapa.

Aprecio qualquer crítica do meu método, mas minha prioridade neste momento é converter esses fluxos em pontos.

Obrigado!

Jacques Tardie
fonte
1
Deseja que a distância seja em relação à medida (m) ou simples com base na distância planimétrica x / y?
precisa saber é o seguinte
No que diz respeito a uma medida Kirk.
Jacques Tardie

Respostas:

6

Ainda não estou usando o ArcGIS 10, mas na 9.3.1 você pode iniciar uma sessão de edição na camada de linha, realçar o recurso que deseja dividir e, na barra de ferramentas do Editor, selecionar a opção Dividir. Aqui você pode especificar a distância para dividir o recurso selecionado. Você pode usar a ferramenta Exportar nós no ET GeoWizard (ferramenta gratuita) para obter uma camada de pontos para cada segmento de linha dividido.

Você pode usar uma junção espacial para colocar as informações dos dados do ponto novamente na camada de linha. Clique com o botão direito do mouse na camada de linha no ArcMap TOC e selecione Unir e relacionar> Unir. Na primeira lista suspensa, selecione a opção "Unir dados de outra camada com base na localização espacial".

artwork21
fonte
Obrigado arte, vou tentar isso hoje mais tarde. Parece muito razoável para mim! Obrigado :)
Jacques Tardie
4

Não conheço uma ferramenta na interface do usuário que faça isso, mas isso pode ser feito programaticamente, por meio da 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
fonte
0

Você pode criar um buffer em uma extremidade do fluxo e, em seguida, identificar o ponto em que seu buffer cruza o fluxo. Então você pode continuar repetindo esta etapa. Não forneceria a distância exata do fluxo (como é uma linha reta, e não o comprimento do fluxo), mas se você pudesse dividir a linha em seções com base nesses pontos, e usando o comprimento dessas linhas, estimar o gradiente.

Isso poderia ser script em python se fosse uma abordagem digna!

djq
fonte