LINQ命令用于GPS数据的数据减少

时间:2016-01-15 09:40:48

标签: c# linq

我有这个:

public class LatLon
{
    public double lat {get;set;}
    public double lon {get;set;}
}
{p}在List<LatLon>中。它包含

p1 { lat = 49.9429989, lon = 3.9542134 } 
p2 { lat = 49.9429989, lon = 3.9542133 }
p3 { lat = 49.9429989, lon = 3.9542136 } 

等。

我的目标是从此列表中删除与其他坐标的差异低于lat_bound和lon_bound的边界的坐标,因此即使录制人员长时间站在一个地方,也意味着只剩下一个坐标。什么是LINQ命令?

示例:

p1 { lat = 4.555, lon = 6.555 } 
p2 { lat = 4.556, lon = 6.556 }

然后Math.Abs(p1.lat - p2.lat) = 0.001Math.Abs(p1.lon - p2.lon) = 0.001p1.lon - p2.lon一个其他坐标的lon-value的差异。假设lon_bound等于0.0005,那么如果lat_bound也是0.0005,那么这个非常坐标将被删除,因为0.001&gt; 0.0005

编辑:我决定转而使用http://www.gpsbabel.org

4 个答案:

答案 0 :(得分:3)

LINQ不会创造奇迹。您指的问题不仅仅是“Distict”类型问题。

1你必须为 measure distance between 2 points创建一个函数。

第二,你需要detect clusters of points ..(将关闭点组织成小组)

最后要做的最简单的事情就是按照归属群集进行分组,并且每组只保留1个点......

但是又一次.....还有其他几个问题可能无法产生准确的结果。

例如,最能代表其群体的一点是什么?

答案 1 :(得分:1)

您可以使用Math.Round将值四舍五入到您想要的精度。 然后使用Linq Distinct删除重复项。

void Main()
{
    var list = new List<Coordinate>()
    {
        new Coordinate(25.25251, 100.21254),
        new Coordinate(25.25252, 100.21255),
        new Coordinate(25.25253, 100.21256),
        new Coordinate(25.80000, 100.90000)
    };
    int precision = 4;
    var res = list.Select(x => new Coordinate(
                               Math.Round(x.Lon, precision), 
                               Math.Round(x.Lat, precision))).Distinct().ToList();
}

public struct Coordinate
{
    private double lon;
    private double lat;

    public Coordinate(double lon, double lat)
    {
        this.lon = lon;
        this.lat = lat;
    }

    public double Lat { get { return lat; } }
    public double Lon { get { return lon; } }
}

(请注意,我有一个结构而不是一个用于坐标的课程)

答案 2 :(得分:0)

如果你有一个函数Func<LatLon, LatLon, bool> bounded,如果两个点在你的范围内,则返回true,如果没有,则返回false,那么这个查询有效:

var keeps =
    latlons
        .Aggregate(new List<LatLon>(), (xs, y) =>
        {
            if (!xs.Any(x => bounded(x, y)))
            {
                xs.Add(y);
            }
            return xs;
        });

答案 3 :(得分:0)

您可以按照以下方式过滤:

Distinct

您无法使用Distinct,因为它会删除之前看到的值的点,即使它们之间存在不同的值。

此外,这种方法具有O(N)复杂度,因此至少在理论上它的性能优于<% List<Location> result = new ArrayList<>(); if (basicSearchBean.validate()) { result = basicSearchBean.getResult(); } pageContext.setAttribute("result", result); %> <div style="width: 800px; margin-left: 50px; margin-top: 30px;"> <% if ( result.size() > 0 ) { %> //VISUALIZATION PART <% } %> </div> 。它也适用于结构和类。