iOS - 衡量距离的最佳方法

时间:2017-06-16 12:38:10

标签: ios swift mapkit cllocationmanager concept

我目前正在开展一个项目,我需要用户告诉在哪里(在真实世界的地图上)建造一堵墙。

问题:您认为(您认为)最准确的方式是让用户显示(/告诉)放置墙的位置?

创意1 我考虑过在地图上绘画,但那不会那么准确。

创意2 我想到的另一件事是,用户应将手机放在墙的开头和末尾。以这种方式,应用程序可以使用CLLocationManager打印地图上的位置,并测量两端之间的距离。

这是我尝试过的代码,但它根本不是那么准确。

let locationManager = CLLocationManager()

var location1: CLLocation = CLLocation()
var location2: CLLocation = CLLocation()

override func viewDidLoad() {
    super.viewDidLoad()
    setup()
}

func setup() {
        resett.isHidden = true

        // Ask for Authorisation from the User.
        self.locationManager.requestAlwaysAuthorization()

        // For use in foreground
        self.locationManager.requestWhenInUseAuthorization()

        if CLLocationManager.locationServicesEnabled() {
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
            locationManager.activityType = .fitness
            locationManager.startUpdatingLocation()
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let locValue:CLLocationCoordinate2D = manager.location!.coordinate
        currentCord.text = "\(locValue.latitude) \(locValue.longitude)"
    }

    func measure(cord1: CLLocation, cord2: CLLocation) -> Float {
        let distanceInMeters = cord1.distance(from: cord2) //result is in meters
        return Float(distanceInMeters)
    }

    func calculateCoordinates(status: Int) {
        let coordinate = calculate()

        if status == 1 {
            location2 = coordinate

            let measured = measure(cord1: location1, cord2: location2)
            print("\(measured) m")
            displayLabel.text = "\(measured)m"
            resett.isHidden = false
        } else {
            location1 = coordinate
        }
    }

    func calculate() -> CLLocation {
        let locValue:CLLocationCoordinate2D = locationManager.location!.coordinate
        let coordinate = CLLocation(latitude: locValue.latitude, longitude: locValue.longitude)

        return coordinate
    }

    @IBAction func FirstAction(_ sender: Any) {
        button1.setTitle("Klar", for: .normal)
        calculateCoordinates(status: 0)
    }

    @IBAction func SecondAction(_ sender: Any) {
        button2.setTitle("Klar", for: .normal)
        calculateCoordinates(status: 1)
    }

提前致谢!

2 个答案:

答案 0 :(得分:0)

假设你的意思是一个现实世界的“墙”,维度为厘米到几米,iPhone GPS的位置实际上不适合这种测量,是良好覆盖区域的典型最小误差 5米

如果明确地询问地理坐标(具有非常高的准确性)是不可行的: 我宁愿明确询问用户尺寸,然后在地图上拖动对象(墙),在接近可能的最终位置时尽可能地进行缩放。

PS:无论如何,可以进行许多优化以提高CLLocationManager的准确性,首先使用低accuracy过滤掉结果并手动远离.hide的结果.show。 3}}收到后的问题。

答案 1 :(得分:0)

不幸的答案是iPhone上的GPS不是很准确。如果你能在一个32米半径的圆圈内得到一个准确的位置,你就会做得很好,而且它在一个开阔的区域,天空清晰,没有无线电干扰。如果事情不太理想,那么结果就不那么准确了。

(Apple报告"水平准确度"读取GPS定位结果实际上是误差范围的半径。)

出于建造墙壁的目的,32米根本不够好,iPhone中的GPS无法可靠地做得更好。你真的需要测量设备。