.NET에서 (공간) 기하학을 계산하고 결정하는 경우 NetTopologySuite (NTS)를 권장합니다.

몇번인가 소개하고 있을지도 모르지만, 조금 사용할 기회가 있었으므로 재차.
  • NetTopologySuite/NetTopologySuite: A .NET GIS solution that is fast and reliable for the .NET platform.

  • NetTopologySuite, 통칭 "NTS"는, JTS - Java Topology Suite 를 .NET 에 이식한 것입니다.

    이 JTS 는, 그 밖에도 각 언어에 이식되고 있습니다, 다음에 일람을 올릴 때군요.
  • .NET(C#) - NetTopologySuite/NetTopologySuite: A .NET GIS solution that is fast and reliable for the .NET platform.
  • C++ - GEOS
  • JavaScript - bjornharrtell/jsts: JavaScript Topology Suite

  • 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를 누르면 코드가 실행되고 맨 아래 행의 결과가 대화식으로 표시됩니다. 아래 그림과 같은 느낌으로.



    여기서는 DistanceOp 라고 하는 연산 클래스를 사용해 (10, 5) - (15, 10) - (20 7) 로 이루어지는 선분 (폴리 라인, NTS 에서는 LineString 라고 한다) 과 (16, 6) 의 점과의 가장 가까운 점(NearestLocations)을 얻습니다.

    결과에는 두 개의 GeometoryLocation이 있으며, 첫 번째는 폴리선 중에서 점과 가장 가까운 선분상의 좌표(Coordinate), 가장 가까운 정점 인덱스(SegmentIndex) 등이 포함됩니다. 두 번째는 Point 중 폴리 라인과 가장 가까운 점이므로 Point 그 자체입니다.

    NTS/JTS 의 기능은 방대하고, 괜찮은 문서도 없기 때문에 초보로 기능을 찾는 것도 힘들지만, API 문서나 UnitTest 를 바라보면 여러가지 알 수 있습니다. 도형의 연산, 판정으로 곤란하면 아테로 해 보면 좋을 것입니다.

    Xamarin Workbooks 를 사용하는 것은 오랜만이지만, nuget package 의 추가를 간단하게 할 수 있게 되어, 사용하기 쉬워지고 있군요.
    좌표치가 그래픽으로 가시화할 수 있으면 좋겠지만, 분명 방법이 있을 것 같네요.

    NTS 와 같은 간단한 라이브러리라면 Xamarin Workbooks 를 사용해 멋지게 시험할 수 있으므로 활용해 가고 싶은 것입니다.

    좋은 웹페이지 즐겨찾기