使用的库

Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFrameworkSqlServer()
.AddDbContext<YourDbContext>(options => options.UseSqlServer(_configuration.GetConnectionString("SqlServer"),
//映射到空间数据的数据库中的类型在模型中使用 NTS 类型
x => x.UseNetTopologySuite()));
}

建表需要注意:Geography or geometry

By default, spatial properties are mapped to geography columns in SQL Server. To use geometry, configure the column type in your model.

默认的数据类型是geography,如果要使用geometry,需要声明

比如使用geoserver,不识别geography,则需要geometry

[Column(TypeName = "geometry")]
public Polygon Shape { get; set; }

参考资料

新增/修改数据

//srid=4326:wgs84
var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(srid: 4326);
var currentLocation = geometryFactory.CreatePoint(new Coordinate(x, y));

线

//LinearRing的点必须形成一个封闭的线串,而LineString则不需要
var line = new NetTopologySuite.Geometries.LineString(new Coordinate[]
{
new Coordinate(10,0),
new Coordinate(10,10),
new Coordinate(0,10),
new Coordinate(0,0),
//new Coordinate(10,0),
});
//设置坐标系
line.SRID = srid;

var geom = new NetTopologySuite.Geometries.Polygon(
new LinearRing(new Coordinate[]
{
//逆时针绘制
new Coordinate(10,0),
new Coordinate(10,10),
new Coordinate(0,10),
new Coordinate(0,0),
new Coordinate(10,0),
}));
//设置坐标系
geom.SRID = srid;

查询数据

概念

GeoJSON:一种地理数据的描述格式。GeoJSON可以描述的对象包括:几何体,要素和要素集。(相关资料)

使用GepJSON需要引用一个新库

GeoJSON.Net

WKT(Well-known text):一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(well-known-binary)则胜于在传输和在数据库中存储相同的信息。该格式由开放地理空间联盟(OGC)制定。WKT可以表示的几何对象包括:点,线,多边形,TIN(不规则三角网)及多面体。(相关资料)

Geometry/geojson/WKT 三者可以互转

//Geometry to GeoJSON
Position position = new Position(x, y);
GeoJSON.Net.Geometry.Point point = new GeoJSON.Net.Geometry.Point(position);
var s = JsonConvert.SerializeObject(point);
//Geometry to wkt
var s2= NetTopologySuite.IO.WKTWriter.ToPoint(city.Location.Coordinate);

结果

"GeoJSON结果:{\"type\":\"Point\",\"coordinates\":[10.0,100.0]},WKT结果:POINT(100 10)"

线

//Geometry to GeoJSON
var coordinates = new List<IPosition>();
foreach (var item in road.Line.Coordinates)
{
coordinates.Add(new Position(item.X, item.Y, item.Z));
}
GeoJSON.Net.Geometry.LineString line = new GeoJSON.Net.Geometry.LineString(coordinates);
var s= JsonConvert.SerializeObject(line);
//Geometry to wkt
var s2 = NetTopologySuite.IO.WKTWriter.ToLineString(road.Line.CoordinateSequence);

结果

"GeoJSON结果:{\"type\":\"LineString\",\"coordinates\":[[0.0,10.0,\"NaN\"],[10.0,10.0,\"NaN\"],[10.0,0.0,\"NaN\"],[0.0,0.0,\"NaN\"]]},WKT结果:LINESTRING(10 0, 10 10, 0 10, 0 0)"

//Geometry to GeoJSON
var lines = new List<GeoJSON.Net.Geometry.LineString>();
var polygon = country.Border as NetTopologySuite.Geometries.Polygon;
List<Coordinate[]> res = new List<Coordinate[]>();
res.Add(polygon.Shell.Coordinates);
foreach (ILineString interiorRing in polygon.InteriorRings)
{
res.Add(interiorRing.Coordinates);
}
foreach(var line in res)
{
var coordinates = new List<IPosition>();
foreach (var item in line)
{
coordinates.Add(new Position(item.X, item.Y, item.Z));
}
lines.Add(new GeoJSON.Net.Geometry.LineString(coordinates));
}
GeoJSON.Net.Geometry.Polygon jsonPolygon = new GeoJSON.Net.Geometry.Polygon(lines);
var s = JsonConvert.SerializeObject(jsonPolygon);
//Geometry to wkt
//点和线的是静态方法,面的是方法_(:з」∠)_
var writer = new NetTopologySuite.IO.WKTWriter();
var s2 = writer.Write(country.Border);

结果

"GeoJSON结果:{\"type\":\"Polygon\",\"coordinates\":[[[0.0,10.0,\"NaN\"],[10.0,10.0,\"NaN\"],[10.0,0.0,\"NaN\"],[0.0,0.0,\"NaN\"],[0.0,10.0,\"NaN\"]]]},WKT结果:POLYGON ((10 0, 10 10, 0 10, 0 0, 10 0))"

计算

计算点与点之间的距离

var distance= NetTopologySuite.Operation.Distance.DistanceOp.Distance(point1, point2);

点是否包含在面以内

var prepGeom = NetTopologySuite.Geometries.Prepared.PreparedGeometryFactory.Prepare(geom);
var isContain = prepGeom.Contains(point);

经纬度Longitude && Latitude

sql server

Coordinates in NTS are in terms of X and Y values. To represent longitude and latitude, use X for longitude and Y for latitude. Note that this is backwards from the latitude, longitude format in which you typically see these values.

简单来说,X是longitude(经度),Y是latitude(纬度)

geojson

geojson则是相反的

public Position(double latitude, double longitude, double? altitude = null)

示例代码

示例代码

参考资料

空间数据

空间类型 - geometry (Transact-SQL)

NTS Topology Suite

空间数据 (SQL Server)

最新文章

  1. 3D旋转菜单
  2. CSS3绘制弹球动画效果
  3. BSD Apache GPL LGPL MIT
  4. OGLplus 0.33.0 发布,OpenGL 的 C 封装库
  5. CentOS创建免密码SSH(密钥)
  6. 基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构
  7. ajax 原理----初级篇
  8. win10 uwp 随着数字变化颜色控件
  9. HashMap源码阅读
  10. Java 调用python说明文档
  11. MySQL入门笔记(二)
  12. spring boot 系列之三:spring boot 整合JdbcTemplate
  13. java 多线程例子
  14. 在基于debian的deepin或者Ubuntu上双等号“==”和双中括号“[[]]”不能使用的真相
  15. 派生 de rive
  16. Java框架spring Boot学习笔记(五):Spring Boot操作MySQL数据库增、删、改、查
  17. cf 1132 F
  18. CLOS网络架构与FATTREE胖树拓扑
  19. python之用户登陆作业
  20. centos 7 初始化脚本

热门文章

  1. 【u123】最大子段和
  2. 一个Exception catch不住的【异常】
  3. ios开发runtime学习二:runtime交换方法
  4. mycat主从读写分离范例
  5. 联想笔记本装win7
  6. [React] Recompose: Theme React Components Live with Context
  7. tcp长连接和短连接
  8. 【codeforces 546E】Soldier and Traveling
  9. 【t019】window(单调队列)
  10. OC常用数据类型大全解