如何使用Swift 3在Apple Maps中将GeoJSON绘制为叠加层 [英] How to draw GeoJSON in Apple Maps as overlay using Swift 3

查看:67
本文介绍了如何使用Swift 3在Apple Maps中将GeoJSON绘制为叠加层的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将以下GeoJSON数据绘制为MKMapView中的一个整体.

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

GeoJSON文件如下.

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

            ]

        }

    }
]

}

但是我无法解析它.请帮忙.是否有任何第三方SDK可用于执行此操作.

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

我已经在Swift 3中编写了如下代码

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 {

    }
}

}

但这不起作用.

推荐答案

features的第一个字典中,您的coordinates键具有2D数组,因此您还需要在geometryObject.values中添加另一个if let条件> for循环.

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)

这篇关于如何使用Swift 3在Apple Maps中将GeoJSON绘制为叠加层的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆