首页 > 解决方案 > 在 iOS 的 Google 地图上显示从 API 接收的 GeoJSON 数据

问题描述

有人可以帮我在GeoJSONgoogle maps iOS sdk 上显示从 api 端点收到的数据吗?我已经尝试了将近一个星期,但无处可去!我已经使用了该GMUGeoJSONParser函数,但它接受的参数是url,inputstreamdata. 我Alamofire用来接收数据,然后将其传递给它,GMUGeoJSONParser(data: jsonData)但它没有显示任何内容。我已经导入了 GoogleMapsUtils,所以这不是问题。

    Alamofire.request(url, method: .post, parameters: params,encoding: JSONEncoding.default,headers: headers).responseJSON{response in
        if let result = response.data
        {
        let geoJSONParser = GMUGeoJSONParser(data: result)
            geoJSONParser.parse()

            let renderer = GMUGeometryRenderer(map:self.mapView, geometries: geoJSONParser.features)
            renderer.render()
        }
        
    }

geojson 是一个 featureCollection 并且已经过验证。它也可以与网络上的 Google Maps JS Api 完美配合。我首先尝试通过 SwiftyJSON 将响应转换为 JSON

result = response.result.value
json = JSON(result)

但是当我将此 json 结果传递给它的参数时GMUGeoJSONParser(data: json),会出现错误“无法将类型 json 转换为参数类型 Data”。我也尝试过将 json 结果转换为像这样的类型数据这样 let jsonData : Data = try! JSONSerialization.data(withJSONObject:json, options: JSONSerialization.WritingOptions.fragmentsAllowed) 做时,应用程序崩溃。编辑:这是 GeoJSON 响应的片段。完整的响应具有 1200 多个特征。

"{\"type\": \"FeatureCollection\", \"features\": [{\"id\": 159, \"type\": \"Feature\", \"geometry\": {\"type\": \"MultiPolygon\", \"coordinates\": [[[[-88.548423248149, 39.7640682556336], [-88.5484140112235, 39.7634955634145], [-88.5577472392719, 39.7635270396728], [-88.5577514852793, 39.7635270624558], [-88.5577514785708, 39.7635283408508], [-88.5577534828958, 39.7649876367628], [-88.557753529907, 39.764989619059], [-88.5577431041359, 39.7649895725788], [-88.5484181305347, 39.7649561806335], [-88.548423248149, 39.7640682556336]]]]}, \"properties\": {\"name\": \"W&Vogel 1 (2100) 9\"}},

更新:

let json = SwiftyJSON.JSON(result)
let fieldData: AnyObject? = json.string?.parseJSONString
let checker = JSONSerialization.isValidJSONObject(fieldData)
print(checker)
let jsonData : Data = try!
JSONSerialization.data(withJSONObject:fieldData, options:[])
let geoJSONParser = GMUGeoJSONParser(data: jsonData)
geoJSONParser.parse()

当我这样做时,代码会在 geoJSONParser.parse() 处引发异常。 线程 1:异常:“-[NSNull objectForKey:]:无法识别的选择器发送到实例 0x7fff8062d9d0”

@Larme 我在异常代码中添加了一个中断,它把我带到了这里

标签: jsonswiftgoogle-maps-ios-utils

解决方案


我做的 !在浪费了大量时间挖掘代码之后,它实际上是导致问题的 GeoJSON 中的一个空几何数组。存储这些字段的表显然允许空几何值,并且有一个字段在没有几何的情况下保存。因此,尽管 json 是有效的,但 GMUGeoJSONParser 却抛出了一个错误。感谢那些回复的人。这是最终代码,以防将来对某人有所帮助。

        Alamofire.request(url, method: .post, parameters: params, headers: headers).responseJSON{response in
        if let result = response.result.value
        {
       let json = SwiftyJSON.JSON(result)
      let fieldData: AnyObject? = json.string?.parseJSONString as! AnyObject
        let jsonData : Data = try! JSONSerialization.data(withJSONObject:fieldData, options:[])
            let geoJSONParser = GMUGeoJSONParser(data: jsonData)
            geoJSONParser.parse()
        let style = GMUStyle(styleID: "styleId", stroke: UIColor.black, fill: UIColor.yellow, width: 2, scale: 2, heading: 0, anchor: CGPoint(x: 0, y: 0), iconUrl: nil, title: nil, hasFill: true, hasStroke: true)
            for feature in geoJSONParser.features{
                feature.style = style
                            }
            let renderer = GMUGeometryRenderer(map: self.mapView, geometries: geoJSONParser.features, styles: [style])
            renderer.render()
        }
        
    }

注意: parseJSONString 是一个字符串扩展,我在这里找到了在 Swift 中将 JSON 字符串转换为 Object 的简单而干净的方法


推荐阅读