0

我正在使用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 分量(以防第一个被假定为经度而不是纬度)

谢谢!

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

4

1 回答 1

2

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