Saya bekerja di proyek yang mirip dengan ini, saya menggunakan ArcObjects. Tujuan saya adalah menghubungkan dua polyline yang berdekatan jika salah satu titik akhirnya adalah titik awal yang lain untuk membuat dua polyline pendek menjadi satu polyline. Proses saya adalah:
1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
- PointKey adalah kelas yang berisi titik.
- FeatureDataList adalah kelas yang berisi Daftar IFeatures.
Kedua kelas menimpa metode "Equals" dan "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);
}
}
Dengan proses ini saya membuat dua kamus. Setelah membuat kamus, saya memeriksa apakah kedua kamus berisi titik yang sama dan di kedua kamus, kunci itu hanya memiliki satu fitur dalam daftar fitur, kemudian saya membuat polyline baru dengan dua polyline tersebut dan menghapus dua polyline pendek.
Untuk menggabungkan dua polyline menjadi satu:
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;
}