0

オブジェクトをParse.com使用してポイントを保存する次のメソッドがあります。PFGeoPoint

以下を使用してそれらをキャプチャします。

func convertPoint(touch: UITouch) {
    let location = touch.locationInView(self.mapView) as CGPoint
    let coordinate: CLLocationCoordinate2D = self.mapView.convertPoint(location, toCoordinateFromView: self.mapView)
    self.coordinates.addObject(NSValue(MKCoordinate: coordinate))
}

次に、以下を使用してそれらを Parse に追加します。

func addPolygonToMap() {
    let HUD: MBProgressHUD = showActivityIndicator(true, self.view)

    var numberOfPoints: NSInteger = self.coordinates.count

    if (numberOfPoints > 4) {
        var points: [CLLocationCoordinate2D] = []

        // Save to Parse object.
        var geofenceUserObject = PFObject(className: "GeofenceUser")
        let geofenceId = self.generateUUID()
        geofenceUserObject["UserId"] = "IjlpQHwyfG"
        geofenceUserObject["GeofenceId"] = geofenceId

        geofenceUserObject.saveInBackgroundWithBlock({ (succeeded: Bool, error: NSError!) in
            if (error != nil) {
                println("Error saving: \(error)")
            } else if (succeeded) {
                for i in 0..<numberOfPoints {
                    let coordinateValue = self.coordinates[i].MKCoordinateValue

                    points.insert(coordinateValue, atIndex: i)

                    var geoPoint = PFGeoPoint(latitude: coordinateValue.latitude, longitude: coordinateValue.longitude)
                    var geofenceObject = PFObject(className: "GeofenceCoordinates")

                    geofenceObject["Point"] = geoPoint
                    geofenceObject["GeofenceId"] = geofenceId

                    geofenceObject.saveInBackgroundWithBlock({ (operation, error) in
                        println("Saved Geofence objects: \(operation)")

                        println("Points: \(numberOfPoints)")
                        println("Index: \(i+1)")

                        if (i+1 == numberOfPoints) {
                            self.polygon = MKPolygon(coordinates: &points, count: numberOfPoints)
                            self.mapView.addOverlay(self.polygon)

                            self.isDrawingPolygon = false
                            self.createDrawButton("DRAW", color: UIColor(red: 11/255, green: 188/255, blue: 185/255, alpha: 1))
                            self.canvasView.image = nil
                            self.canvasView.removeFromSuperview()

                            HUD.hide(true)
                        }
                    })
                }
            }
        })
    }
}

これは作成される例MKpolygonです (約 319 ポイント):

ここに画像の説明を入力

これは、ポイントをマップに追加するために使用している方法です。

var query = PFQuery(className: "GeofenceCoordinates")
query.orderByAscending("createdAt")
query.whereKey("GeofenceId", equalTo: geofenceId)

query.findObjectsInBackgroundWithBlock({ (objects, error) in
    if let objects = objects as? [PFObject] {
        var coordinates: Array<CLLocationCoordinate2D> = []

        for point in objects {
            if let coordinate = point.objectForKey("Point") as? PFGeoPoint {
                let c = CLLocationCoordinate2D(latitude: coordinate.latitude, longitude: coordinate.longitude)
                coordinates.append(c)
            }
        }

        let polygon = MKPolygon(coordinates: &coordinates, count: coordinates.count)
        self.mapView.addOverlay(polygon)
    }
})

問題は、これらのポイントを Parse から取得すると、MKPolygon代わりに次のようになることです。かなりの数のポイントが欠落しており、不完全に見えます。

それがデータを永続化する方法なのか、データを取得する方法なのかはよくわかりません。

ここに画像の説明を入力

4

1 に答える 1

0

では、座標データを に保存する方法を完全にリファクタリングしましたParse

列をArraya ではなくan に変更しましGeoPointた。

  1. 約 300% 高速に保存します。
  2. すべての座標を適切に取得します。
于 2015-03-07T04:42:23.743 に答える