【问题标题】:How to append 2d array from geoJson?如何从geoJson附加二维数组?
【发布时间】:2018-10-10 03:36:33
【问题描述】:

我有显示室内导航地图的 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
          ]
        ]
      }
    }
  ]
}

在这里,我尝试将二维坐标附加到数组。使用坐标数组在 AR(增强现实)中显示折线。这是我到目前为止尝试过的代码:

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?
}

我的问题是在附加数组之后,当我指定数组索引为 0 时,它会打印一个 lat long 而不是二维数组的数组。这是我得到的:

[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,但没能成功..

【问题讨论】:

  • 附加数组看起来不错,有什么问题?
  • 你还没说是什么问题。如果您可以编辑您的问题,我相信有人可以提供帮助。
  • @Kamran 我也更新了结果和预期结果。你能看一下吗

标签: ios arrays json swift struct


【解决方案1】:

您需要如下声明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]]

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多