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);
}
广告实体里用DbGeometry类型记录多边形范围
/// <summary>
/// 广告范围表
/// </summary>
[Serializable]
public class AdvRange : Entity
{
/// <summary>
/// 广告范围名
/// </summary>
[Required]
[Length()]
public string Name { get; set; } /// <summary>
/// 所属城市标识ID
/// </summary>
public Guid CityId { get; set; } /// <summary>
/// 多边形
/// </summary>
public DbGeometry Polygon { get; set; }
}
从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 = ; i < points.Length; i = i + )
{
list.Add(new LngLat { Lng = points[i], Lat = points[i + ] });
}
if (list.First().GetHashCode() == list.Last().GetHashCode())
{
list.RemoveAt(list.Count - );
}
return list;
}
广告范围是否包含客户位置的点
DbGeometry有很多方法和属性,EF可以将其翻译到对应的sql语句,其中Polygon.Intersects(point)可以判断点是否在多边形内。
效果图(中心的红标注为多边形的重心)

EF保存平面数据到SqlServer的更多相关文章
- EF 连接MySQL 数据库 保存中文数据后乱码问题
EF 连接MySQL 数据库 保存中文数据后乱码问题 采用Code First 生成的数据库,MySQL数据库中,生成的表的编码格式为***** 发现这个问题后,全部手动改成UTF8(图是另一个表的 ...
- (26)ASP.NET Core EF保存(基本保存、保存相关数据、级联删除、使用事务)
1.简介 每个上下文实例都有一个ChangeTracker,它负责跟踪需要写入数据库的更改.更改实体类的实例时,这些更改会记录在ChangeTracker中,然后在调用SaveChanges时会被写入 ...
- EF批量添加数据性能慢的问题的解决方案
//EF批量添加数据性能慢的问题的解决方案 public ActionResult BatchAdd() { using (var db = new ToneRoad.CEA.DbContext.Db ...
- EF连接MySQL数据Web.Config配置
EF连接MySQL数据Web.Config配置 <?xml version="1.0" encoding="utf-8"?> <configu ...
- ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 使用 EF 框架查询数据 上一章节我们学习了如何设置 ...
- BIM工程信息管理系统-EF实体框架数据操作基类
EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// & ...
- 深入理解 EF Core:EF Core 写入数据时发生了什么?
阅读本文大概需要 14 分钟. 原文:https://bit.ly/2C67m1C 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能 ...
- C#批量插入数据到Sqlserver中的四种方式
我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...
- sql 批量插入数据到Sqlserver中 效率较高的方法
使用SqlBulk #region 方式二 static void InsertTwo() { Console.WriteLine("使用Bulk插入的实现方式"); Stopwa ...
随机推荐
- ElasticSearch Filter Aggregations
类似于sql语句中where子句的作用 { "query": { "match_all": {} }, "aggs": { "ag ...
- python enumerate 函数用法
enumerate字典上是枚举.列举的意思. C语言中关键字enum也是enumerate的缩写. python中enumerate方法,返回一个enumerate类型.参数一般是可以遍历的的 ...
- 【node.js】安装express后,'express' 不是内部或外部命令的问题
因express默认安装是最新的版本,已经是4.x.x的版本.而最新express4.0+版本中将命令工具分出来了,所以必须要安装express-generator,执行: D:\TOOLS\Node ...
- phpcms v9调用多个栏目下文章的方法
示例:{pc:get sql="SELECT * from v9_news where status=99 and catid in(6,7,8) order by id DESC" ...
- android ndk编译x264开源(用于android的ffmpeg中进行软编码)
http://blog.csdn.net/u012917616/article/details/40921833 不废话,直接上.sh脚本: export NDK=/home/xxx/my_softw ...
- Uva10082 WERTYU -S.B.S.
A common typing error is to place the hands on the keyboard one row to the right of the correct posi ...
- 用Python和摄像头制作简单的延时摄影
“延时摄影(英语:Time-lapse photography)是以一种较低的帧率拍 下图像或者视频,然后用正常或者较快的速率播放画面的摄影技术.在一段延时摄影视频中,物体或者景物缓慢变化的过程被压缩 ...
- Unity中小地图做法
FPS游戏的小地图 在FPS的这个Demo中,制作了一个小地图,效果图如下 主相机设置 下面来看一下,主相机的设置 解释 通过上面两幅图,能够看出来两个摄像机所渲染的Layer不一样,当然它们所在的L ...
- Linux命令学习-mkdir
1. [root@www tmp]# mkdir test <=建立一名为 test 的新目录 2. [root@www tmp]# mkdir -p /opt/tmp/abc < ...
- Mac必装app-持续更新
所有软件都是免费,或者有破解版 都可以在google上***for mac 搜索到 Google Chrome Microsoft Office Evernote Skype Alfred AppCl ...