3

私は iOS のアプリで、Trip Planner があります。たとえば、Google 方向 API を使用して、ニューヨークからボストンへのルートを取得しています。マップ上にポリラインを作成するために、50 の異なる緯度経度があります。その後、ボストンに向かう途中で訪れることができるこのルート上の場所を取得する必要があります。

Google ルート API が提供するもの:

latitude = "30.308399"; longitude = "-89.748299";
latitude = "30.310930"; longitude = "-89.818604";
latitude = "30.350050"; longitude = "-89.916054";
latitude = "30.432850"; longitude = "-90.098549";
....

現在、各ポイントでmysqlデータベースを検索して、最も近い場所を取得しています。

select id,title,type_id,service_id,latitude,longitude,state,city,zip,address, ( 3959 * acos( cos( ラジアン(31.72723) ) * cos( ラジアン(緯度) ) * cos( ラジアン( 経度) - ラジアン(-106.3047)) + sin( ラジアン(31.72723) ) * sin( ラジアン(緯度) ) ) 場所からの AS 距離 距離 <= 10 距離順 ASC 制限 10

しかし、このニューヨークからサンフランシスコへの旅行で 800 ポイントを獲得すると、合計で 2 秒以上かかるデータベースに対して 800 のクエリを実行することになります。7 つの異なるテーブルがあり、14 秒になります。

ならどうするのがベスト?

例

4

3 に答える 3

2

高速化する方法の 1 つを次に示します。

(1) 緯度と経度の表にインデックスを入れます。

(2) クエリでは、最初に、ルート上のポイントから水平方向および垂直方向の距離内にあり、興味を引くのに十分近い場所のみを選択します。緯度範囲と経度範囲で選択します。

(3) 次に、クエリの内側または外側のいずれかで、それらのポイントを距離で並べ替えます。

于 2013-02-20T06:45:05.410 に答える
1

これがボロノイ図であることをお勧めします。しかし、実装するのは難しいです。

注: 80kポイントしかないため、このすべてのポイントをアプリケーション内にキャッシュして、アプリケーションに必要なポイントから戻すことができます。

于 2013-02-20T06:43:20.870 に答える
-1

最小距離句を入れてみてください。Diatance>100など。

これは、コニカルスキャンとして知られています。低解像度から始めて、近づくにつれて増加し続けます。

于 2013-02-20T06:28:56.327 に答える