System.Data.Spatial DbGeography.Distance不能始终如一地工作

时间:2018-07-13 19:37:36

标签: c# geolocation dbgeography

我正在开发一个需要计算点之间距离的应用程序。 我正在使用LINQ和DbGeography类来实现这一目标。

在大多数情况下,它在应用程序中都能正常工作,但是我遇到了一个问题,即它无法返回正确的结果。请查看是否发现问题。

我有用于测试目的的硬编码值。

    private void GetUsersByDistance()
    {

        //this code is just for debugging 
        //end this code is just for debugging 


        /// this is the center of town in Santa Cruz
        var lat = decimal.Parse("36.9741171");
        var lng = decimal.Parse("-122.0307963");


        // this is about a 1/4 mile away in Santa Cruz 
        var lat2 = decimal.Parse("36.971524");
        var lng2 = decimal.Parse("-122.0166850");

        var theUsers = new List<PseudoProfile>();

        DbGeography geo = DbGeography.FromText(String.Format("POINT({0} {1})", lng.ToString(CultureInfo.InvariantCulture), lat.ToString(CultureInfo.InvariantCulture)));

        var users =
         (from u in _WebEntities.Users
          select u)
          .AsEnumerable()
          .Where(u => geo.Distance(DbGeography.FromText("POINT(" + lng2.ToString(CultureInfo.InvariantCulture) + " " + lat2.ToString(CultureInfo.InvariantCulture) + ")")) < 100)
          .ToList();
    }

这个确切的代码可以与其他值一起正常工作,所以我很困惑。 请帮助

谢谢

1 个答案:

答案 0 :(得分:0)

.Where(u => geo.Distance(DbGeography.FromText("POINT(" + lng2.ToString(CultureInfo.InvariantCulture) + " " + lat2.ToString(CultureInfo.InvariantCulture) + ")")) < 100)

您的过滤器将仅返回距离小于100米的位置。我已经计算出上述硬编码位置,并且距离为1289.0501038954687米。

如果您打算吸引用户100英里之内,请更改为以下代码,以将米转换为英里

.Where(u => geo.Distance(DbGeography.FromText("POINT(" + lng2.ToString(CultureInfo.InvariantCulture) + " " + lat2.ToString(CultureInfo.InvariantCulture) + ")")) / 1609.34 < 100)