선을 등거리 점 세트로 나누는 방법


11

이를 위해 XTools를 사용했지만 현재 환경에서는 액세스 할 수 없습니다.

ArcMap10 에서이 작업을 수행하려고합니다.

목표는 스트림의 선 표현을 동일한 간격의 점 세트로 나누고 그 점에서 z 값을 결정하여 그래디언트를 결정할 수 있도록하는 것입니다.


내가 의도 한 워크 플로는 이와 같습니다.

  1. 스트림을 포인트로 나누다
  2. GME를 사용하여 DEM과 포인트를 교차
  3. 점들 사이의 거리를 결정함으로써, 그래디언트가 결정될 수 있어야합니다.
  4. 포인트 데이터를 원래 유선으로 다시 통합하는 것이 합리적입니다. 이 단계를 잘 모르겠습니다.

내 방법에 대한 비판에 감사하지만이 시점에서 우선 순위는 해당 스트림을 포인트로 변환하는 것입니다.

감사합니다!


1
평면 측정 x / y 거리를 기준으로 거리 (m) 또는 단순을 기준으로 거리를 원하십니까?
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.