Skip to content

Commit

Permalink
Merge pull request #74 from Woosmap/fix/isochrone
Browse files Browse the repository at this point in the history
Check identifier Region isochrone already exist, fix update region if…
  • Loading branch information
Llumbroso authored Mar 17, 2022
2 parents 3ee5b5c + 269d217 commit f6b2328
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 55 deletions.
12 changes: 9 additions & 3 deletions Sample/View/MapViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -233,12 +233,18 @@ class MapViewController: UIViewController, MKMapViewDelegate {
let radius = textField!.text!

if(textField!.text!.contains("s")) {
let (_, _) = WoosmapGeofencing.shared.locationService.addRegion(identifier: region_identifer, center: coordinate, radius: Int(radius)!, type: "isochrone")
let durationRadius = radius.replacingOccurrences(of: "s", with: "")
let (regionIsCreated, state) = WoosmapGeofencing.shared.locationService.addRegion(identifier: region_identifer, center: coordinate, radius: Int(durationRadius)!, type: "isochrone")
if !regionIsCreated {
let alert = UIAlertController(title: "Region Identifier illegal", message: state, preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
self.initMap()
} else {
let (regionIsCreated, _) = WoosmapGeofencing.shared.locationService.addRegion(identifier: region_identifer, center: coordinate, radius: Int(radius)!, type: "circle")
let (regionIsCreated, state) = WoosmapGeofencing.shared.locationService.addRegion(identifier: region_identifer, center: coordinate, radius: Int(radius)!, type: "circle")
if !regionIsCreated {
let alert = UIAlertController(title: "Region Limit creation", message: "You can't create more than 20 regions", preferredStyle: UIAlertController.Style.alert)
let alert = UIAlertController(title: "Region Limit creation", message: state, preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ public class Distance: Object {
@objc public dynamic var mode: String?
@objc public dynamic var units: String?
@objc public dynamic var routing: String?
@objc public dynamic var status: String?


convenience public init(originLatitude: Double, originLongitude: Double, destinationLatitude: Double, destinationLongitude: Double,dateCaptured: Date, distance: Int, duration: Int, mode: String, units: String, routing: String) {
convenience public init(originLatitude: Double, originLongitude: Double, destinationLatitude: Double, destinationLongitude: Double,dateCaptured: Date, distance: Int, duration: Int, mode: String, units: String, routing: String, status: String) {
self.init()
self.originLatitude = originLatitude
self.originLongitude = originLongitude
Expand All @@ -35,6 +36,7 @@ public class Distance: Object {
self.mode = mode
self.units = units
self.routing = routing
self.status = status
}

}
Expand All @@ -56,7 +58,7 @@ public class Distances {
for row in jsonStructure.rows! {
var indexElement = 0
for element in row.elements! {
if(element.status == "OK") {
// if(element.status == "OK") {
let distance = Distance()
distance.units = distanceUnits.rawValue
distance.date = Date()
Expand All @@ -68,24 +70,24 @@ public class Distances {
distance.destinationLatitude = dest.0
distance.destinationLongitude = dest.1
let distanceValue = element.distance?.value
let distanceText = element.distance?.text!
let distanceText = element.distance?.text
var durationValue = 0
var durationText = ""
if(distanceProvider == DistanceProvider.woosmapTraffic) {
durationValue = element.duration_with_traffic?.value! ?? 0
durationText = element.duration_with_traffic?.text! ?? ""
durationValue = element.duration_with_traffic?.value ?? 0
durationText = element.duration_with_traffic?.text ?? ""
} else {
durationValue = element.duration?.value! ?? 0
durationText = element.duration?.text! ?? ""
durationValue = element.duration?.value ?? 0
durationText = element.duration?.text ?? ""
}
if distanceValue != nil && durationValue != 0 {
distance.distance = distanceValue ?? 0
distance.distanceText = distanceText
distance.duration = durationValue
distance.durationText = durationText
distanceArray.append(distance)
}
}

distance.distance = distanceValue ?? 0
distance.distanceText = distanceText
distance.duration = durationValue
distance.durationText = durationText
distance.status = element.status
distanceArray.append(distance)
//}
indexElement+=1
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ public class RegionIsochrones {
let realm = try Realm()
realm.beginWrite()
regionToUpdate!.distance = distanceInfo.distance
regionToUpdate!.distanceText = distanceInfo.distanceText!
regionToUpdate!.distanceText = distanceInfo.distanceText ?? ""
regionToUpdate!.duration = distanceInfo.duration
regionToUpdate!.durationText = distanceInfo.durationText!
regionToUpdate!.durationText = distanceInfo.durationText ?? ""
regionToUpdate!.didEnter = didEnter
regionToUpdate!.date = Date()
realm.add(regionToUpdate!)
Expand Down
98 changes: 64 additions & 34 deletions WoosmapGeofencing/Sources/WoosmapGeofencing/Monitor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -231,16 +231,16 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
self.handleRegionChange()
}

public func addRegion(identifier: String, center: CLLocationCoordinate2D, radius: CLLocationDistance) -> (isCreate: Bool, identifier: String) {
guard let monitoredRegions = locationManager?.monitoredRegions else { return (false, "") }
public func addRegion(identifier: String, center: CLLocationCoordinate2D, radius: CLLocationDistance) -> Bool {
guard let monitoredRegions = locationManager?.monitoredRegions else { return false }

if (monitoredRegions.count < 20) {
let id = RegionType.custom.rawValue + "<id>" + identifier
self.locationManager?.startMonitoring(for: CLCircularRegion(center: center, radius: radius, identifier: id ))
checkIfUserIsInRegion(region: CLCircularRegion(center: center, radius: radius, identifier: id ))
return (true, RegionType.custom.rawValue + "<id>" + identifier)
return true
} else {
return (false, "")
return false
}
}

Expand All @@ -254,18 +254,34 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
}
}

public func addRegion(identifier: String, center: CLLocationCoordinate2D, radius: Int, type: String) -> (isCreate: Bool, identifier: String){
public func addRegion(identifier: String, center: CLLocationCoordinate2D, radius: Int, type: String) -> (isCreate: Bool, state: String){
if(type == "isochrone"){
addRegionIsochrone(identifier: identifier, center: center, radius: radius)
return (true, identifier)
let regionIsCreated = addRegionIsochrone(identifier: identifier, center: center, radius: radius)
var state = ""
if(regionIsCreated) {
state = "The region is created"
} else {
state = "Identifier already exist"
}
return (regionIsCreated, state)
} else if(type == "circle"){
let (regionIsCreated, identifier) = addRegion(identifier: identifier, center: center, radius: Double(radius))
return (regionIsCreated, identifier)
let regionIsCreated = addRegion(identifier: identifier, center: center, radius: Double(radius))
var state = ""
if(regionIsCreated) {
state = "The region is created"
} else {
state = "You can't create more than 20 regions"
}
return (regionIsCreated, state)
}
return (false, "")
return (false, "the type is incorrect")
}

public func addRegionIsochrone(identifier: String, center: CLLocationCoordinate2D, radius: Int) {
public func addRegionIsochrone(identifier: String, center: CLLocationCoordinate2D, radius: Int) -> Bool {
if (RegionIsochrones.getRegionFromId(id: identifier) != nil) {
return false
}

let regionIso = RegionIsochrone()
regionIso.identifier = identifier
regionIso.date = Date()
Expand All @@ -277,6 +293,8 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
if self.currentLocation != nil {
calculateDistanceWithRegion(location: self.currentLocation!)
}

return true
}

public func removeRegionIsochrone(identifier: String) {
Expand Down Expand Up @@ -541,11 +559,11 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
let userLatitude: String = String(format: "%f", locationOrigin.coordinate.latitude)
let userLongitude: String = String(format: "%f", locationOrigin.coordinate.longitude)
var coordinateDestinations = ""
for coordinate in coordinatesDest {
let destLatitude: String = String(format: "%f", Double(coordinate.0))
let destLongitude: String = String(format: "%f", Double(coordinate.1))
for i in 0 ..< coordinatesDest.count {
let destLatitude: String = String(format: "%f", Double(coordinatesDest[i].0))
let destLongitude: String = String(format: "%f", Double(coordinatesDest[i].1))
coordinateDestinations += destLatitude + "," + destLongitude
if coordinatesDest.last! != coordinate {
if i != coordinatesDest.count-1 {
coordinateDestinations += "|"
}
}
Expand Down Expand Up @@ -580,6 +598,13 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
distanceLanguage: distanceLanguage,
trafficDistanceRouting: trafficDistanceRouting)


if (regionIsochroneToUpdate) {
self.updateRegionWithDistance(distanceAr: distance)
}

delegateDistance.distanceAPIResponse(distance: distance)

if(locationId != "" && !distance.isEmpty) {
guard let delegateSearch = self.searchAPIDataDelegate else {
return
Expand All @@ -592,12 +617,6 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
delegateSearch.searchAPIResponse(poi: poiUpdated)
}
}

if (regionIsochroneToUpdate) {
self.updateRegionWithDistance(distanceAr: distance)
}

delegateDistance.distanceAPIResponse(distance: distance)
}
}
}
Expand All @@ -606,28 +625,39 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
}

public func updateRegionWithDistance(distanceAr: [Distance]) {
var regionIsoTodelete:[String] = []
for regionIso in RegionIsochrones.getAll() {
for distance in distanceAr {
if(distance.destinationLatitude == regionIso.latitude && distance.destinationLongitude == regionIso.longitude) {
var didEnter = regionIso.didEnter
let lastStatedidEnter = regionIso.didEnter
if(distance.duration <= regionIso.radius) {
if(regionIso.didEnter == false) {
didEnter = true

if(distance.status != "OK"){
print("Respone status = " + (distance.status ?? "NOK") + " Region Isochrone " + regionIso.identifier! + " is delete")
regionIsoTodelete.append(regionIso.identifier!)
}else {
var didEnter = regionIso.didEnter
let lastStatedidEnter = regionIso.didEnter
if(distance.duration <= regionIso.radius) {
if(regionIso.didEnter == false) {
didEnter = true

}
} else {
if(regionIso.didEnter == true) {
didEnter = false
}
}
} else {
if(regionIso.didEnter == true) {
didEnter = false
let regionUpdated = RegionIsochrones.updateRegion(id: regionIso.identifier!, didEnter: didEnter, distanceInfo: distance)
if(regionUpdated.didEnter != lastStatedidEnter) {
didEventRegionIsochrone(regionIsochrone: regionUpdated)
}
}
let regionUpdated = RegionIsochrones.updateRegion(id: regionIso.identifier!, didEnter: didEnter, distanceInfo: distance)
if(regionUpdated.didEnter != lastStatedidEnter) {
didEventRegionIsochrone(regionIsochrone: regionUpdated)
}
}
}
}

for regionIsoIdentifer in regionIsoTodelete {
RegionIsochrones.removeRegionIsochrone(id: regionIsoIdentifer)
}

}

public func didEventRegionIsochrone(regionIsochrone: RegionIsochrone) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import RealmSwift
}

private func initRealm() {
Realm.Configuration.defaultConfiguration = Realm.Configuration(schemaVersion: 4)
Realm.Configuration.defaultConfiguration = Realm.Configuration(schemaVersion: 5)
}

public func getLocationService() -> LocationService {
Expand Down

0 comments on commit f6b2328

Please sign in to comment.