01-项目概述与框架理念

news/2025/12/3 16:32:13/文章来源:https://www.cnblogs.com/znlgis/p/19302966

第一章:geometry-api-net 项目概述与框架理念

1.1 项目简介

geometry-api-net 是一个面向 .NET 平台的高性能几何计算库,是 Esri Geometry API for Java 的 C# 移植版本。该库提供了完整的几何对象模型、空间关系测试、几何运算、数据格式转换等核心功能,是开发 GIS 应用程序的基础工具库。

1.1.1 项目背景

在地理信息系统(GIS)开发领域,几何计算是最基础也是最核心的功能之一。无论是简单的点线面绘制,还是复杂的空间分析,都离不开强大的几何计算引擎。Esri 作为全球领先的 GIS 软件厂商,开源了其 Java 版本的几何 API,geometry-api-net 正是基于该项目的设计理念和算法实现,为 .NET 生态系统提供了同等级别的几何计算能力。

1.1.2 技术规格

技术项 说明
目标框架 .NET Standard 2.0
开发语言 C# 7.0+
JSON 支持 System.Text.Json 8.0.6
测试框架 xUnit
开源协议 LGPL 2.1

选择 .NET Standard 2.0 作为目标框架,可以确保库在各种 .NET 运行时环境中的兼容性:

  • .NET Framework 4.6.1+
  • .NET Core 2.0+
  • .NET 5/6/7/8+
  • Xamarin
  • Unity

1.2 核心设计理念

1.2.1 单例模式的操作符设计

geometry-api-net 采用了操作符单例模式(Operator Singleton Pattern)作为核心设计范式。这种设计模式的核心思想是:将几何运算封装为独立的操作符类,每个操作符类都是单例的,通过 Instance 属性获取唯一实例。

// 操作符接口定义
public interface IGeometryOperator<TResult>
{TResult Execute(Geometry geometry, SpatialReference? spatialRef = null);
}public interface IBinaryGeometryOperator<TResult>
{TResult Execute(Geometry geometry1, Geometry geometry2, SpatialReference? spatialRef = null);
}

这种设计带来了几个重要优势:

  1. 内存效率:操作符实例在整个应用生命周期内只创建一次,避免了频繁创建对象的开销
  2. 线程安全:使用 Lazy<T> 实现延迟初始化,确保线程安全
  3. 一致的 API:所有操作符都遵循统一的接口规范,学习一个就能掌握全部
  4. 可扩展性:新增操作符只需实现相应接口,无需修改现有代码
// 典型的操作符实现
public class BufferOperator : IGeometryOperator<Polygon>
{private static readonly Lazy<BufferOperator> _instance = new(() => new BufferOperator());private BufferOperator() { }public static BufferOperator Instance => _instance.Value;public Polygon Execute(Geometry geometry, SpatialReference? spatialRef = null){// 实现逻辑}
}

1.2.2 几何类型层次结构

框架采用了清晰的类型层次结构设计,所有几何类型都继承自抽象基类 Geometry

Geometry (抽象基类)
├── Point (点)
├── MultiPoint (多点)
├── Line (线段)
├── Polyline (折线)
├── Polygon (多边形)
└── Envelope (包络矩形)

基类定义了所有几何对象的公共属性和行为:

public abstract class Geometry
{// 几何类型标识public abstract GeometryType Type { get; }// 是否为空public abstract bool IsEmpty { get; }// 几何维度:点=0, 线=1, 面=2public abstract int Dimension { get; }// 获取边界矩形public abstract Envelope GetEnvelope();// 类型判断便捷属性public bool IsPoint => Type == GeometryType.Point || Type == GeometryType.MultiPoint;public bool IsLinear => Type == GeometryType.Line || Type == GeometryType.Polyline;public bool IsArea => Type == GeometryType.Polygon || Type == GeometryType.Envelope;// 几何计算方法public virtual double CalculateArea2D() { ... }public virtual double CalculateLength2D() { ... }public virtual Geometry Copy() { ... }public virtual bool IsValid() { ... }
}

这种设计体现了开放封闭原则(OCP):对扩展开放,对修改封闭。添加新的几何类型只需继承 Geometry 基类,无需修改现有代码。

1.2.3 关注点分离

框架将功能清晰地划分为不同的命名空间,实现了良好的关注点分离:

Esri.Geometry.Core
├── Geometries/          # 几何类型定义
│   ├── Geometry.cs      # 抽象基类
│   ├── Point.cs         # 点
│   ├── MultiPoint.cs    # 多点
│   ├── Line.cs          # 线段
│   ├── Polyline.cs      # 折线
│   ├── Polygon.cs       # 多边形
│   └── Envelope.cs      # 包络矩形
├── Operators/           # 几何操作符
│   ├── 空间关系操作符
│   ├── 几何运算操作符
│   └── 集合操作符
├── SpatialReference/    # 空间参考系统
└── IO/                  # 数据格式导入导出├── WKT 处理├── WKB 处理├── GeoJSON 处理└── Esri JSON 处理

1.2.4 不可变性与数据封装

框架在数据封装方面采用了保守策略,内部集合对象通过 AsReadOnly() 方法返回只读视图:

public class Polygon : Geometry
{private readonly List<List<Point>> _rings;// 返回只读列表,防止外部修改public IReadOnlyList<Point> GetRing(int index){return _rings[index].AsReadOnly();}public IEnumerable<IReadOnlyList<Point>> GetRings(){return _rings.Select(r => r.AsReadOnly());}
}

1.3 项目架构

1.3.1 整体架构图

┌─────────────────────────────────────────────────────────────────┐
│                        Application Layer                         │
│                    (用户应用程序 / GIS 系统)                        │
├─────────────────────────────────────────────────────────────────┤
│                       GeometryEngine                             │
│              (简化的静态 API,统一入口)                              │
├─────────────────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │   Operators  │  │     I/O      │  │   Spatial    │          │
│  │   操作符层    │  │  数据格式层   │  │  Reference   │          │
│  ├──────────────┤  ├──────────────┤  │   空间参考层  │          │
│  │ Contains     │  │ WKT Export   │  ├──────────────┤          │
│  │ Intersects   │  │ WKT Import   │  │ WGS84        │          │
│  │ Buffer       │  │ WKB Export   │  │ WebMercator  │          │
│  │ Union        │  │ WKB Import   │  │ Custom WKID  │          │
│  │ Simplify     │  │ GeoJSON      │  │              │          │
│  │ ...          │  │ EsriJSON     │  │              │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
├─────────────────────────────────────────────────────────────────┤
│                       Geometry Layer                             │
│                        几何对象层                                  │
│  ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐        │
│  │ Point  │ │Polyline│ │Polygon │ │Envelope│ │  Line  │        │
│  └────────┘ └────────┘ └────────┘ └────────┘ └────────┘        │
│              ┌────────────┐  ┌────────────┐                     │
│              │ MultiPoint │  │MapGeometry │                     │
│              └────────────┘  └────────────┘                     │
├─────────────────────────────────────────────────────────────────┤
│                       Foundation Layer                           │
│                          基础层                                   │
│  ┌──────────────────┐  ┌──────────────────┐                     │
│  │GeometryConstants │  │  GeometryType    │                     │
│  │    常量定义       │  │    类型枚举       │                     │
│  └──────────────────┘  └──────────────────┘                     │
└─────────────────────────────────────────────────────────────────┘

1.3.2 GeometryEngine - 统一入口

GeometryEngine 是框架提供的简化 API,它将所有操作符封装为静态方法,使得日常使用更加便捷:

public static class GeometryEngine
{// 空间关系测试public static bool Contains(Geometry g1, Geometry g2);public static bool Intersects(Geometry g1, Geometry g2);public static double Distance(Geometry g1, Geometry g2);// 几何运算public static Geometry Buffer(Geometry g, double distance);public static Geometry ConvexHull(Geometry g);public static Point Centroid(Geometry g);// 集合运算public static Geometry Union(Geometry g1, Geometry g2);public static Geometry Intersection(Geometry g1, Geometry g2);public static Geometry Difference(Geometry g1, Geometry g2);// 数据导入导出public static string GeometryToWkt(Geometry g);public static Geometry GeometryFromWkt(string wkt);public static string GeometryToGeoJson(Geometry g);public static Geometry GeometryFromGeoJson(string json);
}

选择使用 GeometryEngine 还是直接使用操作符类,取决于具体场景:

  • 日常使用:推荐 GeometryEngine,代码更简洁
  • 批量处理:推荐直接使用操作符,避免方法调用开销
  • 需要自定义行为:必须使用操作符类

1.4 功能清单

1.4.1 几何类型

类型 类名 维度 说明
Point 0 二维或三维点,支持 M 值
多点 MultiPoint 0 点的集合
线段 Line 1 由两个点定义的线段
折线 Polyline 1 由一条或多条路径组成
多边形 Polygon 2 由一个或多个环组成
包络矩形 Envelope 2 轴对齐的边界矩形

1.4.2 空间关系操作符

操作符 类名 说明
包含 ContainsOperator 测试 A 是否包含 B
相交 IntersectsOperator 测试 A 和 B 是否相交
距离 DistanceOperator 计算 A 和 B 之间的距离
相等 EqualsOperator 测试 A 和 B 是否空间相等
分离 DisjointOperator 测试 A 和 B 是否分离
在内部 WithinOperator 测试 A 是否在 B 内部
穿过 CrossesOperator 测试 A 是否穿过 B
接触 TouchesOperator 测试 A 和 B 是否接触
重叠 OverlapsOperator 测试 A 和 B 是否重叠

1.4.3 几何运算操作符

操作符 类名 说明
缓冲区 BufferOperator 创建几何对象的缓冲区
凸包 ConvexHullOperator 计算凸包
面积 AreaOperator 计算面积
长度 LengthOperator 计算长度或周长
简化 SimplifyOperator 使用 Douglas-Peucker 算法简化
质心 CentroidOperator 计算质心
边界 BoundaryOperator 计算边界
裁剪 ClipOperator 裁剪到包络范围
概化 GeneralizeOperator 概化几何对象
密化 DensifyOperator 密化几何对象
偏移 OffsetOperator 创建偏移曲线

1.4.4 集合操作符

操作符 类名 说明
并集 UnionOperator 计算两个几何对象的并集
交集 IntersectionOperator 计算两个几何对象的交集
差集 DifferenceOperator 计算两个几何对象的差集
对称差 SymmetricDifferenceOperator 计算对称差

1.4.5 大地测量操作符

操作符 类名 说明
大地测量距离 GeodesicDistanceOperator 计算椭球面上的距离
大地测量面积 GeodesicAreaOperator 计算椭球面上的面积

1.4.6 数据格式支持

格式 导入 导出 说明
WKT Well-Known Text
WKB Well-Known Binary
GeoJSON GeoJSON 格式
Esri JSON Esri 专有 JSON 格式

1.5 与其他库的比较

1.5.1 与 NetTopologySuite (NTS) 比较

特性 geometry-api-net NetTopologySuite
设计理念 操作符单例模式 JTS 移植
API 风格 静态方法 + 操作符 实例方法
性能重点 轻量级、快速 功能完整
依赖 最小化 较多
适用场景 嵌入式、轻量级应用 企业级 GIS

1.5.2 选择建议

选择 geometry-api-net 的场景

  • 需要轻量级几何计算库
  • 对启动时间和内存占用敏感
  • 与 Esri 产品集成
  • 学习 GIS 几何算法

选择 NetTopologySuite 的场景

  • 需要完整的 JTS 功能
  • 与 Entity Framework 集成
  • 需要高级拓扑操作
  • 处理复杂的空间查询

1.6 测试覆盖

项目具有全面的测试覆盖,共计 255+ 个测试用例:

  • 28 个几何类型测试
  • 14 个空间关系操作符测试
  • 23 个附加操作符测试
  • 12 个几何操作测试
  • 20 个高级操作符测试
  • 24 个邻近和 GeometryEngine 测试
  • 23 个集合操作测试
  • 17 个 WKT 导入/导出测试
  • 10 个 WKB 导入/导出测试
  • 8 个 GeoJSON 导入/导出测试
  • 18 个 SimplifyOGC 操作符测试
  • 17 个几何辅助方法测试

1.7 小结

geometry-api-net 是一个设计精良、功能完备的 .NET 几何计算库。其核心设计理念包括:

  1. 操作符单例模式:提供一致的 API 和良好的性能
  2. 清晰的类型层次:符合 OGC 标准的几何模型
  3. 关注点分离:功能模块化,易于理解和维护
  4. 多格式支持:WKT、WKB、GeoJSON、Esri JSON
  5. 全面的测试:255+ 个测试用例确保代码质量

在接下来的章节中,我们将深入学习每个功能模块的使用方法和实现原理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/985716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02-快速开始指南

第二章:快速开始指南 2.1 环境准备 2.1.1 前提条件 在开始使用 geometry-api-net 之前,请确保您的开发环境满足以下条件:.NET SDK:8.0 或更高版本(推荐使用最新 LTS 版本) IDE:Visual Studio 2022、VS Code 或 …

广东靠谱的公关公司怎么选?3个核心标准帮你避坑

广东作为全国经济第一大省,聚集了科技、金融、文旅、电商等多元行业企业。这些企业在发展中常面临三大痛点:一是本地品牌拓展全国市场时缺乏顶层媒体资源链接,二是突发舆情时需要熟悉本地语境的快速响应团队,三是电…

2025滨海新区月子会所口碑推荐:新手家庭的母婴照护优选指南

随着母婴照护需求不断升级,“天津月子中心哪家好”“滨海新区月子会所怎么选”“塘沽高性价比月子中心有哪些”成为新手家庭高频提问。无论是追求“靠谱服务”“高性价比”,还是需要“拎包入住”“双职工专属方案”,…

iOS 异常捕获原理详解

iOS 异常捕获涉及 Objective-C/Swift 语言层面、运行时机制及系统底层信号处理,主要分为OC/Swift 异常捕获、崩溃信号捕获和自定义异常处理三类,以下从原理、机制到实现细节详细解析: 一、Objective-C 异常捕获原理…

2025上海翻译的公司推荐:提供高质量语言解决方案

在2025年全球交流愈发紧密的时代背景下,上海作为中国的经济中心与国际大都市,正以其开放包容的城市魅力和强劲的经济发展势头,吸引着全世界的目光。随着“一带一路”倡议的深入实施以及国际合作的不断拓展,上海的翻…

2025年天津钢管扣件租赁公司最新推荐榜,天津脚手架出租、天津脚手架搭设、天津移动脚手架、 天津钢管扣件出租、聚焦服务品质与业务竞争力深度剖析

随着天津城市建设工程的持续推进,各类建筑项目对脚手架、钢管扣件等设备的租赁需求日益增长,施工方在选择合作机构时面临多重考量 —— 如何辨别企业合规资质、如何匹配项目所需的设备类型与服务模式、如何规避设备使…

Java 查找字符串最后一次出现的位置

Java 查找字符串最后一次出现的位置在 Java 开发中,查找字符串中字符或子串最后一次出现的位置是高频需求(如解析文件路径、提取后缀名、处理 URL 等场景)。核心依赖 String 类的 lastIndexOf() 方法,该方法提供多…

博士留学中介排名TOP10!适配需求的好机构推荐

随着博士申请竞争日趋激烈,选对中介成为上岸关键。市面上机构质量参差不齐,结合服务深度、录取成果等维度,整理出 2025 十大留学中介排名,为学子精准指引方向。 第一名、优越留学 98 分 英美港新全学段申请标杆 官…

2025年度中国翻译服务公司推荐:综合实力强品牌权威公布

在全球化浪潮持续深化的2025年,中国作为世界经济的重要引擎,国际交流与合作日益频繁,对高质量翻译服务的需求呈现出爆发式增长。然而,当前国内翻译市场机构林立,水平良莠不齐,如何筛选出真正优质、专业的翻译服务…

初识MySQL:库的操作、数据类型、表的操作 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

博士机构排行新榜,含申请亮点的十大实力留学机构

博士申请的核心是学术匹配,选对留学机构能少走大半弯路。不少人困惑如何选博士留学中介,其实关键看两点:一是行业资质是否扎实,二是能否把博士优势转化为录取竞争力。结合2024年申请案例,我整理了10家机构的百分制…

SMTP协议中基础邮件传输所需的往返时间分析

本文深入探讨了在两个邮件服务器之间进行一次基本的SMTP消息传输究竟需要多少次往返时间。通过分析TCP连接建立及HELO、MAIL FROM、RCPT TO、DATA等命令序列,对不同的延迟计算模型进行了对比。问题:两个邮件服务器之…

2026年数控机床主轴轴承厂家推荐 磨床主轴轴承、车床轴承、铣床轴承、动力头轴承源头厂家

随着数控机床对加工精度、主轴转速与稳定性的要求越来越高,主轴轴承已成为决定机床性能的重要核心部件。选择合适的轴承厂家,不仅关系到初期整机性能,也影响设备稳定性与寿命。下面推荐几家当前表现突出的主轴轴承供…

皮肤科专家优选:二硫化硒洗发水有效去屑控油止痒最佳榜

《2025 中国头皮健康白皮书》数据显示,我国受头屑困扰的人群已达 6.08 亿,其中 90.5% 的头屑反复问题与马拉色菌过度繁殖紧密相关。二硫化硒作为《外用抗真菌制剂临床应用指南》重点推荐的去屑核心成分,凭借精准破坏…

day7敏捷冲刺

【Alpha冲刺Day7】Alpha版本测试 & 冲刺收尾 今日聚焦Alpha版本全流程验证与冲刺收尾,完成全模块回归测试、Bug闭环修复、版本打包及文档汇总,实现校园二手交易平台核心功能的完整交付,为Alpha阶段画上圆满句号…

申请助力全程在线!优选名单里有好博士留学中介

在留学申请的赛道上,选对靠谱的中介机构往往能让申请之路事半功倍,尤其是竞争激烈的博士申请,专业的指导更是成功的关键。以下为大家整理了十大留学中介排名 TOP10,结合各机构的核心业务、服务质量等多方面情况进行…

CH5xx BLE芯片复位排查方法

CH5xx BLE芯片复位排查方法一.打印复位状态寄存器:R8_RESET_STATUS 该寄存器的低三位对应以下复位原因: 最近一次复位状态: 000:软件复位 SR(RB_WDOG_RST_EN=0 时软件复位可产生此状态,否则可复位 但不产生此状态…

行业洞察:电子测试痛点如何破局?上海柏毅小型高低温试验箱成关键解

随着5G、新能源汽车、人工智能等技术的加速渗透,电子产业进入高质量发展攻坚期,芯片、PCB板、传感器等核心元器件的可靠性直接决定终端产品竞争力。作为可靠性验证的“关键一环”,高低温环境测试却长期困扰行业:实…

别再装系统了!Linux 镜像到底是什么?一篇讲到你怀疑人生

在现代工业、嵌入式开发和服务器运维中,Linux 系统无处不在。从数据中心的高性能服务器,到工控现场的 ARM 控制器,再到家庭和企业使用的路由器、IoT 设备,Linux 都在默默运行。而无论设备多小、环境多复杂,如何快…

day6敏捷冲刺

【Alpha冲刺Day6】订单模块(下单/管理)开发 今日聚焦“二手商品交易闭环”核心场景,完成订单创建、订单列表查询及订单状态管理等核心功能的开发,实现从“商品详情”到“下单交易”的全流程衔接,为平台交易功能筑…