2017-01-14 44 views
2

私は私のヒートマップを生成するには、このプロジェクトを使用しています:@johndpopeからiOSの - SWIFT 3 - ヒートマップ

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

:で述べたように

https://github.com/dataminr/DTMHeatmap 

私は、コードを統合

https://github.com/johndpope/TranSafe 

まず、正常にコンパイルされますが、このような "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に渡された辞書のキーは、MKMapPointを含むNSValue Sである必要があります。あなたが示したコードは、そのようなコードを作るのに適切ではありません。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、私があなたにアドバイスできることの1つは、実際に動作するサンプルコードから始めなければならないということです。あなたは単純な 'NSValue'を構築することができないコードに頼るべきではありません... – OOPer

+0

正直言って、"ヒートマップ "に関する唯一のリソースなので、他の可能性はありません。どう思いますか? –

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) 
}