NHibernate.Spatial 8结合NetTopologySuite 2.0如何处理IPoint移除问题
解决NHibernate.Spatial 8 + NetTopologySuite 2.0的类型转换问题
问题根源
NetTopologySuite 2.0彻底移除了对GeoAPI库的依赖,原GeoAPI.Geometries命名空间下的所有接口(如IPoint)已被迁移至NetTopologySuite.Geometries命名空间,且NTS自身提供了完整的接口实现,无需自行实现。
代码更新步骤
1. 替换命名空间引用
将代码中所有using GeoAPI.Geometries;替换为using NetTopologySuite.Geometries;,同时移除项目中旧的GeoAPI NuGet包。
2. 修正类型声明
- 原使用
GeoAPI.Geometries.IPoint的地方,直接替换为NetTopologySuite.Geometries.IPoint或具体类NetTopologySuite.Geometries.Point - 示例修正:
// 旧代码 GeoAPI.Geometries.IPoint oldPoint = new NetTopologySuite.Geometries.Point(0,0); // 新代码 NetTopologySuite.Geometries.IPoint newPoint = new NetTopologySuite.Geometries.Point(0,0); // 或直接使用具体类 NetTopologySuite.Geometries.Point concretePoint = new NetTopologySuite.Geometries.Point(0,0);
NHibernate.Spatial 8中使用NTS 2.0的正确方式
创建空间点
推荐使用NtsGeometryServices提供的工厂类创建,保证与NHibernate Spatial的兼容性:
// 获取全局GeometryFactory var geometryFactory = NetTopologySuite.NtsGeometryServices.Instance.CreateGeometryFactory(); // 创建Point var locationPoint = geometryFactory.CreatePoint(new Coordinate(116.397, 39.908));
也可以直接实例化Point类:
var simplePoint = new NetTopologySuite.Geometries.Point(116.397, 39.908);
实体映射配置
Fluent NHibernate示例
public class LocationMap : ClassMap<Location> { public LocationMap() { Id(x => x.Id); // 映射Point类型属性 Map(x => x.Coordinate).CustomType<NHibernate.Spatial.Type.PointType>(); } }
XML映射示例
<class name="Location"> <id name="Id" /> <property name="Coordinate" type="NHibernate.Spatial.Type.PointType, NHibernate.Spatial" /> </class>
空间查询操作
直接使用NTS的空间API构建查询条件,NHibernate.Spatial 8会自动转换为数据库对应的空间函数:
// 查询距离指定点1000米范围内的位置 var targetPoint = new Point(116.397, 39.908); var nearbyLocations = session.Query<Location>() .Where(l => l.Coordinate.Distance(targetPoint) < 1000) .ToList();
内容的提问来源于stack exchange,提问作者PA-WARE ASSISTENZA
相关产品推荐
相关产品推荐

