zoukankan      html  css  js  c++  java
  • EF保存平面数据到SqlServer

    前言

    公司开展一个项目,需要根据客户手机定位获取周围内的精准广告,具体是管理员在地图上绘制多边形的广告范围,落在范围内的客户就看到此广告。下面将我的实现方法简单叙述一下,以供有相同需求的朋友参考。

    EF平面对象DbGeometry

    DbGeometry可以表示点、线、多边形等平面对象,输入对象可以是WKT(Well-known text),我们可以把百度地图上的polygon对象的点转换为多边形的wkt描述,再转为DbGeometry进行保存。

        /// <summary>
            /// 从多点数据生成多边形
            /// </summary>
            /// <param name="pointsJson">百度地图多边形的点集</param>
            public static DbGeometry PolygonFromPointsJson(string pointsJson)
            {
                var points = JsonSerializer.ToEntity<List<LngLat>>(pointsJson);
                if (points.First().GetHashCode() != points.Last().GetHashCode())
                {
                    points.Add(points.First());
                }
    
                var closePoints = ((IEnumerable<LngLat>)points).Select(item => string.Format("{0} {1}", item.Lng, item.Lat));
                var wkt = "POLYGON((" + string.Join(",", closePoints) + "))";
                return DbGeometry.PolygonFromText(wkt, SYSTEM_ID);
            }
    View Code

    广告实体里用DbGeometry类型记录多边形范围

     /// <summary>
        /// 广告范围表
        /// </summary>
        [Serializable]
        public class AdvRange : Entity
        {
            /// <summary>
            /// 广告范围名
            /// </summary>
            [Required]
            [Length(20)]
            public string Name { get; set; }
    
            /// <summary>
            /// 所属城市标识ID
            /// </summary>
            public Guid CityId { get; set; }
    
            /// <summary>
            /// 多边形
         /// </summary> 
            public DbGeometry Polygon { get; set; }
        }
    View Code

    从DbGeometry对象获取多边形的点

    DbGeometry对象的WellKnownValue属性的可以获取WKT文本,目前我没有找到相关工具转WKT转为Json,所以用正则表达式获取也能满足需要,然后将结果转换为json就可以放到地图上进行展示了。

     /// <summary>
            /// 获取多边形的点
            /// </summary>
            /// <returns></returns>
            public static List<LngLat> GetPolygonPoints(this DbGeometry geometry)
            {
                var list = new List<LngLat>();
                var points = geometry.WellKnownValue.WellKnownText.Matches(@"-?[1-9]d*.d*|-?0.d*[1-9]d*").Select(item => decimal.Parse(item)).ToArray();
                for (var i = 0; i < points.Length; i = i + 2)
                {
                    list.Add(new LngLat { Lng = points[i], Lat = points[i + 1] });
                }
                if (list.First().GetHashCode() == list.Last().GetHashCode())
                {
                    list.RemoveAt(list.Count - 1);
                }
                return list;
            }
    View Code


    广告范围是否包含客户位置的点

     DbGeometry有很多方法和属性,EF可以将其翻译到对应的sql语句,其中Polygon.Intersects(point)可以判断点是否在多边形内。

    效果图(中心的红标注为多边形的重心)

     

  • 相关阅读:
    一个简单的window.onscroll实例
    vue 自定义组件使用v-model
    vue开发后台管理系统有感
    cube打包后css顺序错误
    app嵌套的vue项目更新后,页面没有更新
    vue打包后css背景图片地址找不到
    git取消操作命令
    cube-ui indexList的正确使用
    首次db查询时延迟明显高于后面几次。
    git中的merge与rebase
  • 原文地址:https://www.cnblogs.com/kewei/p/3905344.html
Copyright © 2011-2022 走看看