ฉันทำงานในโครงการคล้ายกับสิ่งนี้ฉันใช้ ArcObjects เป้าหมายของฉันคือการเชื่อมสองโพลีนที่อยู่ติดกันถ้าหนึ่งในนั้นคือจุดเริ่มต้นของอีกคนหนึ่งที่จะทำให้โพลีนสั้นสองอันเป็นโพลีไลน์เดียว กระบวนการของฉันคือ
1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
- PointKey เป็นคลาสที่มีจุด
- FeatureDataList เป็นคลาสที่มีรายการ IFeatures
ทั้งคลาสจะแทนที่เมธอด "Equals" และ "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);
}
}
โดยกระบวนการเหล่านี้ฉันทำพจนานุกรมสองเล่ม หลังจากสร้างพจนานุกรมฉันตรวจสอบว่าพจนานุกรมทั้งสองมีจุดเดียวกันและในพจนานุกรมทั้งสองคีย์นั้นมีคุณลักษณะเดียวเท่านั้นในรายการคุณลักษณะจากนั้นฉันสร้างโพลีไลน์ใหม่พร้อม polylines สองอันนั้นและลบโพลีลีนสั้นสองรายการ
ในการเข้าร่วมสอง polylines เป็นหนึ่ง:
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;
}