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

醉酒当歌 提交于 2019-12-05 01:44:08

问题


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:


In the first dictionary of features your coordinates key having 2D array, so you need to also add one more if let condition in your geometryObject.values for loop.

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)


来源:https://stackoverflow.com/questions/44329124/how-to-draw-geojson-in-apple-maps-as-overlay-using-swift-3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!