如何在Kotlin中移动geojson特征集合中的所有坐标

问题描述 投票:0回答:1

我收到 geojson 数据(FeatureCollection),它存储一些具有几何形状的对象。

移动/移动/变换FeatureCollection中所有特征的所有几何图形中的所有点的最佳方法是什么?

我正在 Kotlin 上编写并使用 jacksonObjectMapper 来解析这些数据,现在我看到的唯一方法是更改每种几何类型的循环中的每个坐标

例如:

特色合集

{
    "type":"FeatureCollection",
    "features": [
        {
            "type":"Feature",
            "properties": {
                "background": "WALLS_LOAD_BEARING"
            },
            "geometry": {
                "type":"MultiPolygon",
                "coordinates":[
                    [[[10.0, 20.0], [15.0, 20.0], ... ,[10.0, 25.0]]],
                ]
            }
        },
        {
            "type":"Feature",
            "properties": {
                "background":"PARTITIONS"
            },
            "geometry": {
                "type":"MultiPolygon",
                "coordinates": [...]
            }
        },
        {
            "type":"Feature",
            "properties": {
                "background":"WALLS_LOAD_BEARING"
            },
            "geometry": {
                "type":"LineString",
                "coordinates": [[10.0, 20.0], ... ]
            }
        },
    ],
}

坐标:

moveX = 10.0
moveY = 5.0

我期待收到

{
    "type":"FeatureCollection",
    "features": [
        {
            "type":"Feature",
            "properties": {
                "background": "WALLS_LOAD_BEARING"
            },
            "geometry": {
                "type":"MultiPolygon",
                "coordinates":[
                    [[[20.0, 25.0], [25.0, 25.0], ... ,[20.0, 30.0]]],
                ]
            }
        },
        {
            "type":"Feature",
            "properties": {
                "background":"PARTITIONS"
            },
            "geometry": {
                "type":"MultiPolygon",
                "coordinates": [...]
            }
        },
        {
            "type":"Feature",
            "properties": {
                "background":"WALLS_LOAD_BEARING"
            },
            "geometry": {
                "type":"LineString",
                "coordinates": [[20.0, 25.0], ... ]
            }
        },
    ],
}
kotlin coordinates geojson
1个回答
0
投票

我的版本

object GeometryUtils {

    private val mapper = jacksonObjectMapper()

    private fun movePointToCoordinate(point: Point, coordinateX: Double, coordinateY: Double) {
        point.coordinates.longitude += coordinateX
        point.coordinates.latitude += coordinateY
    }

    private fun moveMultiPointToCoordinate(multiPoint: MultiPoint, coordinateX: Double, coordinateY: Double) {
        multiPoint.coordinates.forEach { coordinate ->
            coordinate.longitude += coordinateX
            coordinate.latitude += coordinateY
        }
    }

    private fun moveLineStringToCoordinate(lineString: LineString, coordinateX: Double, coordinateY: Double) {
        lineString.coordinates.forEach { coordinate ->
            coordinate.longitude += coordinateX
            coordinate.latitude += coordinateY
        }
    }

    private fun moveMultiLineStringToCoordinate(multiLineString: MultiLineString, coordinateX: Double, coordinateY: Double) {
        multiLineString.coordinates.forEach { lineString ->
            lineString.forEach { coordinate ->
                coordinate.longitude += coordinateX
                coordinate.latitude += coordinateY
            }
        }
    }

    private fun movePolygonToCoordinate(polygon: Polygon, coordinateX: Double, coordinateY: Double) {
        polygon.coordinates.forEach { lineString ->
            lineString.forEach { coordinate ->
                coordinate.longitude += coordinateX
                coordinate.latitude += coordinateY
            }
        }
    }

    private fun moveMultiPolygonToCoordinate(multiPolygon: MultiPolygon, coordinateX: Double, coordinateY: Double) {
        multiPolygon.coordinates.forEach { polygon ->
            polygon.forEach { lineString ->
                lineString.forEach { coordinate ->
                    coordinate.longitude += coordinateX
                    coordinate.latitude += coordinateY
                }
            }
        }
    }

    private fun moveGeoJsonObjectToCoordinate(geometry: GeoJsonObject, coordinateX: Double, coordinateY: Double): GeoJsonObject {
        when (geometry::class) {
            Point::class -> movePointToCoordinate(geometry as Point, coordinateX, coordinateY)
            MultiPoint::class -> moveMultiPointToCoordinate(geometry as MultiPoint, coordinateX, coordinateY)
            LineString::class -> moveLineStringToCoordinate(geometry as LineString, coordinateX, coordinateY)
            MultiLineString::class -> moveMultiLineStringToCoordinate(geometry as MultiLineString, coordinateX, coordinateY)
            Polygon::class -> movePolygonToCoordinate(geometry as Polygon, coordinateX, coordinateY)
            MultiPolygon::class -> moveMultiPolygonToCoordinate(geometry as MultiPolygon, coordinateX, coordinateY)
        }
        return geometry
    }

    fun moveGeometryToCoordinate(json: String, coordinateX: Double, coordinateY: Double): String =
        mapper.writeValueAsString(
            moveGeoJsonObjectToCoordinate(
                mapper.readValue(json, GeoJsonObject::class.java),
                coordinateX,
                coordinateY,
            ),
        )

    fun moveFeatureCollectionToCoordinate(json: String, coordinateX: Double, coordinateY: Double): String {
        val featureCollection = mapper.readValue(json, FeatureCollection::class.java)
        featureCollection.features.forEach { feature ->
            feature.geometry = moveGeoJsonObjectToCoordinate(feature.geometry, coordinateX, coordinateY)
        }
        return mapper.writeValueAsString(featureCollection)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.