2017-01-14 204 views
2

我用這個項目來產生我的熱圖:iOS的 - 迅速3 - 熱圖

https://github.com/dataminr/DTMHeatmap/issues/1 

從@johndpope:

https://github.com/johndpope/TranSafe 

https://github.com/dataminr/DTMHeatmap 

我綜合了代碼中規定

首先,它編譯成功,但是當我使用像這樣的「readData」:

readData([[52.517138, 13.401489], [52.517137, 13.401488], [52.517136, 13.401487]]) 

我得到的

這裏是方法:

func readData(_ array: [[Double]]){ 
    self.heatmap = DTMHeatmap() 
    var dict = Dictionary<NSObject, AnyObject>(); 
    for entry in array{ 

     let coordinate = CLLocationCoordinate2D(latitude: entry[1], longitude: entry[0]); 

     let mapPoint = MKMapPointForCoordinate(coordinate) 

     let type = NSValue(mkCoordinate: coordinate).objCType // <- THIS IS IT 

     let value = NSValue(bytes: Unmanaged.passUnretained(mapPoint as AnyObject).toOpaque(), objCType: type); 
     dict[value] = 1 as AnyObject?; 

    } 
    self.heatmap.setData(dict as [AnyHashable: Any]); 
    self.mapView.add(self.heatmap) 
} 

func MKMapPointForCoordinate(_ coordinate: CLLocationCoordinate2D) -> MKMapPoint { 

    return MKMapPointForCoordinate(coordinate); 

} 

// etc ... 

我真的不知道我做錯了,任何人都可以幫助我解決這個問題?

+0

'coordinate'看起來像預期的那樣? – shallowThought

+0

請參閱http://stackoverflow.com/questions/32454230/convert-mkmappoint-to-nsvalue-in-swift – Sulthan

+0

座標看起來如預期的那樣? –

回答

2

據我可以從DTMHeatmap的原始代碼中讀取,字典傳遞給setData的密鑰需要爲NSValue s,其中包含MKMapPoint。而你所顯示的代碼並不是一個合適的代碼來製作這樣的NSValue。 (我真的懷疑你會發現實際工作...原來斯威夫特2碼,MKMapView不能在斯威夫特2橋接Objective-C的對象,所以mapPoint as! AnyObject應該總是失敗。)

readData方法應該是這樣的這樣的:

func readData(_ array: [[Double]]){ 
    self.heatmap = DTMHeatmap() 
    var dict: [AnyHashable: Any] = [:] 
    for entry in array{ 

     let coordinate = CLLocationCoordinate2D(latitude: entry[1], longitude: entry[0]); 

     var mapPoint = MKMapPointForCoordinate(coordinate) 

     //Creating `objCType` manually is not recommended, but Swift does not have `@encoding()`... 
     let type = "{MKMapPoint=dd}" 

     let value = NSValue(bytes: &mapPoint, objCType: type) 
     dict[value] = 1 

    } 
    self.heatmap.setData(dict) 
    self.mapView.add(self.heatmap) 
} 

(我還沒有與實際DTMHeatmap檢查,所以你可能需要一些更多的修復)

+0

感謝參與...我更換了代碼,但它仍然沒有繪製地圖..我什至不能猜測這個實現有什麼問題..此外它奇怪,即ios/swift不提供基本的熱圖庫? –

+0

@Creativecrypter,我可以告訴你的一件事是你應該從實際工作的示例代碼開始。你不應該依賴一些代碼,它甚至不能構建一個簡單的'NSValue' ... – OOPer

+0

但是說實話,它是關於「ios上的熱圖」的唯一資源,所以沒有其他的可能性..你認爲怎麼樣? –

0

非常高性能的熱圖庫。我設法得到這個工作,它很好地呈現。我添加了這個答案,因爲它還包括渲染器對於需要工作的疊加委託功能。

class HeatmapViewController: UIViewController, MKMapViewDelegate { 

var heatmap: DTMHeatmap? = nil 
var diffHeatmap: DTMDiffHeatmap? = nil 
@IBOutlet weak var mapView: MKMapView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    var ret: [AnyHashable: Any] = [:] 

    for location in locations { 
     var mapPoint = MKMapPointForCoordinate(location.coordinate) 
     let mapPointValue = NSValue(bytes: &mapPoint, objCType: "{MKMapPoint=dd}") 

     ret[mapPointValue] = 10.0 // weight 
    } 

    self.heatmap = DTMHeatmap() 
    self.heatmap?.setData(ret) 

    self.mapView.delegate = self; // Important 
    self.mapView.add(self.heatmap!) 
    } 
} 

這部分是非常重要的,爲了這個工作,你需要將mapView的委託設置爲self。

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { 
    return DTMHeatmapRenderer(overlay: overlay) 
}