Pengenalan GeoTools

1. Gambaran keseluruhan

Dalam artikel ini, kita akan membahas asas-asas perpustakaan Java sumber terbuka GeoTools - untuk bekerja dengan data geospasial . Perpustakaan ini menyediakan kaedah yang sesuai untuk melaksanakan Sistem Maklumat Geografi (GIS) dan menerapkan dan menyokong banyak standard Open Geospatial Consortium (OGC).

Oleh kerana OGC mengembangkan standard baru, mereka dilaksanakan oleh GeoTools, yang menjadikannya sangat berguna untuk kerja geospasial.

2. Kebergantungan

Kami perlu menambahkan kebergantungan GeoTools ke fail pom.xml kami . Oleh kerana kebergantungan ini tidak dihoskan di Maven Central, kami juga perlu menyatakan repositori mereka sehingga Maven dapat memuat turunnya:

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

Selepas itu, kami dapat menambahkan kebergantungan kami:

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

3. GIS dan Shapefiles

Untuk menggunakan praktikal perpustakaan GeoTools, kita perlu mengetahui beberapa perkara mengenai sistem maklumat geografi dan shapefiles .

3.1. GIS

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

Sebilangan data geografi bersifat spasial - merujuk kepada lokasi konkrit di bumi. Data spasial biasanya disertakan dengan data atribut. Data atribut boleh menjadi maklumat tambahan mengenai setiap ciri spasial.

Contoh data geografi adalah bandar. Lokasi sebenar bandar adalah data spasial. Data tambahan seperti nama kota dan penduduk akan membentuk data atribut.

3.2. Shapefiles

Format yang berbeza tersedia untuk bekerja dengan data geospasial. Raster dan vektor adalah dua jenis data utama.

Dalam artikel ini, kita akan melihat cara bekerja dengan jenis data vektor e . Jenis data ini dapat ditunjukkan sebagai titik, garis, atau poligon.

Untuk menyimpan data vektor dalam fail, kami akan menggunakan shapefile . Format fail ini digunakan semasa bekerja dengan jenis data vektor geospasial. Ia juga serasi dengan pelbagai perisian GIS.

Kita dapat menggunakan GeoTools untuk menambahkan ciri seperti bandar, sekolah, dan mercu tanda ke shapefiles .

4. Membuat Ciri

The GeoTools dinyatakan oleh dokumentasi yang ciri-ciri yang adalah apa-apa yang dapat dibuat pada peta, seperti sebuah bandar atau beberapa mercu tanda. Dan, seperti yang kami sebutkan, setelah dibuat, fitur kemudian dapat disimpan ke dalam fail yang disebut shapefiles .

4.1. Menyimpan Data Geospatial

Sebelum membuat ciri, kita perlu mengetahui data geospasialnya atau koordinat garis bujur dan garis lintang lokasinya di bumi. Mengenai data atribut, kita perlu mengetahui nama ciri yang ingin kita buat.

Maklumat ini boleh didapati di web. Beberapa laman web seperti simplemaps.com atau maxmind.com menawarkan pangkalan data percuma dengan data geospasial.

Apabila kita mengetahui garis bujur dan garis lintang sebuah bandar, kita dapat menyimpannya dengan mudah dalam beberapa objek. Kita boleh menggunakan objek Peta yang akan menyimpan nama bandar dan senarai koordinatnya.

Mari buat kaedah pembantu untuk memudahkan penyimpanan data di dalam objek Peta kami :

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 kita isi objek Peta kami :

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);
    

Sekiranya kita memuat turun beberapa pangkalan data CSV yang mengandungi data ini, kita dapat dengan mudah membuat pembaca untuk mengambil data daripada menyimpannya dalam objek seperti di sini.

4.2. Menentukan Jenis Ciri

Jadi, sekarang kita mempunyai peta bandar. Untuk dapat membuat ciri dengan data ini, kita perlu menentukan jenisnya terlebih dahulu. GeoTools menawarkan dua cara untuk menentukan jenis ciri.

Salah satu cara adalah dengan menggunakan kaedah createType dari kelas DataUtilites :

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

Cara lain adalah menggunakan SimpleFeatureTypeBuilder , yang memberikan lebih banyak fleksibiliti . Sebagai contoh, kita boleh menetapkan Sistem Rujukan Koordinat untuk jenisnya, dan kita boleh menetapkan 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-dua jenis menyimpan maklumat yang sama. Lokasi kota disimpan sebagai Titik , dan nama kota disimpan sebagai Rentetan .

Anda mungkin menyedari bahawa pemboleh ubah jenis JENIS dan KOTA dinamakan dengan semua huruf besar, seperti pemalar. Pemboleh ubah jenis harus diperlakukan sebagai pemboleh ubah akhir dan tidak boleh diubah setelah dibuat , jadi cara penamaan ini dapat digunakan untuk menunjukkan hal itu.

4.3. Penciptaan Ciri dan Koleksi Ciri

Setelah kami menentukan jenis ciri dan kami mempunyai objek yang mempunyai data yang diperlukan untuk membuat ciri, kami dapat mulai membuatnya dengan pembangunnya.

Mari kita buat SimpleFeatureBuilder yang menyediakan jenis ciri kami:

SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(CITY);

Kami juga memerlukan koleksi untuk menyimpan semua objek ciri 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 bahawa GeoTools adalah perpustakaan yang rancak, dan artikel ini hanya berfungsi sebagai pengenalan asas untuk perpustakaan. Juga, GeoTools tidak terhad kepada mewujudkan jenis data vektor sahaja - ia juga boleh digunakan untuk membuat atau untuk bekerja dengan jenis data raster.

Anda boleh mendapatkan contoh kod lengkap yang digunakan dalam artikel ini dalam projek GitHub kami. Ini adalah projek Maven, jadi anda seharusnya dapat mengimportnya dan menjalankannya sebagaimana adanya.