diff --git a/dataframe-arrow/build.gradle.kts b/dataframe-arrow/build.gradle.kts index 41088774f4..836cf5bff4 100644 --- a/dataframe-arrow/build.gradle.kts +++ b/dataframe-arrow/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { implementation(libs.kotlin.datetimeJvm) testImplementation(libs.junit) + testImplementation(projects.dataframeJson) testImplementation(libs.kotestAssertions) { exclude("org.jetbrains.kotlin", "kotlin-stdlib-jdk8") } diff --git a/dataframe-geo/build.gradle.kts b/dataframe-geo/build.gradle.kts index 8af196d432..7f09446991 100644 --- a/dataframe-geo/build.gradle.kts +++ b/dataframe-geo/build.gradle.kts @@ -47,6 +47,7 @@ dependencies { implementation(libs.ktor.serialization.kotlinx.json) testImplementation(kotlin("test")) + testImplementation(projects.dataframeJson) } tasks.withType().configureEach { diff --git a/dataframe-geo/src/main/kotlin/org/jetbrains/kotlinx/dataframe/geo/geotools/toSimpleFeatureCollection.kt b/dataframe-geo/src/main/kotlin/org/jetbrains/kotlinx/dataframe/geo/geotools/toSimpleFeatureCollection.kt index 0448977455..a42174b399 100644 --- a/dataframe-geo/src/main/kotlin/org/jetbrains/kotlinx/dataframe/geo/geotools/toSimpleFeatureCollection.kt +++ b/dataframe-geo/src/main/kotlin/org/jetbrains/kotlinx/dataframe/geo/geotools/toSimpleFeatureCollection.kt @@ -40,14 +40,16 @@ fun GeoDataFrame<*>.toSimpleFeatureCollection( val featureCollection = ListFeatureCollection(featureType) val featureBuilder = SimpleFeatureBuilder(featureType) - + // if ID is present, SortedMap in DefaultFeatureCollection sorts rows by ID lexicographically + // I couldn't disable writing it, so let's generate lexicographically sorted IDs + val format = "f%0${df.rowsCount().toString().length}d" df.forEach { row -> val geometry = row["geometry"] featureBuilder.add(geometry) df.columnNames().filter { it != "geometry" }.forEach { colName -> featureBuilder.add(row[colName]) } - val feature: SimpleFeature = featureBuilder.buildFeature(null) + val feature: SimpleFeature = featureBuilder.buildFeature(String.format(format, index())) featureCollection.add(feature) } diff --git a/dataframe-geo/src/test/kotlin/org/jetbrains/kotlinx/dataframe/geo/io/IOTest.kt b/dataframe-geo/src/test/kotlin/org/jetbrains/kotlinx/dataframe/geo/io/IOTest.kt index dc28300f92..a416cd56d0 100644 --- a/dataframe-geo/src/test/kotlin/org/jetbrains/kotlinx/dataframe/geo/io/IOTest.kt +++ b/dataframe-geo/src/test/kotlin/org/jetbrains/kotlinx/dataframe/geo/io/IOTest.kt @@ -1,5 +1,6 @@ package org.jetbrains.kotlinx.dataframe.geo.io +import org.geotools.referencing.CRS import org.jetbrains.kotlinx.dataframe.api.dataFrameOf import org.jetbrains.kotlinx.dataframe.geo.GeoDataFrame import org.jetbrains.kotlinx.dataframe.geo.toGeo @@ -35,17 +36,18 @@ class IOTest { assert(geodf.crs == null) } - /* - TODO: doesn't work for now - writers adds ids that breaks order when read features @Test fun writeGeoJson() { val tempFile = Files.createTempFile("simple_points", ".json").toFile() simplePointsGeoDf.writeGeoJson(tempFile) - assertEquals(simplePointsGeoDf, GeoDataFrame.readGeoJson(tempFile.toURI().toURL())) + val loadedGeoDataFrame = GeoDataFrame.readGeoJson(tempFile.toURI().toURL()) + assertEquals(simplePointsGeoDf.df, loadedGeoDataFrame.df) + // TODO: Doesn't work because of how equality between CRS is checked by geotools + // assertEquals(simplePointsGeoDf, loadedGeoDataFrame) tempFile.deleteOnExit() - }*/ + } @Test fun readShapefile() {