0

これが私を何日も目覚めさせている質問です。私がこれまでに思いついた唯一の結論は、RedBullは通常コーダーを助けないということです。

私のアプリケーションには、いくつかの仕事(1から50)があるシナリオがあります。ジョブには住所があり、住所には郵便番号、緯度、経度のプロパティがあります。

私には労働者のテーブルもあり、彼らにも住所があります。ジョブまたはワーカーは画面から作成されますが、Googleマップのクエリを使用して、提供された郵便番号が有効であり、英国にあることを確認して、すべての住所が確認されるようにします。

スケジューラーコントロールを使用して、y軸に一部のワーカーを表示し、x軸にタイムラインを表示しています。すべてのジョブには日付があり、ジョブの日付のスケジューラー上でのみ垂直方向に移動できます。ユーザーがいくつかのジョブを選択すると、それらはスケジューラーの近くのバスケットに表示されます。その後、ユーザーはワーカーに対してジョブをドラッグアンドドロップできます。これはすべて手動なので、機能します。

私の仕事は、これを自動化して、ユーザーがジョブを確認して割り当てる以外に多くのことを行わないようにすることです。したがって、プロセスを自動化する必要があります。

すべての労働者は、マイルを表す整数であるWillingMaximumDistanceTravelと呼ばれるプロパティを持っており、労働者は仕事のために旅行する用意があります。

今ここに頭痛の種があります:私には1500人以上の労働者がいます。NewtonsoftのJsonConvertを使用して、Googleマップからの応答ストリームを逆シリアル化するユーティリティ関数があります。郵便番号AとBをフィードする必要があります。

また、DBに新しいテーブルを導入して、距離の検索結果を郵便番号A、郵便番号B、および距離として保存する予定です。したがって、同じ郵便番号をもう一度比較していることに気付いた場合は、代わりにDBから結果をゆっくりと取得し、最終的には、このテーブルが非常に包括的であるため、Googleを煩わせる必要がなくなります。

ここではカラスフライパスが私の要件ではないため、単純な半正矢関数を使用することはできません。これの問題は、計算に多くの時間がかかることです。一部の労働者は10マイル以上移動できますが、一部の労働者は15〜80マイルです。リストから最初の仕事を取り、システムの該当するすべての労働者と一緒に実行する必要があります。英国の郵便番号にはパターンがあるのではないかと思っていました。英国の郵便番号のリストを並べ替える場合、英数字のパターンから、100マイルのマーク、200マイルのマークなど、どこに到達するかを概算できますか?

誰かがコードに興味があるなら、行をドロップしてください、そして私はそれを貼り付けます。

4

2 に答える 2

1

(私は Google で働いていますが、Google を代表して話しているわけではありません。maps API とは何の関係もありません。)

これは、Google Maps API を使用するのに最適な状況ではないと思います。単純に、非常に多くのデータをプッシュしているからです。ルートの制限内でリクエストを行うことができたとしても、それほど多くのリクエストを行いたくありません。

以前の仕事で似たようなことに取り組んだとき、ローカルにホストされたマップ API を購入しましたが、それでもこの種の作業には十分な速度ではありませんでした。最終的に、各郵便番号の「エリア」の重心から移動時間を事前に計算することになりました (おそらく名前が間違っていますが、郵便番号の最初の部分の後に残りの最初の桁が続きます。たとえば、「SW1W 9TQ の場合は「SW1W 9」)。 ") 他のすべての領域に移動し、結果を巨大なテーブルに格納します。前処理の量を削減するために、100 マイル以内または同様の郵便番号に対してのみ行ったと思います。

それでも、単純な DB は私たちが望むほど高速ではありませんでした。そのため、ソースと宛先のペアごとに 1 バイトずつ、結果を巨大なファイルに保存しました。(ソース郵便番号とターゲット郵便番号の固定シーケンスがあったため、それらを指定する必要はありませんでした。) その時点で、移動時間の計算は次の要素で構成されていました。

  • 郵便番号エリアを計算する (部分文字列の作業)
  • シーケンス内の各郵便番号エリアのインデックスを見つける
  • ファイルのその部分をロードしたかどうかを確認します (起動速度のために遅延ロードしました)
  • 必要に応じて行をロードし、それ以外の場合はアクセスするだけです

バイトは精度のスライディング スケールであったため、最初の 60 分間は 1 分単位であり、余分な値はそれぞれ 2 分、次に 5 などを意味します (これらは正確な値ではありませんが、そのようなものでした。)

「適切な候補」を見つけたら、もちろん、正確な郵便番号のより正確な道順をオンサイト API または Google Maps API に問い合わせることができます。

于 2011-04-11T16:17:08.657 に答える
1

空間インデックスまたは空間充填曲線を探したいとします。空間インデックスは 2 次元の問題を 1 次元の問題に減らし、サーフェスを再帰的に小さなタイルに再分割しますが、基本的にはタイルの並べ替えです。インデックスまたは 4 文字を使用した文字列を使用して、サーフェスを分割できます。後者は、すべての文字列操作がデータベース エンジンに隠されている状態で文字列をクエリできるため、便利です。Nick の空間インデックス quadtree hilbert-curve ブログを探します。

于 2011-04-11T16:19:10.887 に答える