Pengantar GeoTools

1. Ikhtisar

Dalam artikel ini, kita akan membahas dasar-dasar pustaka Java open source GeoTools - untuk bekerja dengan data geospasial . Perpustakaan ini menyediakan metode yang sesuai untuk mengimplementasikan Sistem Informasi Geografis (GIS) dan mengimplementasikan serta mendukung banyak standar Open Geospatial Consortium (OGC).

Saat OGC mengembangkan standar baru, mereka diimplementasikan oleh GeoTools, yang membuatnya sangat berguna untuk pekerjaan geospasial.

2. Dependensi

Kita perlu menambahkan dependensi GeoTools ke file pom.xml kita . Karena dependensi ini tidak dihosting di Maven Central, kami juga perlu mendeklarasikan repositori mereka agar Maven dapat mendownloadnya:

  osgeo Open Source Geospatial Foundation Repository //download.osgeo.org/webdav/geotools/   opengeo OpenGeo Maven Repository //repo.opengeo.org  

Setelah itu, kita bisa menambahkan dependensi kita:

 org.geotools gt-shapefile 15.2   org.geotools gt-epsg-hsql 15.2 

3. GIS dan Shapefiles

Untuk menggunakan pustaka GeoTools secara praktis, kita perlu mengetahui beberapa hal tentang sistem informasi geografis dan shapefile .

3.1. GIS

Jika kita ingin bekerja dengan data geografis, kita memerlukan sistem informasi geografis (GIS). Sistem ini dapat digunakan untuk menyajikan, menangkap, menyimpan, memanipulasi, menganalisis, atau mengelola data geografis .

Beberapa bagian dari data geografis bersifat spasial - ini merujuk pada lokasi konkret di bumi. Data spasial biasanya disertai dengan data atribut. Data atribut dapat berupa informasi tambahan tentang setiap fitur spasial.

Contoh data geografis adalah kota. Lokasi kota yang sebenarnya adalah data spasial. Data tambahan seperti nama kota dan populasi akan membentuk data atribut.

3.2. Shapefiles

Format berbeda tersedia untuk bekerja dengan data geospasial. Raster dan vektor adalah dua tipe data utama.

Pada artikel ini, kita akan melihat bagaimana bekerja dengan tipe data vektor e . Tipe data ini dapat direpresentasikan sebagai titik, garis, atau poligon.

Untuk menyimpan data vektor dalam sebuah file, kita akan menggunakan sebuah shapefile . Format file ini digunakan saat bekerja dengan tipe data vektor geospasial. Juga, ini kompatibel dengan berbagai macam perangkat lunak GIS.

Kita dapat menggunakan GeoTools untuk menambahkan fitur seperti kota, sekolah, dan landmark ke shapefile .

4. Membuat Fitur

The GeoTools dokumentasi menetapkan bahwa fitur adalah segala sesuatu yang dapat ditarik pada peta, seperti kota atau beberapa tengara. Dan, seperti yang kami sebutkan, setelah dibuat, fitur kemudian dapat disimpan ke dalam file yang disebut shapefile .

4.1. Menjaga Data Geospasial

Sebelum membuat fitur, kita perlu mengetahui data geospasial atau koordinat bujur dan lintang lokasinya di bumi. Sedangkan untuk data atribut, kita perlu mengetahui nama fitur yang ingin kita buat.

Informasi ini dapat ditemukan di web. Beberapa situs seperti simplemaps.com atau maxmind.com menawarkan database gratis dengan data geospasial.

Ketika kita mengetahui bujur dan lintang sebuah kota, kita dapat dengan mudah menyimpannya di beberapa objek. Kita bisa menggunakan objek Map yang akan menampung nama kota dan daftar koordinatnya.

Mari buat metode pembantu untuk memudahkan penyimpanan data di dalam objek Map kita :

private static void addToLocationMap( String name, double lat, double lng, Map
    
      locations) { List coordinates = new ArrayList(); coordinates.add(lat); coordinates.add(lng); locations.put(name, coordinates); }
    

Sekarang mari isi objek Map kita :

Map
    
      locations = new HashMap(); addToLocationMap("Bangkok", 13.752222, 100.493889, locations); addToLocationMap("New York", 53.083333, -0.15, locations); addToLocationMap("Cape Town", -33.925278, 18.423889, locations); addToLocationMap("Sydney", -33.859972, 151.211111, locations); addToLocationMap("Ottawa", 45.420833, -75.69, locations); addToLocationMap("Cairo", 30.07708, 31.285909, locations);
    

Jika kita mengunduh beberapa database CSV yang berisi data ini, kita dapat dengan mudah membuat pembaca untuk mengambil data daripada menyimpannya di objek seperti di sini.

4.2. Mendefinisikan Jenis Fitur

Jadi, sekarang kami memiliki peta kota. Untuk dapat membuat fitur dengan data ini, kita perlu menentukan jenisnya terlebih dahulu. GeoTools menawarkan dua cara untuk menentukan tipe fitur.

Salah satu caranya adalah dengan menggunakan metode createType dari kelas DataUtilites :

SimpleFeatureType TYPE = DataUtilities.createType( "Location", "location:Point:srid=4326," + "name:String");

Cara lain adalah dengan menggunakan SimpleFeatureTypeBuilder , yang memberikan lebih banyak fleksibilitas . Misalnya, kita dapat mengatur Sistem Referensi Koordinat untuk jenisnya, dan kita dapat mengatur panjang maksimum untuk bidang nama:

SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder(); builder.setName("Location"); builder.setCRS(DefaultGeographicCRS.WGS84); builder .add("Location", Point.class); .length(15) .add("Name", String.class); SimpleFeatureType CITY = builder.buildFeatureType();

Kedua tipe menyimpan informasi yang sama. Lokasi kota disimpan sebagai Titik , dan nama kota disimpan sebagai String .

Anda mungkin memperhatikan bahwa variabel tipe TYPE dan CITY diberi nama dengan huruf kapital semua, seperti konstanta. Variabel jenis harus diperlakukan sebagai variabel final dan tidak boleh diubah setelah dibuat , jadi cara penamaan ini dapat digunakan untuk menunjukkan hal itu.

4.3. Pembuatan Fitur dan Koleksi Fitur

Setelah kita memiliki tipe fitur yang ditentukan dan kita memiliki objek yang memiliki data yang diperlukan untuk membuat fitur, kita dapat mulai membuatnya dengan pembuatnya.

Mari kita contohkan SimpleFeatureBuilder yang menyediakan tipe fitur kita:

SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(CITY);

Kami juga membutuhkan koleksi untuk menyimpan semua objek fitur yang dibuat:

DefaultFeatureCollection collection = new DefaultFeatureCollection();

Since we declared in our feature type to hold a Point for the location, we'll need to create points for our cities based on their coordinates. We can do this with the GeoTools's JTSGeometryFactoryFinder:

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);

Note that we can also use other Geometry classes like Line and Polygon.

We can create a function that will help us put features in the collection:

private static Function
    
     , SimpleFeature> toFeature(SimpleFeatureType CITY, GeometryFactory geometryFactory) { return location -> { Point point = geometryFactory.createPoint( new Coordinate(location.getValue() .get(0), location.getValue().get(1))); SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(CITY); featureBuilder.add(point); featureBuilder.add(location.getKey()); return featureBuilder.buildFeature(null); }; }
    

Once we have the builder and the collection, by using the previously created function, we can create features and store them in our collection:

locations.entrySet().stream() .map(toFeature(CITY, geometryFactory)) .forEach(collection::add);

The collection now contains all the features created based on our Map object that held the geospatial data.

5. Creating a DataStore

GeoTools contains a DataStore API that is used to represent a source of geospatial data. This source can be a file, a database, or some service that returns data. We can use a DataStoreFactory to create our DataStore, which will contain our features.

Let's set the file that will contain the features:

File shapeFile = new File( new File(".").getAbsolutePath() + "shapefile.shp");

Now, let's set the parameters that we are going to use to tell the DataStoreFactory which file to use and indicate that we need to store a spatial index when we create our DataStore:

Map params = new HashMap(); params.put("url", shapeFile.toURI().toURL()); params.put("create spatial index", Boolean.TRUE);

Let's create the DataStoreFactory using the parameters we just created, and use that factory to create the DataStore:

ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory(); ShapefileDataStore dataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params); dataStore.createSchema(CITY);

6. Writing to a Shapefile

The last step that we need to do is to write our data to a shapefile. To do this safely, we are going to use the Transaction interface that is a part of the GeoTools API.

This interface gives us the possibility to easily commit our the changes to the file. It also provides a way to perform a rollback of the unsuccessful changes if some problem occurs while writing to the file:

Transaction transaction = new DefaultTransaction("create"); String typeName = dataStore.getTypeNames()[0]; SimpleFeatureSource featureSource = dataStore.getFeatureSource(typeName); if (featureSource instanceof SimpleFeatureStore) { SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource; featureStore.setTransaction(transaction); try { featureStore.addFeatures(collection); transaction.commit(); } catch (Exception problem) { transaction.rollback(); } finally { transaction.close(); } }

The SimpleFeatureSource is used to read features, and the SimpleFeatureStore is used for read/write access. It is specified in the GeoTools documentation that using the instanceof method for checking if we can write to the file is the right way to do so.

This shapefile can later be opened with any GIS viewer that has shapefile support.

7. Conclusion

In this article, we saw how we can make use of the GeoTools library to do some very interesting geo-spatial work.

Although the example was simple, it can be extended and used for creating rich shapefiles for various purposes.

Kita harus ingat bahwa GeoTools adalah pustaka yang dinamis, dan artikel ini hanya berfungsi sebagai pengantar dasar pustaka. Selain itu, GeoTools tidak terbatas pada pembuatan tipe data vektor saja - ini juga dapat digunakan untuk membuat atau bekerja dengan tipe data raster.

Anda dapat menemukan kode contoh lengkap yang digunakan dalam artikel ini di proyek GitHub kami. Ini adalah proyek Maven, jadi Anda harus dapat mengimpornya dan menjalankannya apa adanya.