json - 在 iOS 的 Google 地图上显示从 API 接收的 GeoJSON 数据
问题描述
有人可以帮我在GeoJSON
google maps iOS sdk 上显示从 api 端点收到的数据吗?我已经尝试了将近一个星期,但无处可去!我已经使用了该GMUGeoJSONParser
函数,但它接受的参数是url
,inputstream
和data
. 我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 我在异常代码中添加了一个中断,它把我带到了这里
解决方案
我做的 !在浪费了大量时间挖掘代码之后,它实际上是导致问题的 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 的简单而干净的方法
推荐阅读
- javascript - 在我的网站中使用 localStorage 进行翻译,而不是每次我再次访问该页面时都加载它们
- powershell - 脚本属性返回类型的 Pester 测试
- c# - 使用我在列表中使用 Lambda 表达式找到的对象
- c# - WPF 应用程序 - 在运行时请求管理员权限
- python - TensorFlow 多 GPU - NCCL
- java - 如何解决 ORA-12514、TNS:k8s 上的侦听器 - oracle 12
- css - 如何更改 Bootstrap 4 模态标题的字体粗细?
- html - 带箭头的号召性用语按钮
- google-sheets - 查找函数返回无效的整数值
- apache-kafka - 处理器 API:存储在 KeyValueStore 中的事件的批量 POST 请求