作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试提取 geoJson 值并将其存储到数组中,并在 TableView 中列出值数组以在 map View 中显示路线。这里我用的是Mapbox for mapview,因为它支持室内导航。现在我可以直接从 geoJson 文件在 map View 中显示路线。但是我需要将值提取到数组中以在 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)
}
对于 TableView ,现在我正在加载静态数据:
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.) 如何将提取的值传递给 tableview?,当点击 tableview 单元格时,它会执行 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)")
}
关于ios - 如何从 geoJson 文件中提取值并将值传递给 iOS swift 中的 tableview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52706649/
我是一名优秀的程序员,十分优秀!