여러 부분으로 구성된 폴리 라인에서 한 부분으로 된 폴리 라인을 만드시겠습니까?


11

나는 다중 부분으로 나뉘어 진 폴리 라인을 가지고 있으며이 부분들은 정점의 ID가 폴리 라인의 플로팅을 따르지 않도록 잘 정렬되어 있지 않습니다.

이 폴리 라인은 버스 라인을 나타내는 것이며 버스의 주행 방식에 따라 플로팅이 필요합니다. 이 폴리 라인의 여러 부분을 병합하는 방법을 알고 싶습니다.

나는 이미 단일 파트, 유니온, 병합 등의 멀티 파트뿐만 아니라 스플릿 및 언 스플릿을 시도했지만 아무도 원하는 결과를 얻지 못했습니다.


@bmoussea, Dissolve 도구를 사용하셨습니까?
artwork21

@ artwork21 그렇습니다.하지만 변경 한 것은 없습니다 : 폴리 라인은 여전히 ​​여러 부분으로 나뉘어져 있습니다.
bmoussea

지오메트리 점검 멀티 파트가 올바른 순서로 주문되었는지 확인하십시오. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… 그런 다음 아트웍 해산 21 언급
Mapperz

형상을 확인했는데 아무런 문제가보고되지 않았습니다. 멀티 파트는 이미 폴리 라인의 일부이므로 검사 지오메트리에 나타나지 않습니다.
bmoussea

폴리 라인이있는 레이어를 편집 할 때 폴리 라인의 여러 부분이 나타난 다음 오른쪽 클릭-> 정점 편집을 클릭하고 스케치 속성을 확인합니다. 병합하려는 폴리 라인의 다른 부분 (멀티 파트)은 다음과 같습니다.
bmoussea

답변:


5

태그에서 ArcGIS 10을 실행하고 있음을 알았습니다. 비슷한 작업에 다음 방법을 사용했습니다.

1) 멀티 파트를 단일 파트로 사용

2) 사용 비 분할

이 작업을 수행하려면 (즉, 올바른 순서로 선을 갖도록) 선을 구성 끝점으로 나눈 다음 속성에 따라 방향을 변경해야합니다 (예 : 1 = 시작, 2 = 끝) -이것을 사용하여 다른 점만 조건부로 연결할 수 있습니다 (1 + 2 인 경우 연결선 만들기).

IDE로 작업하는 경우이 작업을 수행하는 코드는 상당히 길지만 특정 질문이 있으면 최선을 다해 도와 드리겠습니다.


1
"분할되지 않은 라인"에는 ArcInfo 라이센스가 필요합니다. 이 라이센스 레벨이 없으면 "Dissolve"를 사용하십시오. Unsplit Line 옵션이 있습니다.
klewis

1

AV 3.x 및 Avenue를 사용하여 꽤 오래 전과 똑같이해야했습니다. 코드를 간단히 살펴 보았지만 찾을 수 없었습니다. 올바르게 기억한다면 논리는 다음과 같습니다. (버스 정류장과 터미널을 다른 점 모양 파일로 사용하여 시작 부분과 끝 부분을 결정할 수있었습니다) :

  1. 정렬 된 부품을받을 빈 폴리 라인을 만듭니다. 이것을 '분류 된 폴리 라인'이라고하겠습니다
  2. 첫 번째 부분을 얻으려면 :

    2a. 터미널을 시작하기에 가장 가까운 부분을 얻으십시오

    2b. 이 부분의 시작 및 끝 노드와 시작 터미널까지의 거리를 가져옵니다. 시작 정점이 가장 가까운 것이라면이 부분을 '정렬 된 폴리 라인'에 추가하십시오. 끝이 FLIP이면 추가하십시오.

  3. 중간 및 끝 부분을 가져 오려면 이전 단계에서 만든 부분 (폴리 라인)으로 시작하고 while (true) 루프 내에서 첫 번째 부분의 끝 노드와 입력의 다른 부분 사이의 거리를 비교하십시오. 폴리 라인. 가장 가까운 것은 '다음 부분'입니다. 다음 파트의 시작 및 끝 노드 거리를 비교하여 '분류 된 폴리 라인'에 추가하기 전에 뒤집을 지 여부를 결정합니다.
  4. '분류 된 폴리 라인'의 부품 수가 입력 폴리 라인과 동일한 경우 루프를 종료합니다.

... 또는 그런 것! :-)

이것이 당신에게 의미가 있는지 알려 주시면 원래 Avenue Avenue 코드를 찾으십시오.


1

나는 비슷한 프로젝트에서 ArcObjects를 사용했습니다. 내 목표는 두 개의 짧은 폴리 라인을 단일 폴리 라인으로 만드는 시작점이 다른 두 개의 폴리 라인을 연결하는 것이 었습니다. 내 프로세스는 다음과 같습니다

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey는 점을 포함하는 클래스입니다.
  • FeatureDataList는 IFeature 목록을 포함하는 클래스입니다.
  • 두 클래스 모두 "Equals"및 "GetHashCode"메소드를 대체합니다.

    Dictionary<PointKey, FeatureDataList> ToPointDictionary;
    Dictionary<PointKey, FeatureDataList> FromPointDictionary;
    public void CreateDictionary(IFeatureLayer featureLayer)
    {
        var featureFunctionality = new FeatureFunctionality();
        List<IFeature> features = GetAllFeatures(featureLayer.FeatureClass);
    
        foreach (var feature in features)
        {
            IPolyline polyline = GetPolylineFromFeature(feature);
            AddFeatureInDictionary(ToPointDictionary, feature, polyline.ToPoint);
            AddFeatureInDictionary(FromPointDictionary, feature, polyline.FromPoint);
        }
    }
    
    
    
    void AddFeatureInDictionary(Dictionary<PointKey, FeatureDataList> polylineDictionary, IFeature feature, IPoint point)
    {
        FeatureDataList featureDataList;
        PointKey key = PointKey.GetKey(point);
        if (!polylineDictionary.ContainsKey(key))
        {
            featureDataList = new FeatureDataList();
            featureDataList.Add(feature);
            polylineDictionary.Add(key, featureDataList);
        }
        else
        {
            featureDataList = polylineDictionary[key];
            featureDataList.Add(feature);
        }
    }
    

이 과정을 통해 두 개의 사전을 만들었습니다. 사전을 작성한 후 두 사전에 동일한 점이 있고 두 사전 모두에 해당 키에 피쳐 목록에 피쳐가 하나만 있는지 확인한 다음이 두 폴리 라인으로 새 폴리 라인을 작성하고 두 개의 짧은 폴리 라인을 삭제합니다.

두 개의 폴리 라인을 하나로 결합하려면 :

   private IPolyline GetJoinedPolylineFromFeatures(List<IFeature> features)
   {
        IPolyline newPolyline = null;
        if (features.Count == 2)
        {
            IPolyline polyline1 = feature1.Shape as IPolyline;
            IPolyline polyline2 = feature2.Shape as IPolyline;
            if (PointKey.GetKey(polyline1.ToPoint).Equals(PointKey.GetKey(polyline2.FromPoint)))
            {
                var topoOperator2 = polyline1 as ITopologicalOperator2;
                if (topoOperator2 != null)
                    newPolyline = topoOperator2.Union(polyline2) as IPolyline;
            }
            else if (PointKey.GetKey(polyline1.FromPoint).Equals(PointKey.GetKey(polyline2.ToPoint)))
            {
                var topoOperator2 = polyline2 as ITopologicalOperator2;
                if (topoOperator2 != null)
                    newPolyline = topoOperator2.Union(polyline1) as IPolyline;
            }
        }
        return newPolyline;
  }

1

"Reshape Feature"도구를 사용하여 버스 경로를 업데이트했기 때문에 정확히 같은 문제가 발생했습니다. 멀티 파트 기능이 일치하지 않기 때문에 디졸브, 병합 및 분리가 작동하지 않았습니다.

지금까지 이것을 눈치 채지 못했다면, 멀티 파트 피처간에 일치해야하는 정점을 자세히 살펴보십시오. 필요에 따라 확장, 트림 또는 모양을 변경 한 다음 위에 언급 된 도구를 사용하십시오.


아, 그런데 : "가까운 표정"이란 말은 아주 가깝다는 뜻입니다.
Abraham L

1
나는 같은 문제를 겪었고 아브라함이 제안한대로 부분 끝 꼭지점을 훨씬 자세히 살펴 보았습니다. 그들은 실제로 연결되지 않았습니다. 끝점 스냅을 켜고 끝 정점을 함께 스냅하면 문제가 해결됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.