如何从 geoJson 文件中提取值并将值传递给 iOS swift 中的表视图

How to extract values from geoJson file and pass the value to tableview in iOS swift

我正在尝试提取 geoJson 值并将其存储到数组中,并在 table 视图中列出值数组以在地图视图中显示路线。 这里我用的是Mapbox for mapview,因为它支持室内导航。现在我可以直接从 geoJson 文件在地图视图中显示路线。但我需要将值提取到数组中,以便在 table 视图中列出值。

这是我尝试提取 geoJson 值的代码:

我为提取值创建的结构:

struct Collection : Decodable {
    let type : String
    let features : [Feature]
}

struct Feature : Decodable {
    let type : String
    let properties : Properties
    let geometry : Geometry
    // there is also geometry
}

struct Properties : Decodable {
    let name : String
}

struct Geometry : Decodable{
    let coordinates: [CLLocationCoordinate2D]
}

这是用于加载 geoJson 文件的代码:

 func loadGeoJson() {
    DispatchQueue.global().async {
        // Get the path for example.geojson in the app’s bundle  tbiMapbox.
        guard let jsonUrl = Bundle.main.url(forResource: "newData", withExtension: "geojson") else { return }
        guard let jsonData = try? Data(contentsOf: jsonUrl) else { return }
        DispatchQueue.main.async {
            self.drawPolyline(geoJson: jsonData)
            print("data::\(jsonData)")
        }
    }
}

此函数使用绘制折线作为坐标:

func drawPolyline(geoJson: Data) {
    guard let style = self.mapView.style else { return }

    let shapeFromGeoJSON = try! MGLShape(data: geoJson, encoding: String.Encoding.utf8.rawValue)
    let source = MGLShapeSource(identifier: "polyline", shape: shapeFromGeoJSON, options: nil)
    style.addSource(source)

    let layer = MGLLineStyleLayer(identifier: "polyline", source: source)

    layer.lineJoin = NSExpression(forConstantValue: "round")
    layer.lineCap = NSExpression(forConstantValue: "round")

    layer.lineColor = NSExpression(forConstantValue: UIColor(red: 59/255, green:178/255, blue:208/255, alpha:1))


    layer.lineWidth = NSExpression(format: "mgl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)",
                                   [14: 2, 18: 20])

    let casingLayer = MGLLineStyleLayer(identifier: "polyline-case", source: source)
    casingLayer.lineJoin = layer.lineJoin
    casingLayer.lineCap = layer.lineCap
    casingLayer.lineGapWidth = layer.lineWidth
    casingLayer.lineColor = NSExpression(forConstantValue: UIColor(red: 41/255, green:145/255, blue:171/255, alpha:1))
    casingLayer.lineWidth = NSExpression(format: "mgl_interpolate:withCurveType:parameters:stops:($zoomLevel, 'linear', nil, %@)",
                                         [14: 1, 18: 4])

    let dashedLayer = MGLLineStyleLayer(identifier: "polyline-dash", source: source)
    dashedLayer.lineJoin = layer.lineJoin
    dashedLayer.lineCap = layer.lineCap
    dashedLayer.lineColor = NSExpression(forConstantValue: UIColor.red)
    dashedLayer.lineOpacity = NSExpression(forConstantValue: 0.5)
    dashedLayer.lineWidth = layer.lineWidth
    dashedLayer.lineDashPattern = NSExpression(forConstantValue: [0, 1.5])

    style.addLayer(layer)
    style.addLayer(dashedLayer)
    style.insertLayer(casingLayer, below: layer)
}

对于table视图,现在我正在加载静态数据:

var nameArray = [String]()
var coordinatesArray = [CLLocationCoordinate2D]()

var nameARR = ["1", "2", "3"]

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return nameARR.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! newTableViewCell

    cell.companyName.text = nameARR[indexPath.row]
    return cell
}

我使用的geoJson值:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "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
          ]
        ]
      }
    }
  ]
}

我的问题是 1.) 如何提取值 geoJson 文件? 2.) 如何将提取的值传递给 table 视图?,当点击 table 视图单元格时,它会执行 segue 并传递相关的坐标索引。

您可以使用此结构来解析您发布的 JSON:

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

并用

之类的东西解析它
guard let jsonUrl = Bundle.main.url(forResource: "newData", withExtension: "geojson") else { return }
guard let jsonData = try? Data(contentsOf: jsonUrl) else { return }
do {
   let geoData = try JSONDecoder().decode(Geodata.self, from: jsonData)
} catch { 
   print("\(error)") 
}