C#存储并过滤包含双精度数组的列表

时间:2012-03-08 14:42:26

标签: c# arrays gis latitude-longitude

我有十进制纬度/经度值格式的一系列双打。我想存储这些值,当涉及向列表中添加新值时,请查看列表中是否已存在纬度为0.0001且经度为±0.0001的值。如果该值的纬度或经度为±0.0001,我不想存储它。

我想重新创建的是MongoDB Geospatial $ near命令的一个版本。

任何人都可以就如何解决这个问题提出任何建议吗?是否有任何免费的c#地理空间库可以帮助我实现这一目标?

非常感谢您的建议。

3 个答案:

答案 0 :(得分:0)

我不知道任何库,但您可以使用LINQ。这是一个List<Tuple<double, double>>

var y = new Tuple<double, double>(15.25, 18.700001);

if(!coordinates.Any(x => Math.Abs(x.Item1 - y.Item1) <= 0.0001 || Math.Abs(x.Item2 - y.Item2) <= 0.0001)) {
    // No coordinate in the list is within ±0.0001 of either the latitude or the longitude
    coordinates.Add(y);
}

答案 1 :(得分:0)

如果我理解正确的话,这样的事情应该适合你,假设坐标被包裹在某种容器中。

public class Coordinates
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}
public bool IsNear(List<Coordinates> coords, double lat, double lon, double tolerance)
{
    return coords.Any(p => Math.Abs(p.Latitude - lat) < tolerance || Math.Abs(p.Longitude - lon) < tolerance);
}

答案 2 :(得分:0)

您需要计算两点之间的距离:

if (Math.Abs(Math.Sqrt((longitude - longitude_before) * (longitude - longitude_before) + (latitude - latitude_before) * (latitude - latitude_before))) > 0.0001)
{
   // Record new point
}

其中latitude_before和longitude_before是记录路径中的最后一个条目 - 在我看来,不需要检查以前的点。如果结果是,并且性能成为问题,则必须查看range search