我收到 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], ... ]
}
},
],
}
我的版本
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)
}
}