将带有坐标的单个字符串转换为 CLLocationCoordinate2D 数组,并使用该数组在 mapView 中生成多边形
Posted
技术标签:
【中文标题】将带有坐标的单个字符串转换为 CLLocationCoordinate2D 数组,并使用该数组在 mapView 中生成多边形【英文标题】:Converting a single string with coordinates into an array of CLLocationCoordinate2D and use the array to generate Polygons in a mapView 【发布时间】:2017-02-16 22:00:33 【问题描述】:我正在接收这个 JSON:
JSON:
"status_code" : 200,
"status" : "ok",
"data" : [
"zona" : "Narvarte",
"hora" : "",
"id_zona" : 1423,
"proxdia" : "Lunes 20 de Febrero, 2017",
"coor" : "(19.452187074041884, -99.1457748413086),(19.443769985032485, -99.14852142333984),(19.443446242121073, -99.13787841796875),(19.450244707639662, -99.13822174072266)",
"dias" : "Lunes"
, ...]
我存储在这个结构中:
struct RutaItem
var idZona: Int
var dias: String
var proxDia: String
var hora: String
var coor: String
var zona: String
然后我创建了一个 [RutaItem] 数组,用于存储结构
var rutaItemArray = [RutaItem]()
数据存储后,rutaItemArray 中的结构如下所示:
[pixan.RutaItem(idZona: 1423, dias: "Lunes", proxDia: "Lunes 20 de Febrero, 2017", hora: "", coor: "(19.452187074041884, -99.1457748413086),(19.443769985032485, -99.14852142333984),(19.443446242121073, -99.13787841796875),(19.450244707639662, -99.13822174072266)", zona: "Narvarte")...]
我现在需要做的是使用rutaItemArray.coor
的每个索引内的字符串来生成一个MKPolygonObject,所以首先我需要将长字符串转换为4个CLLocationCoordinate2D对象并将这4个坐标对象放入一个数组中每个项目,然后使用数组索引为不同的区域生成多边形。
有人可以帮我解决这个问题吗?
【问题讨论】:
"coor"
数组从何而来?它应该是一个包含双精度对象的 json 数组,而不是这样的字符串
应该,但它没有,而且我不是 web 服务的程序员,我只是 ios 开发人员,不幸的是我必须使用我所拥有的东西。如果 android 开发者可以做到,那么在 iOS 中当然也可以。
【参考方案1】:
您可以使用正则表达式模式匹配。 内联解释:
let coordString = "(19.452187074041884, -99.1457748413086), (19.443769985032485, -99.14852142333984),(19.443446242121073, -99.13787841796875),(19.450244707639662, -99.13822174072266)"
// Regular expression pattern for "( ... , ... )"
let pattern = "\\((.+?),(.+?)\\)"
let regex = try! NSRegularExpression(pattern: pattern)
// We need an NSString, compare http://***.com/a/27880748/1187415
let nsString = coordString as NSString
// Enumerate all matches and create an array:
let coords = regex.matches(in: coordString, range: NSRange(location: 0, length: nsString.length))
.flatMap match -> CLLocationCoordinate2D? in
// This closure is called for each match.
// Extract x and y coordinate from match, remove leading and trailing whitespace:
let xString = nsString.substring(with: match.rangeAt(1)).trimmingCharacters(in: .whitespaces)
let yString = nsString.substring(with: match.rangeAt(2)).trimmingCharacters(in: .whitespaces)
// Convert to floating point numbers, skip invalid entries:
guard let x = Double(xString), let y = Double(yString) else return nil
// Return CLLocationCoordinate2D:
return CLLocationCoordinate2D(latitude: x, longitude: y)
【讨论】:
这个解决方案效果非常好!这正是我一直在寻找的,但我对正则表达式不是很好,我几乎失去了一天的时间,试图想出一个能做到这一点的正则表达式!!非常感谢!【参考方案2】:这就是我想出的。您可以对其进行调整以适应您的结构。
import Foundation
let input = "(19.452187074041884, -99.1457748413086),(19.443769985032485, -99.14852142333984),(19.443446242121073, -99.13787841796875),(19.450244707639662, -99.13822174072266)"
// Remove leading `(` and trailing `)`
let trimmedInput = String(input.characters.dropLast().dropFirst())
let coordStrings = trimmedInput.components(separatedBy: "),(")
let coords: [CLLocationCoordinate2D] = coordStrings.map coordsString in
let coords = coordsString.components(separatedBy: ", ")
precondition(coords.count == 2, "There should be exactly 2 coords.")
guard let lat = Double(coords[0]),
let long = Double(coords[1]) else
fatalError("One of the coords isn't a valid Double: \(coords)")
return CLLocationCoordinate2D(latitude: lat, longitude: long)
print(coords)
【讨论】:
我必须承认在大多数情况下我不是components(separatedBy:)
的粉丝。如果 Web 服务开发人员决定在坐标对 ), (
之间插入空格或删除 x 和 y 坐标之间的空格,那么您必须调整代码。
@Alexander 从你的回答中我学到了很多,感谢分享知识!
@MartinR 虽然我想NSScanner
也是一个选项。
@MartinR 你删除了我的评论吗? D:
@Alexander:不,哪个评论?以上是关于将带有坐标的单个字符串转换为 CLLocationCoordinate2D 数组,并使用该数组在 mapView 中生成多边形的主要内容,如果未能解决你的问题,请参考以下文章
如何将位置:[CLLocation] 转换为 Coordinate2D?
在 Swift 中将 CLLocation 转换为 MKMapItem