Как нарисовать маркер карты Google в зависимости от другого идентификатора, Swift - PullRequest
0 голосов
/ 11 мая 2018

В моем текущем проекте я получаю ответ от API следующим образом:

[
{
  "current_location" : [
    90.458456400000003,
    23.746056500000002
  ],
  "vehicle_type" : "BIKE",
  "_id" : "5a8fd7e50ed19875687dcf8c"
},
{
  "current_location" : [
    90.3727272,
    23.8216228
  ],
  "vehicle_type" : "BIKE",
  "_id" : "5a97f48edf192f6e54725c78"
},
{
  "current_location" : [
    90.397113300000001,
    23.778111200000001
  ],
  "vehicle_type" : "BIKE",
  "_id" : "5a980243df192f6e54725c85"
},
{
  "current_location" : [
    90.379659399999994,
    23.7221121
  ],
  "vehicle_type" : "BIKE",
  "_id" : "5a9a66586f27706a7a10783a"
},
{
  "current_location" : [
    90.400972899999999,
    23.872647400000002
  ],
  "vehicle_type" : "BIKE",
  "_id" : "5a9fff2e31eb895bc79f7ee0"
 }
]

Теперь я создал класс модели, позже объявил массив этого типа модели в другом ViewController там, где это необходимо.

var nearByFetchedVehicles = [nearByVehicleModel]()

Теперь, как вы можете видеть в ответе, мы получаем _id автомобиля. Когда я перебираю массив nearByFetchedVehicles , я хочу создать маркер карты Google (конечно, будет использоваться какое-то изображение транспортного средства) для каждого _id . Когда мы снова вызываем функцию, скажем, через пять секунд, я хочу проверить, существует ли этот _id , если он существует, я проверю широту и долготу и переместу маркер соответственно, у меня есть функции перемещения уже. Эта функция будет вызываться каждые пять секунд, поэтому необходимо постоянно проверять, какой _id исчез, а какой _id является новым. Если исчезнет какой-либо _id , который был ранее, маркер будет удален, если будет создан новый доступный _id новый маркер. Мне нужна помощь, чтобы создать маркер и удалить его в отношении _id .

 if let fetchedVehicle = result.value {

            if fetchedVehicle.isEmpty {
                print("No vehicle nearby")
            }

            self.nearByFetchedVehicles = fetchedVehicle
            print("nearByFetchedVehicles are:\(self.nearByFetchedVehicles)")
            self.mapView?.clear()

            for i in self.nearByFetchedVehicles  {

                // Need to create or delete marker here

                self.nearbyVehicleMovement(lat: i.lat!, lon: i.lon!, vehicleType: i.vehicleType!, vehicleID: i.vehicleID!)
            }

        }

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Два способа:

  1. Каждый раз, когда вы получаете ответ от сервера, очищайте mapView, используя mapView.clear().Затем нанесите маркеры снова.
  2. Назначьте _id в качестве пользовательских данных для каждого производителя, как marker.userData = _id.Сохраните маркеры в массиве и цикле через markerArray.Проверьте, присутствуют ли маркеры _id в массиве с сервера.Если его нет, удалите маркер, как marker.map = nil.В противном случае измените местоположение маркера, используя

    marker.position = CLLocationCoordinate2D.init(latitude: <#T##CLLocationDegrees#>, longitude: <#T##CLLocationDegrees#>)
    

Если _id в маркере не соответствует ни одной из userData * 1018 маркера, то создайтеновый маркер как:

let marker = GMSMarker.init(position: currentLocation)
marker.map = mapView
marker.userData = nearByFetchedVehicles[i]

Надеюсь, это поможет вам.

0 голосов
/ 15 мая 2018

Я бы предложил использовать Set вместо Array.У него есть метод go substracting, который легко обрабатывает ваши данные.

//: Playground - noun: a place where people can play

import UIKit

var previousStr = """
[
{
"current_location" : [
90.458456400000003,
23.746056500000002
],
"vehicle_type" : "BIKE",
"_id" : "5a8fd7e50ed19875687dcf8c"
},
{
"current_location" : [
90.3727272,
23.8216228
],
"vehicle_type" : "BIKE",
"_id" : "5a97f48edf192f6e54725c78"
},
{
"current_location" : [
90.397113300000001,
23.778111200000001
],
"vehicle_type" : "BIKE",
"_id" : "5a980243df192f6e54725c85"
},
{
"current_location" : [
90.379659399999994,
23.7221121
],
"vehicle_type" : "BIKE",
"_id" : "5a9a66586f27706a7a10783a"
},
{
"current_location" : [
90.400972899999999,
23.872647400000002
],
"vehicle_type" : "BIKE",
"_id" : "5a9fff2e31eb895bc79f7ee0"
}
]
"""

var str = """
[
{
"current_location" : [
90.458456400000003,
23.746056500000002
],
"vehicle_type" : "BIKE",
"_id" : "5a8fd7e50ed19875687dcf8c"
},
{
"current_location" : [
90.3727272,
23.8216228
],
"vehicle_type" : "BIKE",
"_id" : "5a97f48edf192f6e54725c78"
},
{
"current_location" : [
90.397113300000001,
23.778111200000001
],
"vehicle_type" : "BIKE",
"_id" : "5a980243df192f6e54725c85"
},
{
"current_location" : [
90.379659399999994,
23.7221121
],
"vehicle_type" : "BIKE",
"_id" : "5a9a66586f27706a7a10783a"
},
{
"current_location" : [
90.400972899999999,
23.872647400000002
],
"vehicle_type" : "BIKE",
"_id" : "5a9fff2e31eb895bc79f7ee0"
}
]
"""

struct Vehicle: Decodable, Hashable {
    let current_location: [Double]
    let vehicle_type: String
    let _id: String

    var hashValue: Int {
        return _id.hashValue
    }
}
let array: [Vehicle] = try! JSONDecoder().decode([Vehicle].self, from: str.data(using: .utf8)!)
let set = Set<Vehicle>(array)

let previousArray: [Vehicle] = try! JSONDecoder().decode([Vehicle].self, from: previousStr.data(using: .utf8)!)
let previousSet = Set<Vehicle>(previousArray)

print(previousSet)

let added = set.subtracting(previousSet)
let lost = previousSet.subtracting(set)

print(added)
print(lost)

Возвращает это:

[__lldb_expr_63.Vehicle (current_location: [90.3727272, 23.8216228], vehicle_type): "ВЕЛОСИПЕД", _id: "5a97f48edf192f6e54725c78"), __lldb_expr_63.Vehicle (CURRENT_LOCATION: [+90,397113300000001, +23,778111200000001], vehicle_type: "ВЕЛОСИПЕД", _id: "5a980243df192f6e54725c85"), __lldb_expr_63.Vehicle (CURRENT_LOCATION: [90,379659399999994, 23,7221121], vehicle_type: "ВЕЛОСИПЕД", _id: "5a9a66586f27706a7a10783a"), __lldb_expr_63.Vehicle (CURRENT_LOCATION: [+90,400972899999999, +23,872647400000002], vehicle_type: "ВЕЛОСИПЕД", _id: "5a9fff2e31eb895bc79f7ee0"), __lldb_expr_63.Vehicle (CURRENT_LOCATION: [90,458456400000003, +23,746056500000002], vehicle_type: "BIKE", _id: "5a8fd7e50ed19875687dcf8c")] добавлено >>>>> [__lldb_expr_63.Vehicle (current_location: [90.400972899999999, 23.872647400000002], тип транспортного средства: "BIKE", _ff2ef0b5b5a5 )5 )5 )5 )5):__lldb_expr_63.Vehicle (current_location: [90.400972899999999, 23.872647400000002], тип_транспорта: "BIKE", _id: "5a9fff2e31eb895bc79f7ee0")]

В вашем случае вы можете легко сохранять предыдущие данные, используя let previousSet = set.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...