EF Core 使用空间数据需三步:安装对应数据库的 NetTopologySuite 扩展包并引用 NetTopologySuite 基础包;在 DbContext 配置中调用 UseNetTopologySuite();实体属性使用 NTS 几何类型并显式设置 SRID 4326,注意坐标顺序为经度优先。
EF Core 使用空间数据,核心是靠 NetTopologySuite(NTS) 提供几何类型支持,并配合数据库提供者的空间扩展包完成映射与查询。它不是开箱即用的功能,需要显式启用、正确配置类型和 SRID,否则会报错或行为异常。
不同数据库需引用不同的空间扩展包,不能混用:
DYLD_LIBRARY_PATH)同时必须安装基础 NTS 包:NetTopologySuite,它是所有几何类型(Point、Polygon、LineString 等)的来源。
配置连接时,必须显式调用 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 或字符串字段,查询也完全无法使用空间函数。
NTS 类型默认 SRID 为 0,但绝大多数地理场景(如 GPS、地图 API)要求明确使用 SRID 4326(WGS 84):
modelBuilder.Entity() .Property(e => e.Location) .HasSrid(4326); // 必须设置,否则距离计算、索引等可能出错
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] 顺序相反,容易填反。
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小时内与您取得联系。