C#
.NET
geo
Xamarin
geometry

.NET で(空間)幾何学形状の演算や判定を行うなら NetTopologySuite(NTS) がオススメ

何度か紹介してるかもだけど、 ちょっと使う機会があったので改めて。

NetTopologySuite、通称 "NTS" は、 JTS - Java Topology Suite を .NET へ移植したものです。

この JTS は、他にも各言語へ移植されています、次に一覧を載せときますね。

JTS は、 PostgreSQL や Solr、 Elasticsearch などにも採用されている十分に「枯れた」ライブラリで、その .NET 移植である NTS も十分に枯れています。

今回は、試しに Xamarin Workbooks で、サクッとその機能を試してみます。

Xamarin Workbooks の新規ドキュメントで Nuget Packages に "NetTopologySuite" を追加し、次のコードをタイプします。

using NetTopologySuite.Geometries;
using NetTopologySuite.IO;
using NetTopologySuite.Operation.Distance;

var wktReader = new WKTReader();
var polyline = wktReader.Read("LINESTRING(10 5, 15 10, 20 7)");
var point = wktReader.Read("POINT(16 6)");
var distance = new DistanceOp(polyline, point);

var nearestLocation = distance.NearestLocations();
nearestLocation.ToList();

で、実行っぽいボタンを押す、または cmd+enter を押すとコードが実行され、最下行の結果がインタラクティブに表示されます。下図のような感じで。

image.png

ここでは DistanceOp という演算クラスを使って (10, 5) - (15, 10) - (20 7) から成る線分(ポリライン、 NTS では LineString という) と (16, 6) の点との最も近い点(NearestLocations)を得ます。

結果は2つの GeometoryLocation があり、1つ目はポリラインの中でポイントと最も近い線分上の座標(Coordinate)、最も近い頂点インデックス(SegmentIndex)などが含まれます。2つ目はPointの中でポリラインと最も近い点なのでPointそのものです。

NTS/JTS の機能は膨大で、まともなドキュメントもないので初見で機能を探すのも大変なのですが、 API ドキュメントや UnitTest を眺めるといろいろ知ることができます。図形の演算、判定で困ったらアテにしてみるとよいでしょう。

Xamarin Workbooks を使うのは久しぶりですが、 nuget package の追加が簡単にできるようになって、使いやすくなってますね。
座標値がグラフィカルに可視化できたらなおよいですが、きっと方法がありそうですね。

NTS のような単純なライブラリなら、 Xamarin Workbooks を使ってサクッと試すことができるので、活用していきたいものです。