视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
EF保存平面数据到SqlServer
2020-11-09 07:38:47 责编:小采
文档

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

前言

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

EF平面对象DbGeometry

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

 /// 
 /// 从多点数据生成多边形
 /// 
 /// 百度地图多边形的点集
 public static DbGeometry PolygonFromPointsJson(string pointsJson)
 {
 var points = JsonSerializer.ToEntity>(pointsJson);
 if (points.First().GetHashCode() != points.Last().GetHashCode())
 {
 points.Add(points.First());
 }

 var closePoints = ((IEnumerable)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类型记录多边形范围

 /// 
 /// 广告范围表
 /// 
 [Serializable]
 public class AdvRange : Entity
 {
 /// 
 /// 广告范围名
 /// 
 [Required]
 [Length(20)]
 public string Name { get; set; }

 /// 
 /// 所属城市标识ID
 /// 
 public Guid CityId { get; set; }

 /// 
 /// 多边形
 ///  
 public DbGeometry Polygon { get; set; }
 }

View Code

从DbGeometry对象获取多边形的点

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

 /// 
 /// 获取多边形的点
 /// 
 /// 
 public static List GetPolygonPoints(this DbGeometry geometry)
 {
 var list = new List();
 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)可以判断点是否在多边形内。

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

下载本文
显示全文
专题