两条地理线的交点

Posted

技术标签:

【中文标题】两条地理线的交点【英文标题】:Intersection between two geographic lines 【发布时间】:2013-10-07 08:04:47 【问题描述】:

我正在使用DotSpatial C# 库,我正在尝试使用以下代码来尝试找到两条线之间的交点(我知道它们确实相交)

var geoproj = DotSpatial.Projections.KnownCoordinateSystems.Geographic.World.WGS1984;

var d1 = new FeatureSet  Projection = geoproj ;
//var c1 = new Coordinate(31.877484, 34.736723);
//var c2 = new Coordinate(31.879607, 34.732362);
var c1 = new Coordinate(0, -1);
var c2 = new Coordinate(0, 1);
var line1 = new LineString(new[]  c1, c2 );
d1.AddFeature(line1);

var d2 = new FeatureSet  Projection = geoproj ;
//var c3 = new Coordinate(31.882391, 34.73352);
//var c4 = new Coordinate(31.875502, 34.734851);
var c3 = new Coordinate(-1, 0);
var c4 = new Coordinate(1, 0);
var line2 = new LineString(new[]  c3, c4 );
d2.AddFeature(line2);

var inters = d1.Intersection(d2, FieldJoinType.All, null);
var feats = inters.Features;
foreach (var feat in feats)

    Console.WriteLine("0", feat.ToString());

生成的特征集总是空的。

我做错了什么?

我还尝试交换每个坐标的 X 和 Y 分量(以防第一个被假定为经度而不是纬度)

谢谢!

编辑:根据下面韦斯顿的评论,我已将两条线的坐标更改为更明显相交的坐标。结果是一样的。

【问题讨论】:

“我知道它们确实相交”并不怀疑,但您是否也尝试过更明显的相交线并取得任何成功?像 -1 到 +1 长对 -1 到 +1 纬度? 是的,我刚刚检查过了。将其添加为问题的编辑。 【参考方案1】:

您使用的交叉路口代码基本上是一个非常有限的快捷方式。它陷入了两个相互矛盾的想法。第一个想法是特征集都具有相同的特征类型。也就是说,如果您正在使用多边形要素集,则所有要素都是多边形。第二个想法是两条线的“交点”很少是一条线。它通常是一个点。所以实际上,特征集相交代码旨在用于相交多边形,其中生成的形状通常是多边形。它也适用于结果总是点的点。在您的情况下,您可能希望找到相交形状的并集,并丢弃不相交的形状。您可以通过控制以下循环中的功能来最轻松地完成此操作。我有三个例子,一个从交叉点创建一个点特征集,并假设所有交叉点都是点,一个如果与 d2 特征相交则保留原始 d1 特征,另一个将所有相交的 d2 特征与每个 d1 特征。如果 d2 特征与多个 d1 特征相交,这可能会创建一些 d2 内容的重复。在任何这些情况下,可能不清楚如何处理属性,因为交集可以正式拥有属于多个 d2 形状的属性,而不仅仅是一个,因此也必须以自定义方式处理,即对您的特定应用有意义。

        var geoproj = DotSpatial.Projections.KnownCoordinateSystems.Geographic.World.WGS1984;

        var d1 = new FeatureSet  Projection = geoproj ;
        //var c1 = new Coordinate(31.877484, 34.736723);
        //var c2 = new Coordinate(31.879607, 34.732362);
        var c1 = new Coordinate(0, -1);
        var c2 = new Coordinate(0, 1);
        var line1 = new LineString(new[]  c1, c2 );
        d1.AddFeature(line1);


        var d2 = new FeatureSet  Projection = geoproj ;
        //var c3 = new Coordinate(31.882391, 34.73352);
        //var c4 = new Coordinate(31.875502, 34.734851);
        var c3 = new Coordinate(-1, 0);
        var c4 = new Coordinate(1, 0);
        var line2 = new LineString(new[]  c3, c4 );
        d2.AddFeature(line2);


        // To create a Point featureset with the intersections
        var result = new FeatureSet(FeatureType.Point)  Projection = geoproj ;
        foreach (IFeature feature in d1.Features)
        
            foreach (IFeature other in d2.Features)
            
                if (feature.Intersects(other))
                
                    result.AddFeature(feature.Intersection(other));
                
            
        

        // To keep only d1 lines that intersect with d2
        result = new FeatureSet  Projection = geoproj ;
        foreach(IFeature feature in d1.Features)
            foreach(IFeature other in d2.Features)
                if(feature.Intersects(other))
                    result.AddFeature(feature); 
                
            
        

        // Alternately to combine the intersecting lines into a cross
        result = new FeatureSet  Projection = geoproj ;
        foreach (IFeature feature in d1.Features)
        
            IFeature union = feature;
            Boolean keep = false;
            foreach (IFeature other in d2.Features)
            
                if (feature.Intersects(other))
                
                    union = union.Union(other);
                    keep = true;
                
            
            if (keep)
            
                result.AddFeature(union);
            
        

【讨论】:

非常感谢您的解释和示例!

以上是关于两条地理线的交点的主要内容,如果未能解决你的问题,请参考以下文章

由点指定的两条无限线的交点

两条线的交点 - 数值分析

SKShapeNode 检测两条线的交点

检测手写 X 并找到它的中心(形成 X 的两条线的交点)

java 计算线的方位角和两条直线的交点

使用PADS2007 PCB LAYOUT 时导入DXF板框如何定义好原点在在板框两条线的交点。