2

私は、英国を拠点とするメンバーシップ組織のいくつかの部門 Web サイトを管理しています。私たちが提供したいことは、他のアドレス機能と同様に、Web サイト自体から Web ユーザーに最も近いメンバー検索を提供することです。

私が埋めたいいくつかのユースケース:

ケース 1 : ユーザーが郵便番号を入力し、半径 5/10/15/20/30/40 マイル内にいるすべてのメンバーを確認したい場合

ケース 2 : メンバーが地域 (市、郡など) を入力し、その地域のメンバーのリストを取得します。

基本的に私が探しているのは、コード化して実行できるプログラム可能な API です。

  • 郵便番号を検索して住所を返します(たとえば、家番号を選択した後)。
  • 郵便番号 + 半径 (5 マイル、10 マイルなど) を検索し、該当する一連の郵便番号を取得して、データベースのメンバーシップ レコードに参加します。

推奨事項はありますか?これは、サーバーへの四半期ごとの更新プログラムのインストールであったり、クエリ可能な Web サービスであったりします。私は提案を受け入れます。

前もって感謝します

編集これを忘れないでください。仕事中に他の何かがミックスに投入され、これは後回しにされました。沸騰したら更新します(鍋の沸騰コメントに適用します:-))

4

4 に答える 4

4

更新: BBCニュースサイトで、今月から郵便番号データが無料になるのを見ました。これに照らして、私はこのデータを使用します。このデータベースへのAPIを探します。

以前の回答:英国の郵便番号データは、RoyalMailによってかなりの費用で提供されています。これには、各郵便番号のLngLatデータが付属しています。Royal Mailのデータベースの所有権については、かなり議論の余地があります。詳細については、このサイトを参照してください。
そうは言っても、GoogleMapsApiを使用してこれを行うことができます。ユーザーは自分が住んでいる地図上にピンを配置することができ、あなたはそのLngとLatをキャプチャすることができます。上記で指定したすべてが提供されるわけではありません。

これがGoogleGeocodingAPIに関する優れた記事です

于 2010-04-16T15:01:30.943 に答える
2

少なくとも米国内では (私は他の国の郵便番号形式について完全に無知です -- しかし、それらが Long/Lat にマップされている場合、これは機能するはずです)、Haversine Formula を使用して郵便番号を計算できるはずです与えられた地理空間半径。

簡単に言えば、郵便番号 -> 経度/緯度表が必要です。次に、特定の郵便番号 (座標) から、そのポイントから特定の距離内にあるすべての緯度と経度の座標を数学的に決定できます。次に、これらのおおよその座標を取得して郵便番号に変換し、郵便番号内のメンバーをクエリします。

後は、それらを地図にプロットするだけです。以下は、数学を説明し、実際にそれを動作する MySQL クエリに変換して開始するため、私ができるよりもはるかに詳細です。

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

于 2010-04-16T15:30:17.540 に答える
2

おそらくある時点で遭遇することの 1 つは、2 つのポイント (緯度/経度) のペア間の距離を計算する必要があることです。最もよく知られているアルゴリズムの 1 つは、Haversine Forumlaです。私が見つけたいくつかのCコードに基づいて、これの実装を書きました(元の作者を思い出せません)。次のようになります。

public static double DistanceBetween(LatLng pos1, LatLng pos2, DistanceUnit unit)
{
    double R = 6371;

    switch (unit)
    {
        case DistanceUnit.Miles:
            R = 3960;
            break;
        case DistanceUnit.Kilometers:
            R = 6371;
            break;
        case DistanceUnit.Meters:
            R = 6371000;
            break;
    }

    double dLat = GeoMath.DegreesToRadians(pos2.Latitude - pos1.Latitude);
    double dLon = GeoMath.DegreesToRadians(pos2.Longitude - pos1.Longitude);
    double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
        Math.Cos(GeoMath.DegreesToRadians(pos1.Latitude)) *
        Math.Cos(GeoMath.DegreesToRadians(pos2.Latitude)) *
        Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
    double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));
    double d = R * c;
    return d;
}

DistantUnit は単純な列挙型で、LatLng は基本的に 2 つの double プロパティを持つ単なる構造体またはクラスです。

于 2010-04-16T15:34:07.470 に答える
0

私は数ヶ月前に似たようなことをしました。IP アドレスを指定すると、このサービスを独自のサーバーで実行する必要がある近くの町/都市を知る必要がありました。もう知らないウェブサイトから、世界中の緯度/経度/都市の場所のリストを入手しました。テーブルには、約 8 mio のエントリが含まれていました。

Dan Diplo が示唆しているように、このようなクエリには距離が必要になります。私のクエリは、特定の緯度/経度座標に最も近い場所を見つけることでした。Dan Diplo の i と同様の関数を使用して、DB エントリ (latlng1) とゼロ (latlng2) の距離を計算するインデックスを作成しました。このインデックスは、インデックス スキャンを取得してデータ セットを削減するためにのみ使用されます。最終的な値を見つけるのには役立ちません。最後に、検索するデータとゼロまでの距離をクエリして、検索セットを減らす必要があります。

したがって、クエリには約 100 ミリ秒かかりました。ただし、Diplo の関数を SQL インデックスとして使用する必要があります。これは、数学関数を提供する現在のデータベースでは問題になりません。

于 2010-08-20T07:49:56.447 に答える