Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测一条线(具有多个点)是自身还是连接到另一条线_C#_.net_Map_Gis_Shapefile - Fatal编程技术网

C# 检测一条线(具有多个点)是自身还是连接到另一条线

C# 检测一条线(具有多个点)是自身还是连接到另一条线,c#,.net,map,gis,shapefile,C#,.net,Map,Gis,Shapefile,我正在编写代码来检测一条线(有多个点,这些线有曲线)是否是道路网络的一部分。如果有一条路无法到达(基本上是孤立的),我需要标记它 请参见下面的屏幕截图 扫描道路网时,应标记隔离线 我对解决方案的想法 2014年1月14日更新: 真管用!然而,它太慢了。跑步需要30分钟 我从从左到右排序开始。然后,我将列表中的第一项添加到XYPoints“网络”列表/哈希集。它检查每条线路的每个XY点是否存在连接(同一点),然后将其所有点添加到“网络”中,并将其从线路列表中删除(因为已经检查过,无需再次检查)

我正在编写代码来检测一条线(有多个点,这些线有曲线)是否是道路网络的一部分。如果有一条路无法到达(基本上是孤立的),我需要标记它

请参见下面的屏幕截图

扫描道路网时,应标记隔离线

我对解决方案的想法 2014年1月14日更新: 真管用!然而,它太慢了。跑步需要30分钟

我从从左到右排序开始。然后,我将列表中的第一项添加到XYPoints“网络”列表/哈希集。它检查每条线路的每个XY点是否存在连接(同一点),然后将其所有点添加到“网络”中,并将其从线路列表中删除(因为已经检查过,无需再次检查)

如果多段线未连接到主网络,则它仍将驻留在末端所有道路的原始列表中

好的,代码片段,我会在进展中不断更新,请随意添加一些想法:

while (true)
{
    int numOflinesBeforeChecking = polylinez.Count;
    for (int i = 0; i < polylinez.Count; i++)
    {
        //scan through each point of each polyline
        foreach (XYPoints xyp in polylinez[i].XYpoints)
        {
            //bool foundAvertice = false;
            if (listOfEndPoints.Contains(xyp))
            {
                //add them as endpoints
                foreach (XYPoints verifiedXYs in polylinez[i].XYpoints)
                {
                    listOfEndPoints.Add(verifiedXYs);
                }
                //add them to the network
                for (var g = 0; g < (polylinez[i].XYpoints.Count - 1); g++)
                {
                    mainHighwaylines.Add(new Line2D(polylinez[i].XYpoints[g], polylinez[i].XYpoints[g + 1]));
                }
                polylinez.RemoveAt(i);
                break; //break out of scanning XYPoints of an individual line/road, hit this again!
            } //end if

        } //end foreach XYPoint loop

    } //end for i loop

    //clearly there are no more lines
    if (numOflinesBeforeChecking == polylinez.Count)
    {
        break;
    }
} //end infinite loop

//check for intersections here
//mainHighway Lines has been generated, now let's check them for intersections
while (true)
{
    int numOflinesBeforeChecking = polylinez.Count;
    for (var i = 0; i < polylinez.Count; i++)
    {
        //smallLines relates to each individual polyline, seperated into even smaller lines
        List<Line2D> smallLines = new List<Line2D>();
        for (var g = 0; g < (polylinez[i].XYpoints.Count - 1); g++)
        {
            smallLines.Add(new Line2D(polylinez[i].XYpoints[g], polylinez[i].XYpoints[g + 1]));
        }
        bool intersectionFound = false;
        foreach (Line2D line in smallLines)
        {
            bool lineIntersection = false;
            foreach (Line2D mainHighwayline in mainHighwaylines)
            {
                if (line.intersectsLine(mainHighwayline))
                {
                    intersectionFound = true;
                    lineIntersection = true;
                    break;
                }
            }
            if (lineIntersection)
            {
                break;
            }
        }
        if (intersectionFound)
        {
            for (var g = 0; g < (polylinez[i].XYpoints.Count - 1); g++)
            {
                mainHighwaylines.Add(new Line2D(polylinez[i].XYpoints[g], polylinez[i].XYpoints[g + 1]));
            }
            polylinez.RemoveAt(i);
        }

    }
    //clearly there are no more lines
    if (numOflinesBeforeChecking == polylinez.Count)
    {
        break;
    }

}
while(true)
{
int numOflinesBeforeChecking=polylinez.Count;
对于(int i=0;i
我需要什么

关于如何使其更快的改进!第二个无限循环占用了大部分时间

第二个带断点的无限循环检查是否存在交点(它们可能没有共享端点,可能只是相交)。我将它保存在一个无限循环中,以防添加新数据

使用if语句使第二个主循环(检查交叉循环)无限大,使其从6分钟变为30分钟。但是,有必要捕捉某些误报。

标准(,连续)几何方法似乎不适用于此。从您的图片中可以看出,道路过于复杂(因此很难或不可能仅用一条线(或一束线)替换),而要建模的情况(作为网络的一部分)定义过于不精确,无法依赖简化

对于这个问题,我能想出的唯一足够准确的方法是检查给定的道路是否与主网络有共同点

主要思想:

  • 存储定义主网络的所有点;就是所有的 构成其一部分的每条道路的点。这批藏品将被拍卖 随着每一条新道路的不断更新而决定成为 网络(如下文所述)
  • 通过检查每条道路的所有定义点并确认它们是否为主要网络的一部分(最终,通过考虑一些“公差误差”)来分析每条道路。中学 收集将从这里开始,所有道路连接到 将包括正在分析的道路(一旦分析的道路 考虑到已连接,所有这些二级公路将自动 也被视为有关联,反之亦然)

  • 从逻辑上讲,这是一种最糟糕的方法;您拥有的信息越多,就越适用于简化,计算可能变得越简单。但是,如果您的输入数据与图片中的数据相似,我在这方面不会太乐观。

    我想到的最简单的事情是将在任何点相交的线分组。然后每组c