4

私は2軒の家を借りる必要があります。できるだけ近づけてほしい。約300戸の賃貸住宅があります。Google Maps Directions APIを使用して、利用可能な2つの家の間の歩行距離を計算し、リストを並べ替えて、近い2つの家を選択できるようにしたいと思います。

Googleが1日あたり2,500クエリの理論上の制限を設定していることを除いて、すべてがうまく機能します(実際には、制限ははるかに低く、1日あたりわずか250です)。300 2 /2-300 = 44,700のクエリを実行する必要があるため、この制限では明らかに不十分です。

これは1回限りのことですが、Google Maps APIで必要なことをどのように達成できるかについてのヒントはありますか?どういうわけか、制限が1つのインスタンスにのみ影響するように、分散されたプログラムを実行できますか?Google App Engineは役に立ちますか?

アルゴリズムを改善するためのアドバイスも歓迎します。2つの家が遠く離れていて、別の家が1つに近い場合は、おそらく遠く離れているため、残りの家で3番目の家をチェックする必要がないことを意味します。また、正確な距離ではなく、アルゴリズムの質的な性質に関心があるため、クエリが少なくなるような簡単な近似ができるかもしれません。

ありがとう、

4

4 に答える 4

4

カラスが飛ぶように、任意の2つの家の間の地理的距離は、歩行距離の厳密な下限になります。したがって、300のクエリから始めて、各家の長さ/緯度を取得し、それらを(たとえば)Haversineの式にプラグインして、45,000の順序付けされていないペア間の距離を取得し、それらを並べ替えて、地理的な距離で最も近いペアを取得します。次に、候補者がいる可能性があるので、GoogleAPIへの別の一連の呼び出しで歩行距離の確認を開始できます。

于 2011-04-08T23:44:29.333 に答える
1

あなたがピザの配達人であり、有効射程(30分以内に行ける場所)を計算したいとします。そして、その時間データのNからEセクションの色付きの棒グラフを次のように作成します(偽のデータを使用)。

ここに画像の説明を入力してください

そして、あなたは10万軒の家のようなものを含めたいと思います...少なくとも私は、このようなプログラムは、グーグルマップで紹介された限界の前に作られたと聞きました。この場合、制限は一生懸命に噛み付きます。

すべての家から地理的な場所がある場合は、鳥のように飛ぶときに、地球上のポイントがどれだけ離れているかから予測を見つけることができます。それに基づいてそれらを並べ替え、最良の予測のための結果を見つけます。

編集:予測を作成するときに役立つ可能性のあるJavaコード例を追加しました。

/**
 * Thaddeus Vincenty's inverse method formulae implementation for
 * geographical distance between two given points on earth.
 * @param L1
 *        geographical latitude of standpoint in decimal degrees
 * @param G1
 *        geographical longitude of standpoint in decimal degrees
 * @param L2
 *        geographical latitude of destination in decimal degrees
 * @param G2
 *        geographical longitude of destination in decimal degrees
 * @return Geographical distance in kilometeres
 */
public static double getDistance(final double L1, final double G1,
        final double L2, final double G2) {
    double delta, p0, p1, p2, p3;
    // The average radius for a spherical approximation of Earth
    double rEarth = 6371.01d;

    delta = G1 - G2;
    p0 = Math.cos(L2) * Math.cos(delta);
    p1 = Math.cos(L2) * Math.sin(delta);
    p2 = Math.cos(L1) * Math.sin(L2) - Math.sin(L1) * p0;
    p3 = Math.sin(L1) * Math.sin(L2) + Math.cos(L1) * p0;

    return rEarth * Math.atan2(Math.sqrt(p1 * p1 + p2 * p2), p3);
}

/**
 * Rounds double to nr number of decimal places
 * @param d
 *        floating-point number
 * @param nr
 *        decimal places to keep
 * @return rounded number with nr decimal places
 */
public static double round(double d, int nr) {
    return new java.math.BigDecimal(Double.toString(d)).setScale(nr,
        java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
}

public static void main(String[] args) {
    double L1 = Math.toRadians(Double.parseDouble(args[0]));
    double G1 = Math.toRadians(Double.parseDouble(args[1]));
    double L2 = Math.toRadians(Double.parseDouble(args[2]));
    double G2 = Math.toRadians(Double.parseDouble(args[3]));

    System.out.println(round(getDistance(L1, G1, L2, G2), 2));
}
于 2011-04-09T00:18:24.500 に答える
1

私はこの式を使用します:

distance = Math.acos(Math.sin(lat1)*Math.sin(lat2) + 
           Math.cos(lat1)*Math.cos(lat2) *
           Math.cos(lon2-lon1)) * 6371;

カラスが飛ぶように、45,000軒すべての家を距離でランク付けします。次に、最短距離でランク付けされた上位250の結果を取得し、それらをgoogleで実行して、正確な歩行距離を取得し、再ランク付けします。

于 2011-04-09T09:23:55.450 に答える
1

これがdirectionsメソッドで機能しているかどうかはわかりませんが、directionsクエリを単一のクエリにインターリーブ(ネスト)したいとします。グーグルチャンクは、チャンクごとに最大24の方向を保持できます。したがって、クエリを1日あたり最大250 * 24(6000方向)に増やすことができます。6000回のクエリの後でIPアドレスを変更したいですか?たぶんGoogleはあなたに1日あたり6000以上の道順を問い合わせさせますか?私はgewebtspソルバーからインターリーブのアイデアを得ました。彼はクエリマトリックスから24の都市を1つのチャンクにインターリーブし、最大22の単一クエリを節約して帯域幅とGoogleのAPI制限を減らしました。

于 2011-04-09T13:24:06.513 に答える