代码之家  ›  专栏  ›  技术社区  ›  PvDev

如何从geoJson追加2d数组?

  •  0
  • PvDev  · 技术社区  · 6 年前

    我有显示室内导航地图的geojson文件。从geojson响应中,我得到的坐标是二维数组。以下是我的JSON响应:

    {
      "type": "FeatureCollection",
      "features": [
        {
          "type": "Feature",
          "properties": {
            "name": "Dot2Globe - CZSM"
          },
          "geometry": {
            "type": "LineString",
            "coordinates": [
              [
                80.2226534485817,
                12.871137160770251
              ],
              [
                80.22263333201408,
                12.871145658917484
              ],
              [
                80.22264339029789,
                12.871184881131773
              ],
              [
                80.2225998044014,
                12.871194686684378
              ],
              [
                80.22260718047619,
                12.87121625889878
              ]
            ]
          }
        },
        {
          "type": "Feature",
          "properties": {
            "name": "Entrance - CZSM"
          },
          "geometry": {
            "type": "LineString",
            "coordinates": [
              [
                80.22256962954998,
                12.87123848481471
              ],
              [
                80.22255957126617,
                12.871204819088353
              ],
              [
                80.22259946912527,
                12.871195013536129
              ],
              [
                80.22264305502176,
                12.871184881131773
              ],
              [
                80.22263266146183,
                12.871145658917484
              ],
              [
                80.22265445441008,
                12.871135526511145
              ]
            ]
          }
        }
      ]
    }
    

    func loadGeoJson() {
        guard let jsonUrl = Bundle.main.url(forResource: "map1", withExtension: "geojson") else { return }
    
        guard let jsonData = try? Data(contentsOf: jsonUrl) else { return }
    
        self.drawPolyline(geoJson: jsonData)
    
        URLSession.shared.dataTask(with: jsonUrl) { (data, response, error) in
            if error != nil {
                print(error!.localizedDescription)
            }
    
            guard let data = data else { return }
    
            do {
                //Decode retrived data with JSONDecoder and assing type of Article object
                let baseData = try JSONDecoder().decode(Geodata.self, from: data)
    
                for featu in baseData.features {
                    self.nameArray.append(featu.properties.name!)
                    print("nameArray==\(self.nameArray)")
                }
    
                for coor in baseData.features {
                    self.coordinatesArray.append(contentsOf: coor.geometry.coordinates)
    
                    print("new coor::\(coor.geometry.coordinates)")
                    print("coordArray==\(self.coordinatesArray)")
                }
            } catch let jsonError {
                print(jsonError)
            }
    
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }.resume()
    }
    

    这是我的结构类:

    struct Geodata: Codable {
        let type: String
        let features: [Feature]
    }
    
    struct Feature: Codable {
        let type: String
        let properties: Properties
        let geometry: Geometry
    }
    
    struct Geometry: Codable {
        let type: String
        let coordinates: [[Double]]
    }
    
    struct Properties: Codable {
        let name: String?
    }
    

    [80.2226534485817,
    12.871137160770251] 
    

    但我想要的是

     [[[80.2226534485817, 
      12.871137160770251], [80.22263333201408, 
     12.871145658917484], [80.22264339029789, 12.871184881131773], 
    [80.2225998044014, 
    12.871194686684378], [80.22260718047619, 12.87121625889878]], 
    [[80.22256962954998,     12.87123848481471], [80.22255957126617, 
    12.871204819088353], [80.22259946912527, 12.871195013536129], 
    [80.22264305502176, 12.871184881131773], [80.22263266146183, 
    12.871145658917484], [80.22265445441008, 12.871135526511145]]]
    

    打印数组索引0时,预期结果为

     [[80.2226534485817, 12.871137160770251], [80.22263333201408, 
     12.871145658917484], [80.22264339029789, 12.871184881131773], [80.2225998044014, 
     12.871194686684378], [80.22260718047619, 12.87121625889878]]
    

    引用了此链接 How to draw GeoJSON in Apple Maps as overlay using Swift 3 但没能做到。。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Kamran    6 年前

    你需要申报 coordinatesArray 如下所示,然后相应地分配,

    // Declaration
    var coordinatesArray: [[[Double]]] = []
    // Assignment
    coordinatesArray = baseData.features.map({ $0.geometry.coordinates })
    print(coordinatesArray[0])
    

    输出

    [[80.222653448581696, 12.871137160770251], [80.222633332014084, 12.871145658917484], [80.22264339029789, 12.871184881131773], [80.222599804401398, 12.871194686684378], [80.222607180476189, 12.87121625889878]]