From ded3648ece2873f95749ee5f396c347284e5f8ec Mon Sep 17 00:00:00 2001 From: Nikita Klimenko Date: Mon, 15 Dec 2025 18:45:30 +0200 Subject: [PATCH 1/2] Enable json in tests for debugger table widget --- dataframe-arrow/build.gradle.kts | 1 + dataframe-geo/build.gradle.kts | 1 + 2 files changed, 2 insertions(+) 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 { From 8302a66491a8a9069d997975b1cc9f44c0fce1e4 Mon Sep 17 00:00:00 2001 From: Nikita Klimenko Date: Mon, 15 Dec 2025 18:47:35 +0200 Subject: [PATCH 2/2] Generate lexicographically ordered IDs for writeGeojson features https://github.com/Kotlin/dataframe/issues/1565 --- .../geo/geotools/toSimpleFeatureCollection.kt | 6 ++++-- .../org/jetbrains/kotlinx/dataframe/geo/io/IOTest.kt | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) 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() {