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");
            }




        }
    }
}
相关推荐
zzc9211 小时前
Adobe Illustrator设置的颜色和显示的颜色不对应问题
adobe·bug·illustrator·错误·配色·透明度·底色
DuelCode1 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社21 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
好好研究1 小时前
学习栈和队列的插入和删除操作
数据结构·学习
幽络源小助理1 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猴哥源码1 小时前
基于Java+springboot 的车险理赔信息管理系统
java·spring boot
YuTaoShao2 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
新中地GIS开发老师2 小时前
新发布:26考研院校和专业大纲
学习·考研·arcgis·大学生·遥感·gis开发·地理信息科学
Dcs2 小时前
超强推理不止“大”——手把手教你部署 Mistral Small 3.2 24B 大模型
java
东阳马生架构2 小时前
订单初版—1.分布式订单系统的简要设计文档
java