• sql server & .net core 使用空间数据


    使用的库

    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)

  • 相关阅读:
    JavaScript 实现打印操作
    linux-centos7.6设置固定IP网络方法
    VMware网络配置三种网络模式(桥接、NAT、Host-only)
    SVN 执行cleanup报错:Cleanup failed to process the following paths
    word生成目录的pdf
    win10开机后将存在多个系统选择,改为直接进入系统无需选择
    Win10删除或是不显示快速访问中最近使用文件记录
    Dell T30解决报Alert! Cover was previously removed.
    WIN10安装.net报0x800F081F解决方法
    查看SVN当前登录用户
  • 原文地址:https://www.cnblogs.com/Lulus/p/10408633.html
Copyright © 2020-2023  润新知