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(20)]
        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 = 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;
        }

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

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

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

EF保存平面数据到SqlServer,布布扣,bubuko.com

时间: 2024-10-05 04:26:06

EF保存平面数据到SqlServer的相关文章

EF 连接MySQL 数据库 ?保存中文数据后乱码问题

EF 连接MySQL 数据库  保存中文数据后乱码问题 采用Code First 生成的数据库,MySQL数据库中,生成的表的编码格式为***** 发现这个问题后,全部手动改成UTF8(图是另一个表的图),否则插入的数据,就会全部变成乱码 修改后可以正常插入数据(注意!!这里是直接用SQL 代码插入的数据) 之后用代码界面保存数据,如图 但数据中却变成乱码: 修改方法: 在连接MySQL的连接字符串中,加入配置文件信息:Character Set=utf8  来自为知笔记(Wiz)

衡阳高防服务器租用-数据从sqlserver导入mysql数据库的体验

衡阳高防服务器租用-数据从sqlserver导入mysql数据库的体验 第一种是安装mysql ODBC,利用sql server的导出功能,选择mysql数据源,进行数据的直接导出,这种方法很简便,但是针对实际应用有很多弊端,最主要体现就是数据类型问题,首先,sql server数据库中的ntext,image等数据类型的数据无法直接写入到mysql数据库中,据说只要稍加改动就可以,可惜偶这只菜鸟还没想到如何改动,其次,因为偶在mysql中的数据库设计中将时间都设成int型(保存的是时间戳),

EF批量添加数据性能慢的问题的解决方案

//EF批量添加数据性能慢的问题的解决方案 public ActionResult BatchAdd() { using (var db = new ToneRoad.CEA.DbContext.DbContext()) { //**********************第一种解决方案 直接使用sql********************** string sqls = ""; for (int i = 0; i < 100000; i++) { sqls += "

EF实体框架数据操作基类(转)

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Data.Entity.Infrastruct

EF实体框架数据操作接口(转)

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Linq;using System.Linq.

EF实体框架数据操作接口

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Linq;using System.Linq.

EF实体框架数据操作基类

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Data.Entity.Infrastruct

ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 使用 EF 框架查询数据 上一章节我们学习了如何设置和初始化数据库,以及如何创建迁移代码和应用迁移代码.本章节我们就学习如何使用 EF 框架来查询数据库,至于添加和修改,后面的章节中我们会慢慢学习到 添加测试数据 我们首先使用 SQLite Studio 添加三条数据 ID Name 1 李白 2 杜甫 3 白居易 使用 SQLite Studio

BIM工程信息管理系统-EF实体框架数据操作基类

EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// <summary> /// MSSQL数据库 数据层的父类 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDAL<T> where T :