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

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

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

    我试图提取geoJson值并将其存储到一个数组中,并在tableview中列出值数组,以在mapview中显示路由。 这里我使用Mapbox作为mapview,因为它支持室内导航。现在我可以直接从geoJson文件在mapview中显示路由。但我需要将值提取到数组中,以便在tableview中列出值。

    以下是我尝试提取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)
    }
    

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

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

    2.)如何将提取的值传递给tableview?点击tableview单元格时,它会执行segue,同时也会传递坐标的相关索引。

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

    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)") 
    }