私はMySQLテーブルを持っています
- (1億)アメリカの場所の緯度/経度座標
- その場所から半径1平方マイル以内に住んでいる人の数
質問:ヒートマップを生成してGoogleマップまたはOpenstreetmapにオーバーレイした後、半径1平方マイルの人々の数は、マウスカーソルが置かれているマップ上の任意のポイントで決定する必要があります。(隣接するデータポイントを使用した単純な平均化を使用できます)
このようなヒートマップをどのように生成しますか?Mapreduceの使用をお勧めしますか?
最初の考え
ヒートマップはサーバーサイドで事前にレンダリングする必要があります
必要なすべてのポイントをブラウザにダウンロードしてからヒートマップクライアント側を生成すると、問題が発生する可能性があります。データベースから多数の座標を取得し(データベースの負荷が高い)、ブラウザに転送する必要があります(大きなデータセット)。さらに、ブラウザで処理する必要があります。ヒートマップを生成するための多数のポイント。これは非常に遅いので、ヒートマップサーバーサイドを事前にレンダリングし、ヒートマップタイルを取得してマップ上でオーバーラップさせる必要があると思います。
より良い代替案:サーバーサイドを処理し、クライアントサイドをレンダリングする
ヒートマップサーバー側を完全にレンダリングして画像タイルを提供する代わりに、近くにあるポイントを単一のポイントと重み/バイアスにクラスタリングすることでデータを単純化し、単純化されたポイントデータのこれらの小さなデータセットを(JSON経由で)に送信できます。ヒートマップのクライアント側レンダリング用のブラウザー(heatmapjsを使用)。画像タイルの代わりにlat/lngポイントを送信すると、アプリケーション/Webサイトの応答性が向上します。
これにより、Javscriptから直接ヒートマップ強度値を読み取り、Javascript / jQueryにホバーポップアップボックス(上の画像を参照)を実装することもできます。代わりにヒートマップタイルをブラウザに送信した場合、これを行う方法がわかりません。
マップ/リデュース?
おそらく、ジョブ(1億のデータポイントを処理する)をより小さなチャンクに分割し、複数のノードにまたがるヒートマップを生成する必要があります。これは月に1回行われます。複数のノードでヒートマップを生成することで、以前は使用したことがありませんが、mapreduceとhadoopについて考えるようになります。
既存のソリューション
gheatはオンデマンドでヒートマップを生成するため、目的には遅すぎます。ただし、事前にレンダリングするヒートマップタイル用のタイルサーバーが必要です。OSMタイルサーバーを使用できる可能性があります。