地域と緯度/経度の位置列を含む MySQL テーブルがあります。各エリアには、20.000
など、多くの場所があります。マップ上に均等に分布しているように見える100
など、いくつかだけを選択する方法はありますか?
分散は完璧である必要はありません。クエリ速度の方が重要です。 MySQL を直接使用してこれが不可能な場合は、非常に高速なアルゴリズムを使用して、均等に分散された場所を選択できます。
###前もって感謝します。
編集: コメント内のいくつかのリクエストに答えます。データには何も処理するものはなく、単にエリアと位置の座標だけです。例:
リーリー
特性を持つ列もいくつかありますが、これらはフィルタリングのみに使用されます。
nth行を同時に取得しようとしましたが、少し遅いとはいえ、うまくいったようです
リーリー
Using
random()も使用できますが、少し遅くなります。
編集 2: 郵便番号をフォームに追加するのは簡単であることがわかりました。これで、郵便番号ごとにグループ化すると良い結果が得られそうです。唯一の問題は、非常に大きな領域があり、約 3000 の異なる郵便番号があり、そのうちの 100 個だけを取得すると、多くの郵便番号が 1 か所に表示される可能性があるため、PHP でさらに処理が必要になる可能性があることです。
編集 3、コメント内の @RickJames の質問に答えて、1 か所にまとめます:
「一様分布」を定義してください - 緯度における一様分布ですか?二人は「近い」のではないでしょうか?等。
-
「一様に分布している」というのは言葉の選択としては適切ではありません。地域内のいくつかの場所を表示したいだけですが、すべてを 1 か所にまとめたわけではありません。
「面積」は長方形ですか?六角形?それともゲリマンダリング?
- それらはおおよそ長方形と考えることができますが、それは実際には重要ではありません。重要なことを見逃していました。複数の地域の位置も表示する必要があります。領域は互いに遠く離れている場合もあれば、隣接している場合もあります (ただし、重なり合うことはありません)。この場合、100 個のサンプルをさまざまな地域に配布したいと考えています。
「地域ごとに 100」は固定ですか?あるいは「約100」かもしれない
- 修正されていません。約 100 ですが、見た目が良くない場合は変更できます
テーブルに AUTO_INCRMENT ID はありますか?数字に違いはあるのでしょうか?
- はい、
AUTO_INCRMENT
- ID がありますが、ギャップがある可能性があります
質問は「地域ごとに 100」から「郵便番号ごとに 1」に変更されましたか?
- いいえ、問題は依然として同じです。「各エリアを 100 個表示しますが、すべてを同じ場所に表示するわけではありません」。方法は関係ありません。
出力の合計行数と必要な行数はいくらですか?
- 合計行数はリージョンと規格によって異なりますが、1 リージョンあたり最大 40k です。合計が
1000
- を超える場合は、ランダムな
100
のみを表示します。1000
以下の場合は、すべてを表示できます
クエリを実行するたびに異なる例が必要ですか?
- 同じサンプルでも、異なるサンプルでも (同じ標準でも) OKです。
それは私次第ではありませんが、適切な議論があれば、新しい列を追加できるかもしれません
-
これは、目標を満たす方法です。
「重複」については、2 つの項目が同じ位置にあることを検出する大まかな方法として考えてください:
ごとにグループ化「5」と「3」は、保持する ID を増やす (または減らす) ために上 (または下) に調整できます。緯度/経度の配置により、「5」と「3」は異なります。この比率は、おそらくほとんどの温帯地域に当てはまります。 (赤道近くでは同じ量を使用し、高緯度ではより多くの量を使用します。)
小さな欠陥があります...2 つの非常に近いプロジェクトが、
ROUNDs
によって作成された境界を越える可能性があります。元のテーブルには何行ありますか?上記のクエリは何行生成しましたか? (
SELECT COUNT(*) FROM ( ... ) x;
)