Buna benzer bir projede çalıştım, ArcObjects kullandım. Hedefim, bitiş noktalarından biri diğerinin başlangıç noktası ise iki kısa çoklu çizgiyi tek bir çoklu çizgiye dönüştürmekse iki bitişik çoklu çizgiyi birleştirmekti. Benim sürecim:
1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
- PointKey bir nokta içeren bir sınıftır.
- FeatureDataList, IFeatures Listesini içeren bir sınıftır.
Her iki sınıf da "Eşittir" ve "GetHashCode" yöntemlerini geçersiz kılar.
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);
}
}
Bu süreçlerle iki sözlük yaptım. Sözlükler oluşturduktan sonra, her iki sözlükte de aynı nokta olup olmadığını kontrol ediyorum ve her iki sözlükte de bu anahtarın özellik listesinde yalnızca bir özelliği var, o zaman bu iki çoklu çizgiyle yeni bir çoklu çizgi oluşturdum ve iki kısa çoklu çizgiyi sildim.
İki çoklu çizgiyi bir birleştirmek için:
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;
}