全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

EF Core如何使用空间数据类型 EF Core NetTopologySuite地理信息教程

EF Core 使用空间数据需三步:安装对应数据库的 NetTopologySuite 扩展包并引用 NetTopologySuite 基础包;在 DbContext 配置中调用 UseNetTopologySuite();实体属性使用 NTS 几何类型并显式设置 SRID 4326,注意坐标顺序为经度优先。

EF Core 使用空间数据,核心是靠 NetTopologySuite(NTS) 提供几何类型支持,并配合数据库提供者的空间扩展包完成映射与查询。它不是开箱即用的功能,需要显式启用、正确配置类型和 SRID,否则会报错或行为异常。

安装对应数据库的 NetTopologySuite 扩展包

不同数据库需引用不同的空间扩展包,不能混用:

  • SQL Server:`Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite`
  • PostgreSQL(PostGIS):`Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite`
  • SQLite(SpatiaLite):`Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite` + `sqlite3` 原生库(macOS/Linux 需设 DYLD_LIBRARY_PATH
  • MySQL(Pomelo):`Pomelo.EntityFrameworkCore.MySql.NetTopologySuite`

同时必须安装基础 NTS 包:NetTopologySuite,它是所有几何类型(PointPolygonLineString 等)的来源。

在 DbContext 中启用 NetTopologySuite

配置连接时,必须显式调用 UseNetTopologySuite() 方法:

// SQL Server 示例
options.UseSqlServer(connectionString, x => x.UseNetTopologySuite());
// PostgreSQL 示例
options.UseNpgsql(connectionString, x => x.UseNetTopologySuite());
// SQLite 示例
options.UseSqlite(connectionString, x => x.UseNetTopologySuite());

注意:不加这一步,即使模型里用了 Point,EF Core 也会忽略空间能力,生成普通 BLOB 或字符串字段,查询也完全无法使用空间函数。

定义实体中的空间属性并指定 SRID

NTS 类型默认 SRID 为 0,但绝大多数地理场景(如 GPS、地图 API)要求明确使用 SRID 4326(WGS 84)

  • 在模型中用 Fluent API 显式声明:
modelBuilder.Entity()
    .Property(e => e.Location)
    .HasSrid(4326); // 必须设置,否则距离计算、索引等可能出错
  • 属性类型推荐使用 NTS 原生类:
public class Store
{
    public int Id { get; set; }
    public string Name { get; set; }
    public NetTopologySuite.Geometries.Point Location { get; set; } // 不要用 string 或 byte[]
}

注意:坐标顺序是 X(经度)、Y(纬度),例如 new Point(113.4667, 22.2723) { SRID = 4326 } —— 这和前端常写的 [lat, lng] 顺序相反,容易填反。

执行空间查询(如“附近5公里的门店”)

EF Core 会把 NTS 方法自动翻译成数据库原生空间函数(如 SQL Server 的 STDistance、PostGIS 的 ST_DWithin):

var current = new NetTopologySuite.Geometries.Point(113.4667, 22.2723) { SRID = 4326 };

var nearby = await context.Stores
    .Where(s => s.Location.Distance(current) < 0.05) // 单位是“度”,非米!
    .OrderBy(s => s.Location.Distance(current))
    .Take(10)
    .ToListAsync();

⚠️ 注意:Distance() 返回单位取决于 SRID 和数据库。对 4326,SQL Server 返回“米”,PostgreSQL 默认返回“米”(若用 ST_DWithin),但 SQLite/SpatiaLite 返回“度”——建议生产环境统一用 STDistance + 索引,或在数据库层做单位转换。

更安全的做法是用数据库原生函数封装(如 SQL Server 的 STDistance):

.Where(s => EF.Functions.STDistance(s.Location, current) < 5000) // 明确单位:米

基本上就这些。关键点就三个:装对包、启用 UseNetTopologySuite、设好 SRID 和坐标顺序。不复杂但容易忽略细节。


# mysql  # linux  # 前端  # go  # mac  # ai  # macos  # microsoft  # sqlserver  # cos  # .net  # sql  # 数据类型  # 封装  # 字符串  # sqlite  # postgresql  # 数据库  # 也会  # 推荐使用  # 它是  # 用了  # 会把  # 报错  # 不加  # 则会  # 这和  # 不要用 


相关文章: 惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何在Golang中使用replace替换模块_指定本地或远程路径  电商网站制作价格怎么算,网上拍卖流程以及规则?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  建站之星客服服务时间及联系方式如何?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  如何使用Golang安装API文档生成工具_快速生成接口文档  专业公司网站制作公司,用什么语言做企业网站比较好?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  如何快速生成ASP一键建站模板并优化安全性?  建站之星安装模板失败:服务器环境不兼容?  如何在新浪SAE免费搭建个人博客?  Swift中swift中的switch 语句  建站主机选购指南:核心配置优化与品牌推荐方案  建站之星在线客服如何快速接入解答?  建站之星代理如何获取技术支持?  建站之星会员如何解锁更多建站功能?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  C#如何使用XPathNavigator高效查询XML  如何用西部建站助手快速创建专业网站?  如何快速生成专业多端适配建站电话?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  外贸公司网站制作哪家好,maersk船公司官网?  如何快速搭建高效服务器建站系统?  网站制作话术技巧,网站推广做的好怎么话术?  如何用美橙互联一键搭建多站合一网站?  如何用狗爹虚拟主机快速搭建网站?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  宝塔Windows建站如何避免显示默认IIS页面?  如何用PHP工具快速搭建高效网站?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  小程序网站制作需要准备什么资料,如何制作小程序?  PHP 500报错的快速解决方法  盘锦网站制作公司,盘锦大洼有多少5G网站?  如何在IIS中新建站点并解决端口绑定冲突?  大连 网站制作,大连天途有线官网?  已有域名如何免费搭建网站?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  h5在线制作网站电脑版下载,h5网页制作软件?  如何用腾讯建站主机快速创建免费网站?  网站制作公司排行榜,抖音怎样做个人官方网站  手机网站制作与建设方案,手机网站如何建设?  高防服务器租用指南:配置选择与快速部署攻略  如何通过NAT技术实现内网高效建站?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  表情包在线制作网站免费,表情包怎么弄?  制作网站的模板软件,网站怎么建设? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。