マルチパートポリラインから1つのパートポリラインを作成しますか?


11

マルチパートに分割されたポリラインがあり、これらのパーツの順序が正しくないため、頂点のIDはポリラインのプロットに従っていません。

このポリラインはバスラインを表しているため、バスの運転方法に従ってプロットする必要があります。このポリラインのマルチパートをマージする方法を知りたいですか?

マルチパートからシングルパート、ユニオン、マージなどと同様に、スプリットとアンスプリットをすでに試みましたが、誰も私が望む結果を得られません。


@ bmoussea、Dissolveツールを使用しましたか?
アートワーク21

@ artwork21はい、できましたが、何も変わりません。ポリラインはまだマルチパートに分割されています
...-bmoussea

ジオメトリをチェックして、最初にマルチパートが正しく注文されていることを確認しますhelp.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…次にアートワークを削除21言及
Mapperz

ジオメトリをチェックしましたが、問題は報告されていません。マルチパートはすでにポリラインの一部であるため、チェックジオメトリには表示されません。
bmoussea

ポリラインがあるレイヤーを編集すると、ポリラインのマルチパートが表示され、その上で右クリック->頂点を編集してスケッチプロパティを確認します。ポリラインのさまざまな部分(マルチパート)を次に示します。
-bmoussea

回答:


5

タグから、ArcGIS 10を実行していることがわかります。同様のタスクに次の方法を使用しました。

1)マルチパートからシングルパートを使用する

2)Unsplitを使用する

これが機能するように(つまり、適切な順序で行を配置するために)、行を構成するエンドポイントに分割し、属性に基づいて方向を変更する必要があります(1 =開始、2 =終了など) -これを使用して、異なるポイントのみを条件付きで接続できます(1 + 2の場合、接続線を作成します)。

IDEで作業している場合、これを行うためのコードは非常に長くなりますが、特定の質問がある場合は、できる限りのサポートをいたします。


1
「分割されていないライン」には、ArcInfoライセンスが必要です。このライセンスレベルをお持ちでない場合は、「ディゾルブ」を使用してください。このオプションには[分割しない]オプションがあります。
klewis

1

私はAV 3.xとAvenueを使用してかなり以前にまったく同じことをしなければなりませんでした。コードをすばやく確認しましたが、見つかりませんでした。正しく覚えていれば、ロジックは次のようになりました(バス停とターミナルも異なるポイントシェープファイルとして持っていたため、開始部分と終了部分を判別できました)。

  1. 空のポリラインを作成して、ソートされたパーツを受け取ります。それを「ソートされたポリライン」と呼びましょう
  2. 最初の部分を取得するには:

    2a。開始ターミナルに最も近いパーツを取得します

    2b。このパーツの開始ノードと終了ノードから開始ターミナルまでの距離を取得します。開始頂点が最も近い場合、このパーツを「ソートされたポリライン」に追加します。その場合は、最後にフリップしてから追加します。

  3. 中間パーツと終了パーツを取得するには、前のステップで作成したパーツ(ポリライン)から開始し、while(true)ループ内で、最初のパーツの終了ノードと入力内の他のパーツとの距離の比較を開始しますポリライン。最も近いのは「次の部分」です。次のパーツの開始ノードと終了ノードの距離を比較して、「ソートされたポリライン」に追加する前に、それを反転するかどうかを決定します
  4. 「ソートされたポリライン」のパーツ数が入力ポリラインと同じ場合、ループを終了します。

...またはそのようなもの!:-)

これがあなたにとって理にかなっているかどうかを教えてください。元のAvenueコードを見つけることができます。


1

私はこれに似たプロジェクトで働いていて、ArcObjectsを使用しました。私の目標は、2つの短いポリラインを1つのポリラインにするために、そのエンドポイントの1つが別の開始ポイントである場合、2つの隣接するポリラインを接続することでした。私のプロセスは:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKeyは、ポイントを含むクラスです。
  • FeatureDataListは、IFeaturesのリストを含むクラスです。
  • 両方のクラスは、「等しい」および「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);
        }
    }
    

これらのプロセスにより、2つの辞書を作成しました。辞書を作成した後、両方の辞書に同じポイントが含まれており、両方の辞書にそのキーが機能リストに1つの機能しかないことを確認し、それらの2つのポリラインで新しいポリラインを作成し、2つの短いポリラインを削除します。

2つのポリラインを1つに結合するには:

   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」ツールを使用してバス路線を更新したため、まったく同じ問題が発生しました。マルチパート機能が一致しなかったため、ディゾルブ、マージ、およびスプリットは機能しませんでした。

これに気付いていない場合は、マルチパートフィーチャ間で一致する必要がある頂点を詳しく見てください。必要に応じて延長、トリム、または変形し、上記のツールを使用します。


ああ、ちなみに:「よく見る」とは、非常に近いことを意味します。
アブラハムL

1
私は同じ問題を抱えていたので、アブラハムが示唆するように、パーツの端の頂点をずっと詳しく調べました。実際、それらは接続されていませんでした。エンドポイントスナップをオンにし、エンド頂点を一緒にスナップすると、問題が解決します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.