
本文介绍如何使用 Kotlin(基于 org.json 库)从原始 JSON 文件中提取经纬度坐标,并构建符合 GeoJSON 规范的 FeatureCollection 对象,适用于地图可视化等地理数据处理场景。
本文介绍如何使用 kotlin(基于 `org.json` 库)从原始 json 文件中提取经纬度坐标,并构建符合 geojson 规范的 `featurecollection` 对象,适用于地图可视化等地理数据处理场景。
在 Kotlin 中实现 JSON 到 GeoJSON 的转换,核心在于:安全解析嵌套 JSON 结构 → 提取坐标字段 → 按 GeoJSON 规范组装对象。与 JavaScript 的动态属性访问不同,Kotlin 需借助强类型 JSON 解析器(如 org.json.JSONObject/JSONArray)进行显式类型操作,同时兼顾空值检查与结构健壮性。
以下是一个完整、可运行的实现方案(已优化原始代码中的潜在问题):
✅ 推荐实现(含错误处理与类型安全)
import org.json.JSONArray
import org.json.JSONObject
// 假设原始 JSON 字符串已加载(例如从 assets 或网络)
val jsonStr = """
{
"track": [
{"Lat": "48.8566", "Lon": "2.3522"},
{"Lat": "48.8584", "Lon": "2.3532"},
{"Lat": "48.8602", "Lon": "2.3542"}
]
}
""".trimIndent()
fun convertToGeoJSON(jsonStr: String): String? {
return try {
val root = JSONObject(jsonStr)
val trackArray = root.getJSONArray("track")
// 提取坐标点列表:List<List<Double>> 更利于后续扩展(如写入其他格式)
val coordinates = mutableListOf<List<Double>>()
for (i in 0 until trackArray.length()) {
val track = trackArray.getJSONObject(i)
// 安全解析:处理缺失字段或非数字字符串
val lat = track.optString("Lat", "").toDoubleOrNull() ?: continue
val lon = track.optString("Lon", "").toDoubleOrNull() ?: continue
coordinates.add(listOf(lon, lat)) // 注意:GeoJSON 要求 [经度, 纬度]
}
// 构建标准 GeoJSON FeatureCollection(使用 JSONObject 保证格式严谨性)
val featureCollection = JSONObject().apply {
put("type", "FeatureCollection")
val features = JSONArray().apply {
put(JSONObject().apply {
put("type", "Feature")
put("properties", JSONObject().apply { put("name", "Sea Wall Route") })
put("geometry", JSONObject().apply {
put("type", "LineString")
put("coordinates", JSONArray(coordinates))
})
})
}
put("features", features)
}
featureCollection.toString(2) // 格式化输出(缩进 2 空格),便于调试
} catch (e: Exception) {
println("GeoJSON conversion failed: ${e.message}")
null
}
}
// 使用示例
val geoJsonString = convertToGeoJSON(jsonStr)
println(geoJsonString)⚠️ 关键注意事项
- 坐标顺序:GeoJSON 明确要求 coordinates 数组中每个点为 [longitude, latitude](即先经度后纬度),切勿颠倒;
- 类型安全:使用 optString() + toDoubleOrNull() 替代 getString(),避免因字段缺失或格式错误导致 JSONException;
- 避免字符串拼接生成 JSON:原始答案中用字符串模板插入 ArrayList<String> 会生成非法 JSON(如 ["[2.3522, 48.8566]", ...]),实际应为嵌套数组 [[2.3522, 48.8566], ...] —— 正确做法是用 JSONArray(coordinates);
- 扩展建议:生产环境推荐使用更现代的库(如 kotlinx.serialization + GeoJSON 数据类),支持编译期类型检查与序列化优化;
- 性能提示:若处理大文件,考虑流式解析(如 JsonReader)而非全量加载到内存。
通过以上方式,你不仅能准确复现 JavaScript 的逻辑,还能获得更健壮、可维护、符合地理信息标准的 Kotlin 实现。


















