วิธีการแบ่งเส้นเป็นชุดของจุดที่เท่ากัน


11

เคยพึ่ง XTools สำหรับสิ่งนี้ แต่ในสภาพแวดล้อมปัจจุบันของฉันฉันไม่สามารถเข้าถึงได้

ฉันพยายามทำสิ่งนี้ใน ArcMap10

เป้าหมายคือการแบ่งการแสดงเส้นของสตรีมเป็นชุดของระยะห่างเท่า ๆ กันเพื่อกำหนดค่า z ที่จุดเหล่านั้นในที่สุดเพื่อให้ฉันสามารถกำหนดการไล่ระดับสี


เวิร์กโฟลว์ที่ฉันตั้งใจไว้เป็นเช่นนั้น

  1. แยกกระแสเป็นจุด
  2. ตัดจุดด้วย DEM โดยใช้GME
  3. โดยการกำหนดระยะห่างระหว่างจุดต่าง ๆ ฉันควรจะสามารถระบุได้ว่า
  4. ดูเหมือนว่าจะเป็นการสมเหตุสมผลที่จะรวมข้อมูลจุดกลับไปยังสตรีมดั้งเดิม ไม่แน่ใจเกี่ยวกับขั้นตอนนี้

ฉันซาบซึ้งกับการวิพากษ์วิจารณ์วิธีการของฉัน แต่สิ่งที่สำคัญที่สุดของฉัน ณ จุดนี้คือการเปลี่ยนสายน้ำให้เป็นจุด

ขอบคุณ!


1
คุณต้องการให้ระยะทางเป็นไปตามการวัด (m) หรือง่ายขึ้นอยู่กับระยะทางตามแผน x / y หรือไม่?
Kirk Kuykendall

ด้วยความเคารพต่อวัดเคิร์ก
Jacques Tardie

คำตอบ:


6

ฉันยังไม่ได้ใช้ ArcGIS 10 แต่ใน 9.3.1 คุณสามารถเริ่มเซสชันการแก้ไขในเลเยอร์บรรทัดของคุณเน้นคุณสมบัติที่คุณต้องการแบ่งแล้วบนแถบเครื่องมือตัวแก้ไขแบบเลื่อนลงเลือกตัวเลือกหาร ที่นี่คุณสามารถระบุระยะทางเพื่อแบ่งคุณลักษณะที่เลือกโดย จากนั้นคุณสามารถใช้เครื่องมือส่งออกโหนดภายในET GeoWizard (เครื่องมือฟรี) เพื่อรับเลเยอร์จุดสำหรับแต่ละส่วนของเส้นแบ่งออก

คุณสามารถใช้การรวมเชิงพื้นที่เพื่อใส่ข้อมูลจุดกลับเข้าไปในเลเยอร์บรรทัด คลิกขวาที่เลเยอร์บรรทัดใน ArcMap TOC และเลือกเข้าร่วมและสัมพันธ์> เข้าร่วม ในการดรอปดาวน์แรกเลือกตัวเลือก "เข้าร่วมข้อมูลจากเลเยอร์อื่นตามตำแหน่งเชิงพื้นที่"


ขอบคุณอาร์ตเวิร์คฉันจะลองอีกครั้งในวันนี้ ฟังดูสมเหตุสมผลมากสำหรับฉัน! ขอบคุณ :)
Jacques Tardie

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

คุณสามารถสร้างบัฟเฟอร์ที่ปลายด้านหนึ่งของกระแสข้อมูลและระบุจุดที่บัฟเฟอร์ของคุณตัดกับกระแสข้อมูล จากนั้นคุณสามารถทำซ้ำขั้นตอนนี้ต่อไป มันจะไม่ให้ระยะทางที่แน่นอนของสตรีม (เนื่องจากเป็นเส้นตรงแทนที่จะเป็นความยาวสตรีม) แต่ถ้าคุณสามารถแบ่งบรรทัดออกเป็นส่วน ๆ ตามจุดเหล่านี้และใช้ความยาวของเส้นเหล่านั้นประมาณการไล่ระดับสี

นี่อาจเป็นสคริปต์ในไพ ธ อนถ้ามันเป็นวิธีที่คุ้มค่า!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.