マルチパートに分割されたポリラインがあり、これらのパーツの順序が正しくないため、頂点のIDはポリラインのプロットに従っていません。
このポリラインはバスラインを表しているため、バスの運転方法に従ってプロットする必要があります。このポリラインのマルチパートをマージする方法を知りたいですか?
マルチパートからシングルパート、ユニオン、マージなどと同様に、スプリットとアンスプリットをすでに試みましたが、誰も私が望む結果を得られません。
マルチパートに分割されたポリラインがあり、これらのパーツの順序が正しくないため、頂点のIDはポリラインのプロットに従っていません。
このポリラインはバスラインを表しているため、バスの運転方法に従ってプロットする必要があります。このポリラインのマルチパートをマージする方法を知りたいですか?
マルチパートからシングルパート、ユニオン、マージなどと同様に、スプリットとアンスプリットをすでに試みましたが、誰も私が望む結果を得られません。
回答:
タグから、ArcGIS 10を実行していることがわかります。同様のタスクに次の方法を使用しました。
1)マルチパートからシングルパートを使用する
2)Unsplitを使用する
これが機能するように(つまり、適切な順序で行を配置するために)、行を構成するエンドポイントに分割し、属性に基づいて方向を変更する必要があります(1 =開始、2 =終了など) -これを使用して、異なるポイントのみを条件付きで接続できます(1 + 2の場合、接続線を作成します)。
IDEで作業している場合、これを行うためのコードは非常に長くなりますが、特定の質問がある場合は、できる限りのサポートをいたします。
私はAV 3.xとAvenueを使用してかなり以前にまったく同じことをしなければなりませんでした。コードをすばやく確認しましたが、見つかりませんでした。正しく覚えていれば、ロジックは次のようになりました(バス停とターミナルも異なるポイントシェープファイルとして持っていたため、開始部分と終了部分を判別できました)。
最初の部分を取得するには:
2a。開始ターミナルに最も近いパーツを取得します
2b。このパーツの開始ノードと終了ノードから開始ターミナルまでの距離を取得します。開始頂点が最も近い場合、このパーツを「ソートされたポリライン」に追加します。その場合は、最後にフリップしてから追加します。
...またはそのようなもの!:-)
これがあなたにとって理にかなっているかどうかを教えてください。元のAvenueコードを見つけることができます。
私はこれに似たプロジェクトで働いていて、ArcObjectsを使用しました。私の目標は、2つの短いポリラインを1つのポリラインにするために、そのエンドポイントの1つが別の開始ポイントである場合、2つの隣接するポリラインを接続することでした。私のプロセスは:
1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
両方のクラスは、「等しい」および「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;
}
「Reshape Feature」ツールを使用してバス路線を更新したため、まったく同じ問題が発生しました。マルチパート機能が一致しなかったため、ディゾルブ、マージ、およびスプリットは機能しませんでした。
これに気付いていない場合は、マルチパートフィーチャ間で一致する必要がある頂点を詳しく見てください。必要に応じて延長、トリム、または変形し、上記のツールを使用します。