Преобразование одной строки с координатами в массив CLLocationCoordinate2D и использование массива для генерации полигонов в mapView
Я получаю этот 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 координатных объекта в массив для каждого элемента, а затем использовать индексы массива для генерации многоугольника для различных областей.
Может ли кто-нибудь помочь мне с этой проблемой?
2 ответа
Вы можете использовать сопоставление с образцом регулярного выражения. Пояснения в строке:
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://stackru.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)
}
Вот что я придумал. Вы можете адаптировать его под свою структуру.
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)