Tôi đã làm việc trong một dự án tương tự như thế này, tôi đã sử dụng ArcObjects. Mục tiêu của tôi là kết nối hai polylines liền kề nếu một trong những điểm cuối của nó là điểm bắt đầu của một người khác để biến hai polylines ngắn thành một polyline duy nhất. Quá trình của tôi là:
1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
- PointKey là một lớp có chứa một điểm.
- FeatureDataList là một lớp có chứa Danh sách IFeatures.
Cả hai lớp đều ghi đè các phương thức "Bằng" và "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);
}
}
Bằng các quá trình này, tôi đã thực hiện hai từ điển. Sau khi tạo từ điển, tôi kiểm tra xem cả hai từ điển có cùng một điểm và trong cả hai từ điển, khóa đó chỉ có một tính năng trong danh sách tính năng, sau đó tôi đã tạo một đa tuyến mới với hai polylines đó và xóa hai polylines ngắn.
Để nối hai polylines thành một:
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;
}