从多段折线制作一个多段线?


11

我有一条折线,该折线分为多个部分,这些部分的顺序不正确,因此顶点的ID不遵循折线的绘制。

该折线代表公交线路,我需要按照公交的行驶方式进行绘制。我想知道如何合并此折线的多部分?

我已经尝试过拆分和拆分,以及“多部分合并为单部分”,“联合”,“合并”等,但是没有人给我想要的结果。


@bmoussea,您使用过“溶解”工具吗?
Artwork21 2011年

@ artwork21是的,我做到了,但是它什么都没有改变:折线仍然分成多部分...
bmoussea 2011年

首先检查几何图形,确认是否正确订购了多部分产品:help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…然后解散艺术品21提及
Mapperz

我检查了几何图形,没有报告任何问题。多个部分未出现在检查几何中,因为它们已经是折线的一部分。
bmoussea 2011年

编辑折线所在的图层时,折线的多部分会出现,然后在其上右击->编辑顶点并在“草图属性”中查看。这是我要合并的折线的不同部分(多部分)。
bmoussea 2011年

Answers:


5

我从您的标签中看到您正在运行ArcGIS10。我已使用以下方法执行类似的任务:

1)使用多部分到单个部分

2)使用未拆分

为了使它起作用(即,使线以正确的顺序),您可能需要将线分成组成的端点,然后根据属性更改方向(例如1 =开始,2 =结束) -您可以使用它有条件地仅连接那些不同的点(如果1 + 2,则创建连接线)。

如果您使用的是IDE,则执行此操作的代码很长,但是如果您有特定的问题,我会尽力提供帮助。


1
“未分割线”需要ArcInfo许可证。如果您没有此许可证级别,请使用“溶解”,它具有“拆分行”选项。
klewis

1

一段时间以前,我不得不使用AV 3.x和Avenue进行完全相同的操作。我快速查找了代码,但找不到它。如果我没记错的话,逻辑是这样的:(我也将公交车站和终点站作为不同的point shapefile,以便能够确定起点和终点):

  1. 创建一个空的折线以接收已排序的零件。让我们称之为“排序折线”
  2. 要获得第一部分:

    2a。获取最接近启动端子的零件

    2b。获取该零件的起点和终点到起点的距离。如果起始顶点最近,则将此部分添加到“排序的折线”中。如果最后将其翻转,则将其添加。

  3. 要获得中间零件和末端零件,请从上一步中创建的零件(折线)开始,并在while(true)循环内,开始比较第一零件的末端节点与输入中其他零件之间的距离折线。最接近的是“下一部分”。比较下一部分的起点和终点的距离,以确定是否将其翻转,然后再将其添加到“排序的折线”中
  4. 当“排序多段线”中的零件数与输入多段线中的零件数相同时,退出循环。

... 或类似的东西!:-)

让我知道这是否对您有意义,我可以再去找我原来的Avenue代码。


1

我在一个与此项目类似的项目中工作,我使用了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);
        }
    }
    

通过这些过程,我制作了两个字典。创建字典后,我检查两个字典中是否都包含相同的点,并且在两个字典中,该键在要素列表中仅具有一个要素,然后使用这两个折线创建了一条新的折线,并删除了两条短折线。

要将两条折线合并为一条:

   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;
  }

1

由于使用“重塑功能”工具对公交路线进行了更新,因此我遇到了完全相同的问题。Dissolve,Merge和Unsplit不起作用,因为多部分功能不一致。

如果您现在还没有注意到这一点,请仔细看一下多部分要素之间必须重合的顶点。根据需要延伸,修剪或重塑形状,然后使用上述任何工具。


哦,顺便说一句:“仔细看”,我的意思是非常非常接近。
亚伯拉罕L

1
我遇到了同样的问题,并且像亚伯拉罕建议的那样,仔细研究了零件的顶点。实际上,它们没有连接。打开端点捕捉并将端点顶点对齐在一起,问题解决了。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.