2017-06-02 37 views
1

我試圖在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 { 

    } 
} 

}

但是,這是行不通的。

回答

1

featurescoordinates鍵具有二維數組的第一個字典,所以你需要在你的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) 
+1

是的,它工作。非常感謝:D – AniAdhikary

+0

我接受了你的答案。再次感謝!! – AniAdhikary

+0

@AniAdhikary歡迎伴侶:) –