02-快速开始指南

news/2025/12/3 16:31:37/文章来源:https://www.cnblogs.com/znlgis/p/19302965

第二章:快速开始指南

2.1 环境准备

2.1.1 前提条件

在开始使用 geometry-api-net 之前,请确保您的开发环境满足以下条件:

  • .NET SDK:8.0 或更高版本(推荐使用最新 LTS 版本)
  • IDE:Visual Studio 2022、VS Code 或 JetBrains Rider
  • 操作系统:Windows、macOS 或 Linux

2.1.2 验证 .NET SDK 安装

打开终端或命令提示符,运行以下命令验证 .NET SDK 是否正确安装:

dotnet --version

预期输出类似于:

8.0.100

2.1.3 获取源代码

geometry-api-net 目前托管在 GitHub 上,可以通过以下方式获取:

# 克隆仓库
git clone https://github.com/znlgis/geometry-api-net.git# 进入项目目录
cd geometry-api-net

2.2 构建项目

2.2.1 还原依赖项

# 还原所有项目的依赖项
dotnet restore

2.2.2 编译项目

# 编译整个解决方案
dotnet build

成功编译后,您将看到类似以下输出:

Microsoft (R) Build Engine version 17.x.x
...
Build succeeded.0 Warning(s)0 Error(s)

2.2.3 运行测试

# 运行所有测试
dotnet test# 运行测试并显示详细输出
dotnet test --logger "console;verbosity=detailed"

2.2.4 运行示例程序

# 进入示例项目目录
cd samples/Esri.Geometry.Samples# 运行示例
dotnet run

2.3 创建第一个项目

2.3.1 创建控制台应用程序

# 创建新的控制台项目
dotnet new console -n GeometryDemo# 进入项目目录
cd GeometryDemo

2.3.2 添加项目引用

如果 geometry-api-net 已发布为 NuGet 包,可以直接添加包引用:

dotnet add package Esri.Geometry.Core

或者,添加本地项目引用:

<!-- 编辑 GeometryDemo.csproj -->
<ItemGroup><ProjectReference Include="../path/to/Esri.Geometry.Core/Esri.Geometry.Core.csproj" />
</ItemGroup>

2.3.3 编写第一个程序

编辑 Program.cs 文件:

using Esri.Geometry.Core;
using Esri.Geometry.Core.Geometries;
using Esri.Geometry.Core.Operators;
using Esri.Geometry.Core.IO;Console.WriteLine("=== geometry-api-net 快速开始 ===\n");// 1. 创建点
var point = new Point(116.4074, 39.9042);
Console.WriteLine($"创建了一个点:({point.X}, {point.Y})");
Console.WriteLine($"这是北京市中心的经纬度坐标\n");// 2. 创建包络矩形
var envelope = new Envelope(116.2, 39.7, 116.6, 40.1);
Console.WriteLine($"创建了一个包络矩形:");
Console.WriteLine($"  左下角:({envelope.XMin}, {envelope.YMin})");
Console.WriteLine($"  右上角:({envelope.XMax}, {envelope.YMax})");
Console.WriteLine($"  宽度:{envelope.Width}");
Console.WriteLine($"  高度:{envelope.Height}\n");// 3. 测试空间关系
bool contains = envelope.Contains(point);
Console.WriteLine($"包络矩形是否包含该点?{(contains ? "是" : "否")}\n");// 4. 创建多边形
var polygon = new Polygon();
polygon.AddRing(new List<Point>
{new Point(116.3, 39.8),new Point(116.5, 39.8),new Point(116.5, 40.0),new Point(116.3, 40.0),new Point(116.3, 39.8)  // 闭合环
});
Console.WriteLine($"创建了一个矩形多边形");
Console.WriteLine($"  面积:{polygon.Area:F6} 平方度\n");// 5. 使用操作符测试包含关系
var containsOp = ContainsOperator.Instance;
bool pointInPolygon = containsOp.Execute(polygon, point);
Console.WriteLine($"多边形是否包含该点?{(pointInPolygon ? "是" : "否")}\n");// 6. 导出为 WKT
string wkt = WktExportOperator.ExportToWkt(polygon);
Console.WriteLine($"多边形的 WKT 表示:\n{wkt}\n");// 7. 导出为 GeoJSON
string geoJson = GeoJsonExportOperator.ExportToGeoJson(point);
Console.WriteLine($"点的 GeoJSON 表示:\n{geoJson}\n");// 8. 使用 GeometryEngine(简化 API)
var point2 = new Point(116.3976, 39.9095);
double distance = GeometryEngine.Distance(point, point2);
Console.WriteLine($"两点之间的距离:{distance:F6} 度");// 计算大地测量距离
double geodesicDistance = GeometryEngine.GeodesicDistance(point, point2);
Console.WriteLine($"两点之间的大地测量距离:{geodesicDistance:F2} 米\n");Console.WriteLine("=== 演示完成 ===");

2.3.4 运行程序

dotnet run

预期输出:

=== geometry-api-net 快速开始 ===创建了一个点:(116.4074, 39.9042)
这是北京市中心的经纬度坐标创建了一个包络矩形:左下角:(116.2, 39.7)右上角:(116.6, 40.1)宽度:0.4高度:0.4包络矩形是否包含该点?是创建了一个矩形多边形面积:0.040000 平方度多边形是否包含该点?是多边形的 WKT 表示:
POLYGON ((116.3 39.8, 116.5 39.8, 116.5 40, 116.3 40, 116.3 39.8))点的 GeoJSON 表示:
{"type":"Point","coordinates":[116.4074,39.9042]}两点之间的距离:0.013096 度
两点之间的大地测量距离:1232.45 米=== 演示完成 ===

2.4 核心 API 快速预览

2.4.1 几何对象创建

// 点
var point = new Point(x, y);
var point3D = new Point(x, y, z);// 多点
var multiPoint = new MultiPoint();
multiPoint.Add(new Point(x1, y1));
multiPoint.Add(new Point(x2, y2));// 折线
var polyline = new Polyline();
polyline.AddPath(new List<Point> { p1, p2, p3 });// 多边形
var polygon = new Polygon();
polygon.AddRing(new List<Point> { p1, p2, p3, p4, p1 });  // 必须闭合// 包络矩形
var envelope = new Envelope(xMin, yMin, xMax, yMax);

2.4.2 空间关系测试

// 使用 GeometryEngine(推荐)
bool contains = GeometryEngine.Contains(polygon, point);
bool intersects = GeometryEngine.Intersects(g1, g2);
double distance = GeometryEngine.Distance(g1, g2);
bool equals = GeometryEngine.Equals(g1, g2);
bool disjoint = GeometryEngine.Disjoint(g1, g2);
bool within = GeometryEngine.Within(g1, g2);
bool crosses = GeometryEngine.Crosses(g1, g2);
bool touches = GeometryEngine.Touches(g1, g2);
bool overlaps = GeometryEngine.Overlaps(g1, g2);// 使用操作符(高级用法)
var op = ContainsOperator.Instance;
bool result = op.Execute(geometry1, geometry2);

2.4.3 几何运算

// 缓冲区
var buffer = GeometryEngine.Buffer(point, distance);// 凸包
var hull = GeometryEngine.ConvexHull(multiPoint);// 质心
var centroid = GeometryEngine.Centroid(polygon);// 面积和长度
double area = GeometryEngine.Area(polygon);
double length = GeometryEngine.Length(polyline);// 简化
var simplified = GeometryEngine.Simplify(polyline, tolerance);// 概化
var generalized = GeometryEngine.Generalize(polyline, maxDeviation);// 密化
var densified = GeometryEngine.Densify(polyline, maxSegmentLength);

2.4.4 集合运算

// 并集
var union = GeometryEngine.Union(g1, g2);// 交集
var intersection = GeometryEngine.Intersection(g1, g2);// 差集
var difference = GeometryEngine.Difference(g1, g2);// 对称差
var symDiff = GeometryEngine.SymmetricDifference(g1, g2);

2.4.5 数据格式转换

// WKT
string wkt = GeometryEngine.GeometryToWkt(geometry);
var geom = GeometryEngine.GeometryFromWkt(wkt);// WKB
byte[] wkb = GeometryEngine.GeometryToWkb(geometry);
var geom2 = GeometryEngine.GeometryFromWkb(wkb);// GeoJSON
string json = GeometryEngine.GeometryToGeoJson(geometry);
var geom3 = GeometryEngine.GeometryFromGeoJson(json);// Esri JSON
string esriJson = GeometryEngine.GeometryToEsriJson(geometry);
var geom4 = GeometryEngine.GeometryFromEsriJson(esriJson);

2.5 常见使用场景

2.5.1 场景一:判断点是否在区域内

using Esri.Geometry.Core;
using Esri.Geometry.Core.Geometries;// 定义服务区域(北京五环内)
var serviceArea = new Polygon();
serviceArea.AddRing(new List<Point>
{new Point(116.1, 39.7),new Point(116.7, 39.7),new Point(116.7, 40.1),new Point(116.1, 40.1),new Point(116.1, 39.7)
});// 用户位置
var userLocation = new Point(116.4074, 39.9042);// 判断用户是否在服务区域内
bool inServiceArea = GeometryEngine.Contains(serviceArea, userLocation);if (inServiceArea)
{Console.WriteLine("您在服务区域内,可以正常使用服务");
}
else
{Console.WriteLine("抱歉,您不在服务区域内");
}

2.5.2 场景二:计算两个城市之间的距离

using Esri.Geometry.Core;
using Esri.Geometry.Core.Geometries;// 城市坐标(经度, 纬度)
var beijing = new Point(116.4074, 39.9042);   // 北京
var shanghai = new Point(121.4737, 31.2304);  // 上海// 计算大地测量距离
double distanceMeters = GeometryEngine.GeodesicDistance(beijing, shanghai);
double distanceKm = distanceMeters / 1000;Console.WriteLine($"北京到上海的直线距离:{distanceKm:F2} 公里");
// 输出:北京到上海的直线距离:1067.89 公里

2.5.3 场景三:创建地理围栏缓冲区

using Esri.Geometry.Core;
using Esri.Geometry.Core.Geometries;// 商店位置
var storeLocation = new Point(116.4074, 39.9042);// 创建 1 公里(约 0.01 度)的配送范围
var deliveryZone = GeometryEngine.Buffer(storeLocation, 0.01);// 顾客位置
var customerLocation = new Point(116.41, 39.905);// 判断是否可配送
bool canDeliver = GeometryEngine.Contains(deliveryZone, customerLocation);
Console.WriteLine($"是否可配送:{(canDeliver ? "是" : "否")}");

2.5.4 场景四:轨迹数据简化

using Esri.Geometry.Core;
using Esri.Geometry.Core.Geometries;// 原始 GPS 轨迹(包含大量点)
var track = new Polyline();
track.AddPath(new List<Point>
{new Point(116.400, 39.900),new Point(116.401, 39.901),new Point(116.402, 39.902),new Point(116.403, 39.903),new Point(116.404, 39.904),// ... 更多点
});Console.WriteLine($"原始轨迹点数:{track.GetPath(0).Count}");// 使用 Douglas-Peucker 算法简化
var simplifiedTrack = GeometryEngine.Simplify(track, tolerance: 0.001);if (simplifiedTrack is Polyline simplified)
{Console.WriteLine($"简化后点数:{simplified.GetPath(0).Count}");
}

2.5.5 场景五:从 WKT 加载地理数据

using Esri.Geometry.Core;
using Esri.Geometry.Core.IO;// 从数据库或文件读取的 WKT 字符串
string wkt = "POLYGON ((116.3 39.8, 116.5 39.8, 116.5 40.0, 116.3 40.0, 116.3 39.8))";// 解析 WKT
var geometry = WktImportOperator.ImportFromWkt(wkt);if (geometry is Polygon polygon)
{Console.WriteLine($"加载了一个多边形");Console.WriteLine($"环数:{polygon.RingCount}");Console.WriteLine($"面积:{polygon.Area}");// 导出为 GeoJSON 供前端使用string geoJson = GeoJsonExportOperator.ExportToGeoJson(polygon);Console.WriteLine($"GeoJSON:{geoJson}");
}

2.6 API 使用建议

2.6.1 GeometryEngine vs 操作符

场景 推荐方式 原因
日常开发 GeometryEngine 代码简洁,易于理解
批量处理 操作符 避免方法调用开销
需要传递空间参考 操作符 GeometryEngine 不支持
单元测试 操作符 更容易模拟和测试

2.6.2 性能建议

  1. 复用操作符实例:操作符已是单例,直接使用 Instance 属性
  2. 避免频繁创建几何对象:尽量复用几何对象
  3. 使用简单几何类型:Point 比 MultiPoint 更高效
  4. 合理使用简化:大数据量时先简化再处理

2.6.3 常见错误

// ❌ 错误:多边形环未闭合
var polygon = new Polygon();
polygon.AddRing(new List<Point>
{new Point(0, 0),new Point(10, 0),new Point(10, 10),new Point(0, 10)  // 缺少闭合点
});// ✅ 正确:确保环闭合
polygon.AddRing(new List<Point>
{new Point(0, 0),new Point(10, 0),new Point(10, 10),new Point(0, 10),new Point(0, 0)  // 闭合
});// ❌ 错误:直接比较几何对象
if (point1 == point2) { }  // 可能不如预期// ✅ 正确:使用操作符比较
if (GeometryEngine.Equals(point1, point2)) { }

2.7 下一步

恭喜您完成了快速开始指南!接下来,您可以:

  1. 阅读 第三章:核心几何类型详解,深入了解各种几何类型
  2. 阅读 第四章:空间关系操作符,掌握空间关系测试
  3. 查看 samples/Esri.Geometry.Samples 目录中的更多示例
  4. 运行测试用例,了解各功能的预期行为

2.8 小结

本章我们学习了:

  1. 如何搭建开发环境和构建项目
  2. 如何创建第一个使用 geometry-api-net 的程序
  3. 核心 API 的快速预览
  4. 五个常见使用场景的代码示例
  5. API 使用建议和常见错误

geometry-api-net 的 API 设计简洁直观,通过 GeometryEngine 可以快速上手大多数几何计算任务。在后续章节中,我们将深入探讨每个功能模块的详细用法和实现原理。

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

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

相关文章

广东靠谱的公关公司怎么选?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】订单模块(下单/管理)开发 今日聚焦“二手商品交易闭环”核心场景,完成订单创建、订单列表查询及订单状态管理等核心功能的开发,实现从“商品详情”到“下单交易”的全流程衔接,为平台交易功能筑…

mysql join on where

left outer join 的含义LEFT OUTER JOIN(通常简写为 LEFT JOIN)是 SQL/JPQL 中外连接的核心类型,也是关联多表查询时最常用的连接方式之一。其核心含义是:以左表为基准,返回左表的所有记录,同时匹配右表中满足连…