org.jetbrains.letsPlot.toolkit.geotools.FeatureCollectionExt.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of lets-plot-kotlin-geotools Show documentation
Show all versions of lets-plot-kotlin-geotools Show documentation
Lets-Plot Kotlin GeoTools Bridge.
Requires GeoTools artifacts:
- org.geotools:gt-main:[30,)
- org.geotools:gt-geojson:[30,)
/*
* Copyright (c) 2022. JetBrains s.r.o.
* Use of this source code is governed by the MIT license that can be found in the LICENSE file.
*/
package org.jetbrains.letsPlot.toolkit.geotools
import org.geotools.api.feature.Feature
import org.geotools.api.feature.simple.SimpleFeature
import org.geotools.api.feature.simple.SimpleFeatureType
import org.geotools.api.feature.type.FeatureType
import org.geotools.api.feature.type.GeometryDescriptor
import org.geotools.api.referencing.crs.CoordinateReferenceSystem
import org.geotools.data.simple.SimpleFeatureCollection
import org.geotools.feature.FeatureCollection
import org.geotools.geojson.geom.GeometryJSON
import org.jetbrains.letsPlot.spatial.SpatialDataset
import org.locationtech.jts.geom.Geometry
/**
* Transforms SimpleFeatureCollection to SpatialDataset with feature geometries encoded in GEOJSON format.
*
* @param decimals the number of decimals to use when encoding floating point numbers.
*/
fun SimpleFeatureCollection.toSpatialDataset(decimals: Int = 10): SpatialDataset {
@Suppress("UNCHECKED_CAST")
return _toSpatialDataset(this as FeatureCollection, decimals)
}
/**
* Transforms abstract SimpleFeatureCollection to SpatialDataset with feature geometries encoded in GEOJSON format.
*
* @param decimals the number of decimals to use when encoding floating point numbers.
*/
fun FeatureCollection.toSpatialDataset(decimals: Int = 10): SpatialDataset {
return _toSpatialDataset(this, decimals)
}
private fun _toSpatialDataset(
featureCollection: FeatureCollection,
decimals: Int
): SpatialDataset {
val geojson = GeometryJSON(decimals)
val (data, geometries, crs) = getDataAndGeometries(featureCollection) {
geojson.toString(it)
}
return SpatialDataset.withGEOJSON(data, geometries, crs)
}
private fun getDataAndGeometries(
featureCollection: FeatureCollection,
geometryToString: (Geometry) -> String
): Triple