さらなる最適化:
バウンディングボックスのアイデアは良いです。ポイントがバウンディングボックス内にあるかどうかのチェックは非常に高速です。
それでも速度が必要な場合は、次のように事前計算を行うことができます。
- 各polgonに対して、バウンディングボックスを作成します。
- マップをカバーする同じサイズの「タイル」を定義します。
- タイルごとに、重なるポリゴンのリストを作成します。これを行うには、最初にバウンディングボックスがタイルと重なっているかどうかを確認します。含まれている場合は、ポリゴンがタイルと重なっているかどうかを確認します。
検索するときは、次のようにします。
- あなたがいるタイルを決定します。それは速い操作です。
- これで、潜在的なポリゴンのリストができました。
- ポリゴンごとに、ポイントがバウンディングボックス内にあるかどうかを確認します。
そうである場合は、前述のより高価なアルゴリズムを使用して、ポイントがポリゴン内にあるかどうかを確認します。
私はこのアルゴリズムを数回使用しましたが、非常に高速です。タイルサイズを変更することで、メモリフットプリントとパフォーマンスの適切なバランスを選択できます。
極端な場合を考えてみてください。
マップ全体をカバーする1つの巨大なタイル:マップ
内のすべての要素の1つのリストを取得し、すべての境界ボックスをチェックする必要があります。
非常に小さなタイル(国ごとにポリゴンしかないマップの場合は1x1 m):
大量のタイルを取得します。すべてのポリゴンは多くのタイルに分割され、各タイルには1つのポリゴンしかありません。ただし、ポイントが(高速で)どのタイルにあるかがわかれば、チェックする必要のあるポリゴンが1つしかないことはほぼ100%確実です。
あなたはその中間にいる必要があります。これがたまにしか必要ない場合は、パフォーマンスよりもメモリフットプリントを低くすることをお勧めします。最適なタイルサイズは、ポリゴンサイズの均一性にも依存します。したがって、最適なタイルサイズを自動的に計算する方法はなく、正しくなるまで少し調整する必要があります。