如何在不使用EF的SQL Server中使用NetTopologySuite?
在SQL Server中读写NetTopologySuite Geometry对象(不使用Entity Framework)
所需依赖
首先安装以下NuGet包:
NetTopologySuite:核心空间数据处理库Microsoft.Data.SqlClient:SQL Server官方数据访问库(替代旧版System.Data.SqlClient)NetTopologySuite.IO.SqlServerBytes:专门处理SQL Server空间类型与NTS对象的转换
写入Geometry到SQL Server
将NTS的Geometry对象转换为SQL Server兼容的字节流,通过参数化查询写入数据库:
using NetTopologySuite.Geometries; using NetTopologySuite.IO; using Microsoft.Data.SqlClient; // 创建示例NTS点对象(指定SRID为WGS84坐标系) var point = new Point(116.397, 39.908) { SRID = 4326 }; // 转换为SQL Server可识别的字节数组 var sqlBytesWriter = new SqlServerBytesWriter(); var geometryBytes = sqlBytesWriter.Write(point); // 执行写入操作 using var conn = new SqlConnection("你的SQL Server连接字符串"); conn.Open(); using var cmd = new SqlCommand("INSERT INTO YourTable (GeoColumn) VALUES (@geo)", conn); cmd.Parameters.AddWithValue("@geo", geometryBytes); cmd.ExecuteNonQuery();
从SQL Server读取Geometry
从数据库读取字节流,转换回NTS的Geometry对象:
using NetTopologySuite.Geometries; using NetTopologySuite.IO; using Microsoft.Data.SqlClient; using var conn = new SqlConnection("你的SQL Server连接字符串"); conn.Open(); using var cmd = new SqlCommand("SELECT GeoColumn FROM YourTable WHERE Id = @id", conn); cmd.Parameters.AddWithValue("@id", 1); using var reader = cmd.ExecuteReader(); if (reader.Read()) { var geometryBytes = reader.GetSqlBytes(0); if (!geometryBytes.IsNull) { // 转换为NTS Geometry对象 var sqlBytesReader = new SqlServerBytesReader(); var geometry = sqlBytesReader.Read(geometryBytes.Value); // 示例:输出坐标信息 Console.WriteLine($"坐标:X={geometry.Coordinate.X}, Y={geometry.Coordinate.Y}"); } }
注意事项
- 确保SQL Server表中字段类型为
geometry或geography,且SRID与NTS对象的SRID保持一致(如常用的4326对应WGS84坐标系) - 若处理
geography类型,只需将SqlServerBytesWriter/SqlServerBytesReader替换为SqlServerGeographyBytesWriter/SqlServerGeographyBytesReader即可
内容的提问来源于stack exchange,提问作者mxcolin
相关产品推荐
相关产品推荐

