He trabajado en un proyecto algo similar a esto, he usado de ArcObjects. Mi objetivo era conectar dos adyacentes polilíneas si uno de ellos es el punto final es otro punto de partida para hacer dos breves polilíneas en una sola polilínea. Mi proceso fue:
1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
- PointKey es una clase que contiene un punto.
- FeatureDataList es una clase que contiene la Lista de IFeatures.
-
Ambas clases reemplaza "Igual a" y "GetHashCode" métodos.
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);
}
}
Por estos procesos he hecho dos diccionarios. Después de la creación de diccionarios, puedo comprobar si ambos diccionarios contienen el mismo punto y en ambos diccionarios, que la clave sólo tiene una característica en función de la lista, a continuación, he creado una nueva polilínea con los dos polilíneas y eliminar dos polilíneas.
Para unir dos polilíneas en uno:
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;
}