How to draw GeoJSON in Apple Maps as overlay using Swift 3

Viewed 3484

I am trying to draw the following GeoJSON data as an overaly in MKMapView.

The GeoJSON File is as below.

{

"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

            ]

        }

    }
]

}

But I am not able to parse it. Please help. Are there any third party SDKs available for doing this.

I have written the code in Swift 3 as below

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 {

    }
}

}

But this is not working.

1 Answers
Related