2017-02-16 17 views
0

Я получаю этот JSON:Преобразование одной строки с координатами в массив CLLocationCoordinate2D и использовать массив для создания многоугольников в MAPview

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 координатных объекта внутри массива для каждого элемента, а затем используйте индексы массива для генерации многоугольника для разных областей.

Может ли кто-нибудь помочь мне с этой проблемой?

+0

Откуда берется массив '' coor ''? Это должен быть массив json объектов, содержащий двойники, а не строку вроде этого – Alexander

+0

, но это не так, но это не так, и я не программист веб-сервисов, я просто разработчик iOS, и мне нужно работать с тем, что я к сожалению. Если разработчик Android может это сделать, это, безусловно, возможно и в iOS. –

ответ

2

Вы можете использовать шаблон регулярного выражения. Пояснения inline:

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://stackoverflow.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) 
} 
+0

Это решение работает удивительно хорошо! Это именно то, что я искал потому что, но я не очень хорош с регулярными выражениями, которые я потерял почти целый день, пытаясь придумать регулярное выражение, которое сделало именно это! Большое вам спасибо! –

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) 
+1

Я должен признать, что я не являюсь поклонником 'components (separateBy:)' в большинстве случаев. Если разработчик веб-службы решает вставить пробелы между координатными парами '), (или удаляет пространство между координатами x и y, тогда вам нужно адаптировать код. –

+0

@ Alexander Я многому научился с вашим ответом, спасибо, что поделился Знание! –

+1

@MartinR Хотя я полагаю, что «NSScanner» тоже вариант. – Alexander

 Смежные вопросы

  • Нет связанных вопросов^_^