NTS库学习,找bug中......

引用库:

代码如下:

cs 复制代码
//using GeoAPI.Geometries;
using NetTopologySuite.Features;
using NetTopologySuite.Geometries;
using NetTopologySuite;
using NetTopologySuite.IO;
using Coordinate = NetTopologySuite.Geometries.Coordinate;
//using GeoAPI;
using NetTopologySuite.Operation.Polygonize;
using System.Threading;
using Point = NetTopologySuite.Geometries.Point;
using Polygon = NetTopologySuite.Geometries.Polygon;
using NetTopologySuite.Index.Quadtree;
using NetTopologySuite.Index.Strtree;
using NetTopologySuite.Triangulate;
using NetTopologySuite.Operation.Linemerge;
using System.Windows.Media;
using GeometryCollection = NetTopologySuite.Geometries.GeometryCollection;
using NetTopologySuite.Operation.Distance;
using NetTopologySuite.Algorithm;
using NetTopologySuite.Index.Bintree;
using System.Net.NetworkInformation;
using GeoAPI.Geometries;
using NetTopologySuite.IO.Esri.Shapefiles;
using NetTopologySuite.IO.Esri.Dbf;
using System.Collections;
[assembly: CommandClass(typeof(IfoxDemo.NTS自己))]//只允许此类快捷键命令

namespace IfoxDemo
{
    public class NTS自己
    {
        [CommandMethod("xx")]
        public static void shp()
        {
            var ed = Env.Editor;
            "ad".Print();
            // 创建一个点对象
            var point = new Point(10, 20);
            ed.WriteMessage("// 创建一个点对象 point :" + point + "\n");
            // 创建一条线段对象
            var line = new LineString(new[] { new Coordinate(0, 0),
                                new Coordinate(10, 10),
                                new Coordinate(20, 0)
                                });
            ed.WriteMessage("// 创建一条线段对象 line :" + line + "\n");
            // 创建一个多边形对象
            var polygon = new Polygon(new LinearRing(new[] {
                                new Coordinate(0, 0),
                                new Coordinate(0, 10),
                                new Coordinate(10, 10),
                                new Coordinate(10, 0),
                                new Coordinate(0, 0)
                                }));
            ed.WriteMessage("//  创建一个多边形对象 polygon : " + polygon + "\n");
            // 计算两个几何对象之间的距离
            var distance = point.Distance(line);
            ed.WriteMessage("//  计算两个几何对象之间的距离 distance: " + distance + "\n");
            // 计算一个几何对象的缓冲区
            var buffer = polygon.Buffer(0.5);
            Env.Editor.WriteMessage("//计算一个几何对象的缓冲区 buffer: " + buffer + "\n");
            // 判断两个几何对象是否相交
            var isIntersect = line.Intersects(polygon);
            ed.WriteMessage("//判断两个几何对象是否相交 isIntersect: " + isIntersect + "\n");

            // 创建一个包含所有几何对象的边界框
            //var envelope = line.Envelope.Union(polygon.Envelope);
            //    public void Insert(Envelope itemEnv, T item)
            //{
            //    CollectStats(itemEnv);
            //    var insertEnv = EnsureExtent(itemEnv, _minExtent);
            //    _root.Insert(insertEnv, item);
            //}
            // 创建一个 Quadtree 索引
            //var index = new Quadtree<NetTopologySuite.Geometries.Geometry>();
            //    index.Insert(envelope,line);//有bug
            //index.Insert(polygon);
            // 在索引中查找与一个几何对象相交的对象
            // var results = index.Query(line.EnvelopeInternal);
            // Env.Editor.WriteMessage("查找与一个几何对象相交的对象 results : " + results);


            GeometryFactory geometryFactory = new GeometryFactory();
            // 创建点
            Point point1 = geometryFactory.CreatePoint(new Coordinate(1.0, 1.0));
            Point point2 = geometryFactory.CreatePoint(new Coordinate(2.0, 12.0));
            Point point3 = geometryFactory.CreatePoint(new Coordinate(21.0, 22.0));
            Point point4 = geometryFactory.CreatePoint(new Coordinate(23.0, 32.0));
            Point point5 = geometryFactory.CreatePoint(new Coordinate(25.0, 42.0));
            Point point6 = geometryFactory.CreatePoint(new Coordinate(27.0, 52.0));
            Point point7 = geometryFactory.CreatePoint(new Coordinate(29.0, 62.0));
            // 使用 DistanceOp 计算两点之间的距离
            DistanceOp distanceOp = new DistanceOp(point1, point2);
            double dist = distanceOp.Distance();
            Env.Editor.WriteMessage("//计算两点之间的距离 dist : " + dist + "\n");
            // 创建线段
            LineString lineString = geometryFactory.CreateLineString(new Coordinate[] {
            new Coordinate(0, 0),
            new Coordinate(1, 1),
            new Coordinate(2, 2)
        });

            // 创建多边形
            Polygon polygon2 = geometryFactory.CreatePolygon(new Coordinate[] {
            new Coordinate(0, 0),
            new Coordinate(0, 1),
            new Coordinate(1, 1),
            new Coordinate(1, 0),
            new Coordinate(0, 0)
        });
            //计算两条线段的夹角(不区分方向)逆时针为正
            var 夹角不区分方向 = AngleUtility.AngleBetween(point1.Coordinate, point3.Coordinate, point2.Coordinate);
            ed.WriteMessage("//夹角不区分方向,逆时针为正" + 夹角不区分方向 + "\n");
            //计算两条线段的夹角(区分方向)
            var 夹角区分方向 = AngleUtility.AngleBetweenOriented(point1.Coordinate, point3.Coordinate, point2.Coordinate);
            ed.WriteMessage("//夹角区分方向" + 夹角区分方向 + "\n");
            // 生成 Delaunay 三角网
            DelaunayTriangulationBuilder dtb = new DelaunayTriangulationBuilder();
            dtb.SetSites(new MultiPoint(new Point[] { point1, point2, point3, point4, point5, point6, point7 }));
            GeometryCollection triangles = (GeometryCollection)dtb.GetTriangles(geometryFactory);
            Env.Editor.WriteMessage("//Delaunay 三角网 triangles: " + triangles + "\n");
            // 合并线段
            LineMerger lineMerger = new LineMerger();
            lineMerger.Add(lineString);
            System.Collections.ICollection mergedLines = (System.Collections.ICollection)lineMerger.GetMergedLineStrings();

            Env.Editor.WriteMessage("//合并线段 mergedLines : " + mergedLines + "\n");
            //创建集合图形
            // 几何创建工厂(也可不使用工厂模式直接创建几何图形)
            var gf = new GeometryFactory();
            var pg3 = gf.CreatePolygon(new[]
            {
            new Coordinate(612, 612),
            new Coordinate(144, 355),
            new Coordinate(165, 188),
            new Coordinate(277, 328),
            new Coordinate(612, 612)
            });
            Env.Editor.WriteMessage(" //创建几何图形Polygon pg3 : " + pg3 + "\n");
            var pg4 = gf.CreatePolygon(new[]
            {
                new Coordinate(412, 612),
                new Coordinate(555, 455),
                new Coordinate(655, 188),
                new Coordinate(577, 328),
                new Coordinate(412, 612)
            });
            //求并集方法
            var union = pg3.Union(pg4);
            Env.Editor.WriteMessage("//求并集:union  " + union + "\n");
            //求差集方法
            var difference = pg3.Difference(pg4);
            Env.Editor.WriteMessage("//求差集:difference  " + difference + "\n");
            // 创建一个包含多个点的集合
            Coordinate[] coordinates = new Coordinate[]
            {
                new Coordinate(0, 0),
                new Coordinate(5, 0),
                new Coordinate(3, 3),
                new Coordinate(0, 5),
                new Coordinate(2, 2),
                new Coordinate(1, 4)
            };
            GeometryFactory geometryFactory2 = new GeometryFactory();
            MultiPoint points = geometryFactory2.CreateMultiPointFromCoords(coordinates);
            Env.Editor.WriteMessage("//包含多个点的集合MultiPoint: " + points + "\n");
            // 使用 NetTopologySuite 计算二维凸包
            ConvexHull convexHull = new ConvexHull(points);
            var geo = new ConvexHull(points.Coordinates, GeometryFactory.Default).GetConvexHull();
            var 二维凸包 = convexHull.GetConvexHull();
            Env.Editor.WriteMessage("//计算二维凸包geo: " + geo + "\n");
            Env.Editor.WriteMessage("//计算二维凸包Convex hull geometry: " + 二维凸包 + "\n");






            //检测一个环是否是简单的(IsSimple)复杂的示例(IsSimple=false,自相交):
            var points2 = new Coordinate[] {
                new Coordinate(2,1), new Coordinate(3, 1),new Coordinate(1,4), new Coordinate(4, 4),
                new Coordinate(2, 1),};
            var ring = new LinearRing(points2);
            ed.WriteMessage("//检测一个环是否是简单的(true)、(自相交false) " + ring.IsSimple + "\n");
            var ring2 = new LinearRing(points2);
            ed.WriteMessage("//检测多边形的顺逆时针 rings2是: " + (ring2.IsCCW ? "逆时针" : "顺时针") + "\n");
            多边形的凹凸(convex / concave) 和 顺(Clockwise)/ 逆(CounterClockwise)时针
            3.1 多边形的凹凸定义:
            凸多边形(convex): 所有的内角都小于180°;
            凹多边形(concave): 至少有一个内角大于180°;
            ///



            //在C#环境中,使用NetTopologySuite.IO.ShapeFile通常涉及以下步骤:
            //1.引入必要的NuGet包,如NetTopologySuite和NetTopologySuite.IO。
            //2.创建`ShapefileReader`或`ShapefileWriter`对象来读取或写入Shapefile。
            //3.使用`ReadShape()`或`ReadFeature()`方法获取Shapefile中的几何对象和属性。
            //4.对数据进行操作,如计算几何、筛选属性等。
            //5.使用`WriteShape()`或`WriteFeature()`方法将修改后的数据写回Shapefile。
            string path = @"C:\Users\Administrator\Desktop\黄岗寺\黄岗寺.shp";
            // 检查文件是否存在
            if (!File.Exists(path))
            {
                ed.WriteMessage("Shapefile not found.\n");
                return;
            }
            ShapefileReader reader = new ShapefileReader(path);


            /*****             读取dbf文件                   ******/
            string dbfPath = @"C:\Users\Administrator\Desktop\黄岗寺\黄岗寺.dbf";
            if (!File.Exists(dbfPath))
            {
                ed.WriteMessage("dbf not found.\n");
                return;
            }
            using var dbf = new DbfReader(dbfPath);
            foreach (var record in dbf)
            {
                foreach (var fieldName in record.GetNames())
                {
                    ed.WriteMessage($"{fieldName,10} {record[fieldName]}\n");
                }
            }


            /************    读取shp文件     *************/

            string shpPath = @"C:\Users\Administrator\Desktop\黄岗寺\黄岗寺.shp";
            if (!File.Exists(shpPath))
            {
                ed.WriteMessage("dbf not found.\n");
                return;
            }

            //foreach (var geometry in Shapefile.ReadAllGeometries(shpPath))
            //{
            //    Console.WriteLine(geometry);
            //}
            var features = NetTopologySuite.IO.Esri.Shapefile.ReadAllFeatures(shpPath);
            int i = 0;
            foreach (var feature in features)
            {
                i++;
                //此时通过NTS库读取的Geometry SRID为0,没有坐标系
                var geometry = feature.Geometry;
                ed.WriteMessage(@$"geometry{i}:" + geometry + "\n");
                //这一步为Geometry添加4326坐标系
                var geometryForWGS84 = GeometryFactory.Default.WithSRID(4326).CreateGeometry(geometry);
                ed.WriteMessage("wkbForWGS84:"+ geometryForWGS84 + "\n");
            }




        }
    }
}
相关推荐
好学且牛逼的马1 小时前
学习随笔录
学习
我爱学嵌入式2 小时前
C语言第 9 天学习笔记:数组(二维数组与字符数组)
c语言·笔记·学习
hqxstudying2 小时前
Java异常处理
java·开发语言·安全·异常
我命由我123455 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
im_AMBER5 小时前
学习日志19 python
python·学习
武子康7 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
_Kayo_9 小时前
VUE2 学习笔记6 vue数据监测原理
vue.js·笔记·学习
YuTaoShao10 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
chenchihwen10 小时前
大模型应用班-第2课 DeepSeek使用与提示词工程课程重点 学习ollama 安装 用deepseek-r1:1.5b 分析PDF 内容
人工智能·学习
源码_V_saaskw10 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友