Merhabalar. 2019 yılı başından beri işimde bir CBS (coğrafi bilgi sistemi) ürünü üzerinde çalışıyorum. Java dünyasında harita üzerinde geliştirilen pek çok yetenekte JTS (JTS Topology Suite) kütüphanesinin yeteneklerinden faydalanılmakta. Hatta sadece GIS yazılımlarında değil, nesnelerin çarpışıp çarpışmadığını kontrol etmek amacıyla oyunlarda bile kullanılabilmektedir. Fakat internette arattığımda bu kütüphane ile alakalı Türkçe kaynak azlığı dikkatimi çekti. İhtiyacı olanlara yardımcı olmasını umarak dilim döndüğünce bu kütüphaneden bahsedeceğim yazı dizisine başlıyorum.
Kurulum
Öncelikle Maven bağımlılığına şuradan ulaşabilirsiniz. Maven repolarında jts diye arattığınızda kafa karıştırıcı bir durumla karşılaşıyorsunuz. Farklı paket adına sahip sürümler mevcut. Kütüphane 1.14 sürümüne kadar com.vividsolutions.jts paket adına sahip idi. Geliştiren ekip değiştiğinden dolayı 1.15 sürümünden itibaren org.locationtech.jts paket adına sahip olarak yayınlanıyor. Ben bu yazıyı yazarken en güncel sürüm 1.18.0 idi.
Geometri Modeli
JTS kütüphanesi, OGC'nin (Open Geospatial Consortium) standart olarak tanımladığı tüm geometrik tipleri desteklemektedir. Bunlar:
- Point ve MultiPoint (nokta ve çoklu nokta)
- LineString ve MultiLineString (çizgi ve çoklu çizgi)
- Polygon ve MultiPolygon (poligon ve çoklu poligon)
- İçinde karışık türlerin bulunabileceği GeometryCollection
Coordinate Sınıfı
Geometri modeli sınıflarını oluşturan konum bilgilerini tutan sınıf Coordinate sınıfıdır. X, Y ve Z koordinat verilerini tutabilmektedir. CBS yazılımlarında X boylam, Y enlem, Z de yükseklik verisini tutacak şekilde kullanılmaktadır. Yükseklik verisini tutsa da, JTS kütüphanesinin 3D (3 boyutlu) geometrik hesaplama kabiliyeti bulunmuyor. Geometrik hesaplamalarında sadece X ve Y değerlerini dikkate alıyor. Oyunlarda bu X, Y ve Z değerleri piksel ve derinlik tutmak için de kullanılabilmektedir.
Coordinate coordinate = new Coordinate(3, 5, 10);
GeometryFactory
Geometri modeli kapsamındaki nesneleri üretmek için GeometryFactory sınıfı kullanılmaktadır.
GeometryFactory geometryFactory = new GeometryFactory();
Point
Bir adet Coordinate nesnesi alarak oluşturulur.
Point point = geometryFactory.createPoint(coordinate);
MultiPoint
Birden fazla konum verisi alarak oluşturulur.
Coordinate[] coordinates = new Coordinate[] { new Coordinate(39, 33), new Coordinate(46, 23)}; MultiPoint multiPoint = geometryFactory.createMultiPointFromCoords(coordinates);
LineString
Çizgi nesneleri LineString kullanarak temsil edilmektedir. Birden fazla konum alarak oluşturulur. simple, non-simple, closed, not-closed türleri vardır. Kendisi ile kesişmeyen çizgilere simple, kesişenlere ise non-simple denilmektedir. Başlangıç ve bitiş koordinatları aynı olan çizgilere closed denilmektedir.
line string |
LineRing
LineString sınıfının bir alt sınıfı olan LineRing closed ve simple LineString nesneleri oluşturmak için kullanılmaktadır. Closed veya simple olmayan koordinat dizisiyle LineRing oluşturmaya çalışılırsa hata alınacaktır.
java.lang.IllegalArgumentException: Points of LinearRing do not form a closed linestring
MultiLineString
Birden fazla LineString nesnesi alarak oluşturulur.
Coordinate[] coordinates1 = new Coordinate[] { new Coordinate(39, 33), new Coordinate(46, 23)}; LineString lineString1 = geometryFactory.createLineString(coordinates1); Coordinate[] coordinates2 = new Coordinate[] { new Coordinate(26, 38), new Coordinate(30, 37), new Coordinate(40.5, 39.785)}; LineString lineString2 = geometryFactory.createLineString(coordinates2); LineString[] lineStrings = new LineString[] {lineString1, lineString2}; MultiLineString multiLineString = geometryFactory.createMultiLineString(lineStrings);
Polygon
Bir adet LineRing veya LineRing oluşturulabilecek koordinat dizisi alarak oluşturulur. Yani başlangıç ve bitiş koordinatları aynı olmayan veriden oluşturulmaya çalışılırsa hata atacaktır.
java.lang.IllegalArgumentException: Points of LinearRing do not form a closed linestring
Örnek bir poligon üretimi şu şekildedir.
Coordinate[] polygonCoordinates = new Coordinate[] { new Coordinate(39, 33), new Coordinate(46, 23), new Coordinate(40, 27), new Coordinate(39, 33)}; Polygon polygon = geometryFactory.createPolygon(polygonCoordinates);
Ayrıca içerisinde boşluk olan poligonlar da üretilebilmektedir.
Coordinate[] polygonCoordinates = new Coordinate[] { new Coordinate(39, 33), new Coordinate(46, 23), new Coordinate(40, 27), new Coordinate(39, 33)}; Coordinate[] holeCoordinates = new Coordinate[] { new Coordinate(40, 34), new Coordinate(45, 24), new Coordinate(41, 26), new Coordinate(40, 34)}; LinearRing hole = geometryFactory.createLinearRing(holeCoordinates); LinearRing[] holes = new LinearRing[] { hole }; LinearRing shell = geometryFactory.createLinearRing(polygonCoordinates); Polygon polygonWithHole = geometryFactory.createPolygon(shell, holes);
Polygon |
MultiPolygon
Birden fazla poligon nesnesi alarak oluşturulur.
Polygon[] polygons = new Polygon[] {polygon, polygonWithHole}; MultiPolygon multiPolygon = geometryFactory.createMultiPolygon(polygons);
GeometryCollection
Diğer tüm geometri tipleri içerebilecek bir koleksiyon türü görevi görmektedir.
Geometry[] geometries = new Geometry[] {point, multiLineString, polygon, multiPolygon}; GeometryCollection geometryCollection = geometryFactory.createGeometryCollection(geometries);
Sonraki Bölümler
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
JTS CBS Kütüphanesi Rehberi 6 - Douglas Peucker Geometri Basitleştirme ve Yoğunlaştırma
0 Yorumlar