Otrzymuję ten 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"
    }, ...]

Które przechowuję w tym strukturze:

struct RutaItem {
var idZona: Int
var dias: String
var proxDia: String
var hora: String
var coor: String
var zona: String
}

Potem stworzyłem tablicę [rutaitum], gdzie przechowuję struct

var rutaItemArray = [RutaItem]()

Po zapisaniu danych struktury wewnątrz rutaituray wyglądają tak:

[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")...]

Teraz musisz zrobić, aby użyć łańcucha wewnątrz każdego indeksu {x0}}, aby wygenerować mkpolygonobject, więc najpierw musiałbym przekonwertować długi ciąg do 4 obiektów klisackich 2DS i umieścić te 4 obiekty współrzędnych wewnątrz tablicy dla każdego Przedmiot, a następnie użyj indeksów tablicy, aby wygenerować wielokąt.For w różnych obszarach.

Czy ktoś może mi pomóc z tym problemem?

0
Octavio Rojas 17 luty 2017, 01:00

2 odpowiedzi

Najlepsza odpowiedź

Możesz użyć dopasowania wzoru wyrażenia regularnego. Wyjaśnienia 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)
}
2
Martin R 16 luty 2017, 23:10

Oto, z czym wymyśliłem. Możesz dostosować go do swojej struktury.

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)
2
Alexander - Reinstate Monica 17 luty 2017, 05:27