如何在Apple Maps中使用Swift绘制GeoJSON作为覆盖使用Swift 3
问题描述:
我试图在MKMapView中绘制以下GeoJSON数据。如何在Apple Maps中使用Swift绘制GeoJSON作为覆盖使用Swift 3
GeoJSON文件如下。
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"Name": "line1"
},
"geometry": {
"type": "LineString",
"coordinates": [
[
76.35498046875,
25.145284610685064
],
[
81.36474609375,
25.06569718553588
],
[
83.91357421875,
23.301901124188877
],
[
82.001953125,
22.004174972902003
],
[
78.33251953125,
21.248422235627014
],
[
76.31103515625,
21.268899719967695
]
]
}
},
{
"type": "Feature",
"properties": {
"Name": "point8"
},
"geometry": {
"type": "Point",
"coordinates": [
74.50927734375,
20.076570104545173
]
}
}
]
}
但我不能够解析它。请帮忙。是否有任何第三方SDK可用于执行此操作。
我已经写在斯威夫特3的代码如下
func loadJSON() {
var features = [Feature]()
guard let url = Bundle.main.url(forResource: "Geo", withExtension: "json") else {
return
}
do {
let data = try Data(contentsOf: url)
guard let rootObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String : Any] else {
return
}
guard let featureObjects = rootObject["features"] as? [[String: AnyObject]] else {
return
}
for feature in featureObjects {
if let type = feature["type"] as? String,
let propertyObject = feature["properties"] as? [String : String],
let geometryObject = feature["geometry"] as? [String : AnyObject] {
var properties: PropertyVal?
for property in propertyObject.values {
properties = PropertyVal(name: property)
}
var geometries: Geometry?
var coordData: [Coordinates]?
var coord: Coordinates
var typeData: String = ""
for obj in geometryObject.values {
print(obj)
if let type = obj as? String {
typeData = type
} else {
//return
}
if let coordObj = obj as? [Double] {
coord = Coordinates(latitude: coordObj[0], longitude: coordObj[1])
coordData?.append(coord)
} else {
//return
}
geometries = Geometry(type: typeData, coordinates: coordData!)
}
let feature = Feature(type: type, properties: properties!, geometry: geometries!)
features.append(feature)
print("Feature is \(features)")
}
}
} catch {
}
}
}
但是,这是行不通的。
答
在features
您coordinates
键具有二维数组的第一个字典,所以你需要在你的geometryObject.values
还添加一个if let
条件循环。
for obj in geometryObject.values {
print(obj)
if let type = obj as? String {
typeData = type
}
if let coordObj = obj as? [Double] {
coord = Coordinates(latitude: coordObj[0], longitude: coordObj[1])
coordData?.append(coord)
}
//Add one more if let condition
if let coordObj = obj as? [[Double]] {
for coordinate in coordObj {
let coord = Coordinates(latitude: coordinate[0], longitude: coordinate[1])
coordData?.append(coord)
}
}
geometries = Geometry(type: typeData, coordinates: coordData!)
}
let feature = Feature(type: type, properties: properties!, geometry: geometries!)
features.append(feature)
是的,它工作。非常感谢:D – AniAdhikary
我接受了你的答案。再次感谢!! – AniAdhikary
@AniAdhikary欢迎伴侣:) –