2016-08-18 68 views
1

我是Swift的新手,但我正在嘗試開發我的第一個應用程序。到目前爲止,我想計算我目前的位置和我周圍最近的購物商場之間的距離。商場的位置和名稱都填入JSON文件中。我創建了一個介於0到50公里之間的UISLider,當用戶選擇例如5公里時,應用程序必須顯示距離用戶位置5公里範圍內的所有商場。我的JSON文件是:如何計算我的當前位置和填充在JSON文件中的位置之間的距離

{ 
    "People": { 
      "Person0": { 
      "A1": "New York", 
      "B1": "ShoppingMall2", 
      "C1": "43.0757", 
      "D1": "23.6172" 
        }, 

     "Person1": { 
      "A1": "London", 
      "B1": "ShoppingMall2", 
      "C1": "44.0757", 
      "D1": "24.6172" 
        }, 
"Person2": { 
    "A1": "Paris", 
    "B1": "ShoppingMall3", 
    "C1": "45.0757", 
    "D1": "25.6172" 
}, 
"Person3": { 
    "A1": "Bern", 
    "B1": "ShoppingMall4", 
    "C1": "41.0757", 
    "D1": "21.6172" 
}, 
"Person4": { 
    "A1": "Sofia", 
    "B1": "ShoppingMall4", 
    "C1": "46.0757", 
    "D1": "26.6172" 

    } 
} 
} 

和到目前爲止的代碼是:

import UIKit 
import MapKit 
import CoreLocation 
import SwiftyJSON 

class FirstViewController: UIViewController, CLLocationManagerDelegate { 

@IBOutlet weak var LabelTest: UILabel! 
@IBOutlet weak var Slider: UISlider! 
@IBOutlet weak var LabelValueSlider: UILabel! 
var MySliderCurrentValue = Double() 

var manager = CLLocationManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


@IBAction func SliderChange(sender: UISlider) { 
    let MySliderCurrentValue: String = String(Int(sender.value)) 
    LabelValueSlider.text = MySliderCurrentValue 
} 
@IBAction func LocateMe(sender: AnyObject) { 
    manager.delegate = self 
    manager.desiredAccuracy = kCLLocationAccuracyBest 
    manager.requestWhenInUseAuthorization() 
    manager.startUpdatingLocation() 

} 
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 


    let userlocation: CLLocation = locations[0] as CLLocation 
    manager.stopUpdatingLocation() 
    let location = CLLocationCoordinate2D(latitude: userlocation.coordinate.latitude, longitude: userlocation.coordinate.longitude) 
// let span = MKCoordinateSpanMake(0.5, 0.5) 
    // let region = MKCoordinateRegion(center: location, span: span) 

我還創建了一個表視圖控制器和顯示的所有商場將顯示在表格視圖單元。主要問題是我不知道如何從JSON文件中獲取購物中心的名稱和座標,我不知道如何將它們填充到表格視圖單元格中。我想知道,也許我可以使用準備for segue,但我現在肯定。如果有人能幫我解決這些問題,我會很高興。

+0

的可能的複製[如何來用JSON信息的數組文件和計算距離?](http://stackoverflow.com/questions/39043783/how-to-populate-an-array-w ith-information-from-json-file-and-calculation-distance) – Moritz

回答

0

就好像你的位置是圓的中心,你可以把這種情況下,並嘗試讓你的座標和其他點之間的距離座標使用這種方法

struct Point { 

    var x:Float; 
    var y:Float; 

} 

func getDistanceBetweenPoints(pointOne:Point,pointTwo:Point) ->Float{ 

    let deltaX = (pointOne.x-pointTwo.x)*(pointOne.x-pointTwo.x); 
    let deltay = (pointOne.y-pointTwo.y)*(pointOne.y-pointTwo.y); 
    let distanceSquared = deltaX+deltay; 

    return sqrt(distanceSquared); 
} 

example and formula

希望這有助於你

+0

我想知道更多關於如何填充座標 –

+0

你的意思是將它們解析爲對象還是將位置添加到地圖上的註釋 –

+0

我必須採取名稱和座標,並將它們填充到數組中,該數組將填充表格單元格到表格視圖 –

0

1.從JSON獲取People物品:

使用ObjectMapper

class Person: Mappable { 
    var name: String? 
    var mall: String? 
    var lat: Float? 
    var lon: Float? 
} 

2.獲取數組:

var list: Array<Person> = Mapper<Person>().mapArray(string: json) 

3.獲取的距離:

let meters:CLLocationDistance = mallLocation.distanceFromLocation(mineLocation) 
+0

謝謝,但是我怎樣才能填充數組白色信息。在這種情況下(名稱,商場拉特,lon)我必須將該信息填充到數組中 –

+0

@IvanSosev我用代碼更新了答案以獲取數組 –

相關問題