Swift4如何从本地JSON文件提取坐标值并存储到数组
从GeoJSON FeatureCollection提取所有coordinates到数组(Swift)
你已经成功解析了JSON并拿到了features数组,这一步很棒!接下来只需要遍历每个Feature,逐层取出geometry里的coordinates,然后收集到一个新数组里就可以了。我帮你调整了代码,还加入了安全处理避免崩溃:
具体步骤:
- 遍历
features数组中的每个Feature元素 - 从每个Feature中取出
geometry字典(用可选绑定替代强制解包,防止JSON结构异常导致崩溃) - 从
geometry中取出coordinates数组 - 将所有有效的
coordinates添加到目标数组中
修改后的完整代码:
// 用来存储所有坐标的二维数组,每个元素是[经度, 纬度] var coordinatesArray: [[Double]] = [] if let path = Bundle.main.path(forResource: "json", ofType: "json"), let jsonData = NSData(contentsOfFile: path) as Data? { do { guard let parsedData = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any], let features = parsedData["features"] as? [[String: Any]] else { print("JSON解析失败或结构不符合预期") return } // 遍历每个Feature for feature in features { // 逐层取出geometry和coordinates,做安全校验 guard let geometry = feature["geometry"] as? [String: Any], let coordinates = geometry["coordinates"] as? [Double] else { // 如果某个Feature的结构不对,直接跳过,不影响其他数据 continue } coordinatesArray.append(coordinates) } // 输出结果 print("提取到的所有坐标:\(coordinatesArray)") } catch { print("解析JSON时出错:\(error.localizedDescription)") } } else { print("无法读取本地JSON文件") }
额外说明:
从你的输出结果来看,coordinates里的数值是带引号的字符串类型,不是直接的数字。如果是这种情况,需要把代码里的类型转换调整一下,把字符串转成Double:
// 处理字符串类型的坐标 for feature in features { guard let geometry = feature["geometry"] as? [String: Any], let coordStrings = geometry["coordinates"] as? [String], // 把字符串转成Double,过滤掉转换失败的情况 let coordinates = coordStrings.compactMap({ Double($0) }) else { continue } coordinatesArray.append(coordinates) }
为什么不用强制解包?因为如果JSON里某个Feature缺少
geometry或者coordinates,强制解包会导致App崩溃,用guard let或者if let做安全校验能让代码更健壮。
内容的提问来源于stack exchange,提问作者fina
相关产品推荐
相关产品推荐

