如何将一条线分成一组等距点


11

过去依靠XTools来实现,但是在我当前的环境中,我无权访问它。

我正在尝试在ArcMap10中执行此操作。

目标是将流的线表示形式分成一组等距的点,以便最终确定这些点的z值,以便确定梯度。


我的预期工作流程就是这样。

  1. 将流分成点
  2. 使用GME将点与DEM相交
  3. 通过确定点之间的距离,我应该能够确定梯度是多少。
  4. 将点数据重新集成到原始流线中似乎很有意义。不确定此步骤。

我赞赏对我的方法的任何批评,但目前我的首要任务是将这些流转换为点。

谢谢!


1
您要相对于度量(m)还是基于平面x / y距离的简单距离?
Kirk Kuykendall,

关于措施柯克。
雅克·塔迪

Answers:


6

我尚未使用ArcGIS 10,但是在9.3.1中,您可以在行图层上启动编辑会话,突出显示要划分的要素,然后在编辑器工具栏上的下拉菜单中选择划分选项。您可以在此处指定将所选要素除以的距离。然后,您可以使用ET GeoWizard中的“导出节点”工具(免费工具)为每个分割的线段获取一个点层。

您可以使用空间连接将点数据信息放回线层。在ArcMap TOC中右键单击线层,然后选择“连接和关联”>“连接”。在第一个下拉列表中,选择“基于空间位置从另一层加入数据”选项。


感谢艺术品,今天晚些时候我会尝试一下。对我来说听起来很合理!谢谢您:)
Jacques Tardie 2011年

4

我不知道UI上的工具可以执行此操作,但是可以通过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

您可以在流的一端创建一个缓冲区,然后确定缓冲区与流相交的点。然后,您可以继续重复此步骤。它不会为您提供流的确切距离(因为它是直线,而不是流的长度),但是如果您可以根据这些点将线分成几部分,并使用这些线的长度来估计坡度。

如果这是一个值得的方法,可以用python编写脚本!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.