Douglas Peucker algoritması (Ramer-Dougles-Peucker de denilmektedir), çizgi parçalarından oluşan bir eğriyi daha az noktalı benzer bir eğriye döndüren algoritmadır. Ürettiğimiz geometrinin çok fazla girintili çıkıntılı olmasını istemediğimiz zaman kullanırız.Vereceğimiz bir tolerans değerinden küçük uzunluktaki çizgi parçalarını birleştirerek orijinal çizgiye benzer ama daha basit bir çizgi elde etmemizi sağlar.
LocationTech JTS Topology Suite rehberimizin bu bölümünde Douglas Peucker basitleştirme aracını inceleyeceğiz.
Douglas Peucker Geometri Basitleştirme |
DouglasPeuckerSimplifier
JTS kütüphanesinde bulunan org.locationtech.jts.simplify.DouglasPeuckerSimplifier sınıfından bir nesne oluşturuken input olarak basitleştireceği Geometry tipinde bir nesne almaktadır. Yani sadece çizgileri değil, poligon ve diğer geometri tiplerini de basitleştirebileceği anlamına geliyor.
setDistanceTolerance(double tolerance) metodu ile de tolerans uzunluk değerini belirliyoruz.
Önceki bölümlerde de paylaştığım üzere tüm görselleştirme kodlarını GitHub'da şuradan indirebilirsiniz.
Örnek projemizdeki GeometriBasitlestirme.java sınıfını çalıştırarak siz de görselleştirebilirsiniz.
Örneğimizde, 12 adet noktadan oluşan bir çizgi (LineString) oluşturuyoruz. Daha sonra DouglasPeuckerSimplifier nesnesine parametre olarak veriyoruz. Toleransı da 30 birim olarak belirliyoruz. Basitleştirilmiş LineString nesnesini sonuç olarak üretiyoruz. Görselleştime açısından çizgiler üst üste binmesin diye, basitleştirilmiş versiyonu orijinalinden 100 piksel daha aşağıda çiziyoruz.
GeometryFactory geometryFactory = new GeometryFactory(); Coordinate[] coordinates = new Coordinate[] { new Coordinate(50, 20), new Coordinate(70, 70), new Coordinate(90, 50), new Coordinate(110, 80), new Coordinate(120, 60), new Coordinate(150, 60), new Coordinate(175, 120), new Coordinate(200, 150), new Coordinate(220, 100), new Coordinate(230, 130), new Coordinate(260, 80), new Coordinate(310, 110) }; LineString lineString = geometryFactory.createLineString(coordinates); DouglasPeuckerSimplifier simplifier = new DouglasPeuckerSimplifier(lineString); simplifier.setDistanceTolerance(30); LineString simplerLineString = (LineString) simplifier.getResultGeometry(); System.out.println("original line coordinate size : " + coordinates.length); System.out.println("simplified line coordinate size " + simplerLineString.getCoordinates().length);
Geometri Yoğunlaştırma (Densifier)
Geometri basitleştirmenin tam tersi bir şekilde, elimizdeki çizginin noktaları arasında yeni noktalar üretip geometriyi yoğunlaştırmak isteyebiliriz. Bunun için org.locationtech.jts.densify.Densifier sınıfını kullanacağız.
DouglasPeuckerSimplifier sınıfına benzer şekilde bir geometri parametresi alıyor.
setDistanceTolerance(double tolerance) metodu ile orijinal noktalar arasında hangi sıklıkta yeni noktalar yerleştirmek istediğimizi belirliyoruz.
Basitleştirme örneğindeki LineString'in aynısını burada da kullanacağız. Bu sefer tolerans değerini 15 birim vereceğiz. Yeni üretilen ve orijinal noktaları daha iyi görselleştirmek için, nokta bulunan kısımları küçük daireler ile boyayacağız.
Örnek projemizdeki GeometriYogunlastirma.java sınıfını çalıştırarak siz de görselleştirebilirsiniz.
Geometry Densifier |
GeometryFactory geometryFactory = new GeometryFactory(); Coordinate[] coordinates = new Coordinate[] { new Coordinate(50, 20), new Coordinate(70, 70), new Coordinate(90, 50), new Coordinate(110, 80), new Coordinate(120, 60), new Coordinate(150, 60), new Coordinate(175, 120), new Coordinate(200, 150), new Coordinate(220, 100), new Coordinate(230, 130), new Coordinate(260, 80), new Coordinate(310, 110) }; LineString lineString = geometryFactory.createLineString(coordinates); Densifier densifier = new Densifier(lineString); densifier.setDistanceTolerance(15); LineString denserLineString = (LineString) densifier.getResultGeometry(); System.out.println("original line coordinate size : " + coordinates.length); System.out.println("densified line coordinate size " + denserLineString.getCoordinates().length);
Önceki bölümler:
- JTS CBS Kütüphanesi Rehberi 1 - Geometri Modeli
- JTS CBS Kütüphanesi Rehberi 2 - Geometrik İlişki Hesaplamaları
- JTS CBS Kütüphanesi Rehberi 3 - Geometrik Alan Hesaplamaları
- JTS CBS Kütüphanesi Rehberi 4 - Delaunay Üçgenleme, Voronoi Diyagram, Convex Hull
- JTS CBS Kütüphanesi Rehberi 5 - Quadtree Nedir? Java'da Örnek Kullanım
0 Yorumlar