我有一条折线,该折线分为多个部分,这些部分的顺序不正确,因此顶点的ID不遵循折线的绘制。
该折线代表公交线路,我需要按照公交的行驶方式进行绘制。我想知道如何合并此折线的多部分?
我已经尝试过拆分和拆分,以及“多部分合并为单部分”,“联合”,“合并”等,但是没有人给我想要的结果。
我有一条折线,该折线分为多个部分,这些部分的顺序不正确,因此顶点的ID不遵循折线的绘制。
该折线代表公交线路,我需要按照公交的行驶方式进行绘制。我想知道如何合并此折线的多部分?
我已经尝试过拆分和拆分,以及“多部分合并为单部分”,“联合”,“合并”等,但是没有人给我想要的结果。
Answers:
一段时间以前,我不得不使用AV 3.x和Avenue进行完全相同的操作。我快速查找了代码,但找不到它。如果我没记错的话,逻辑是这样的:(我也将公交车站和终点站作为不同的point shapefile,以便能够确定起点和终点):
要获得第一部分:
2a。获取最接近启动端子的零件
2b。获取该零件的起点和终点到起点的距离。如果起始顶点最近,则将此部分添加到“排序的折线”中。如果最后将其翻转,则将其添加。
... 或类似的东西!:-)
让我知道这是否对您有意义,我可以再去找我原来的Avenue代码。
我在一个与此项目类似的项目中工作,我使用了ArcObjects。我的目标是连接两条相邻的折线,如果它的终点之一是另一个将两条短折线变成一条折线的起点。我的过程是:
1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
这两个类都覆盖“ 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);
}
}
通过这些过程,我制作了两个字典。创建字典后,我检查两个字典中是否都包含相同的点,并且在两个字典中,该键在要素列表中仅具有一个要素,然后使用这两个折线创建了一条新的折线,并删除了两条短折线。
要将两条折线合并为一条:
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;
}