1

抱歉,如果问题不是 100% 与 SQL Server 本身相关。但我认为它与主题足够接近,可以在这里发布。

我在我的 ASP.NET Web API 项目中使用实体框架。在创建我的 POCO 时,我从浏览器客户端(Google Maps API)收到 LatLngBounds。

我从这些表示我的两个点的输入坐标创建一个 DbGeography (MULTIPOINT) 实例,以重新创建一个矩形。

现在我需要这个 MULTIPOINT 构造的边界框(多边形)。经过一些研究后,我认为 SqlGeometry 程序集中的 STEnvelope 函数可能对此有所帮助,因为我找不到使用 DbGeography 类型执行此操作的方法。在我尝试保存对象之前,代码中的一切看起来都很好。

请参阅此要点,例如代码和来自 EF 的错误消息。有关从 EF 生成的 SQL,请参阅此要点

以这种方式尝试是否有意义,或者我在这里遗漏了一些重要的东西并且有一个更简单的方法?

4

2 回答 2

1
 public static Tuple<double, double, double, double> GetEnvelopeFromPolygon(DbGeography polygon)
    {
        if (polygon == null)
        {
            return new Tuple<double, double, double, double>(0, 0, 0, 0);
        }

        var points = polygon.GetPointsFromPolygon();
        double minLat = double.MaxValue;
        double maxLat = double.MinValue;
        double minLon = double.MaxValue;
        double maxLon = double.MinValue;

        foreach (Tuple<double, double> point in points)
        {
            double lat = point.Item1;
            double lon = point.Item2;
            if (lat < minLat)
            {
                minLat = lat;
            }
            if (lat > maxLat)
            {
                maxLat = lat;
            }
            if (lon < minLon)
            {
                minLon = lon;
            }
            if (lon > maxLon)
            {
                maxLon = lon;
            }

        }

        var res = new Tuple<double, double, double, double>(minLat, maxLat, minLon, maxLon);
        return res;
    }


  public static IEnumerable<Tuple<double, double>> GetPointsFromPolygon(this System.Data.Entity.Spatial.DbGeography geo)
    {
        for (int i = 1; i < geo.PointCount; i++)
        {
            var p = geo.PointAt(i);
            yield return new Tuple<double, double>(p.Latitude.Value, p.Longitude.Value);
        }

        var pFinal = geo.PointAt(1);
        yield return new Tuple<double, double>(pFinal.Latitude.Value, pFinal.Longitude.Value);
    }
于 2017-11-14T21:12:46.097 回答
-1

让它工作。但仍然不确定这是否是没有并发症的方法。但至少存储对象通过改变

poi.Shape = DbGeography.FromGml(envelop.AsGml().Value);

poi.Shape = DbGeography.FromText(envelop.ToString());

让问题悬而未决,也许其他人可以提供更好的解决方案。

于 2013-06-07T14:24:36.627 回答