12

特定のアドレスの近接度でソートされた、保存されているアドレスのリストを表示する方法を実装したいと思います。

リスト内のアドレスはデータベーステーブルに保存されます。別々の部分には別々のフィールドがあるので(郵便番号、都市名などのフィールドがあります)、それは単なる巨大なものではありませんvarchar。これらはユーザーが入力したものであり、システムの性質上、必ずしも完全ではない場合があります(郵便番号が欠落しているものもあれば、市や州にすぎないものもあります)。

これはイントラネットアプリケーション用ですが、インターネットWebサービスへのアクセスなどの外部リソースの使用に問題はありません。自分でやるのが簡単でない限り、私は実際に自分自身を転がすよりもそれを好むでしょう。GoogleまたはYahoo!の場合 すでに無料のサービスを提供しているので、ぜひチェックしてみてください。キーワードは、この機能のためにこのプロジェクトに追加のコストを導入する自由がないので、無料でなければならないということです。これは、いわばボーナスの「特典」です。

多くの実店舗が「場所を探す」機能を実行しているように、私はこれを考えています。適切にソートされた単純なテーブルに表示し、距離(たとえば、マイル)を表示するのは素晴らしいことです。地図のマッシュアップを表示するのはさらにクールですが、距離を取り戻して、その後の表示と並べ替えをすべて処理するだけで、間違いなく生きることができます。

単純な距離アルゴリズムの問​​題は、データの性質です。アドレスの全部または一部が未定義である可能性があるため、緯度/経度座標のような便利なものはありません。また、私が郵便番号を要求したとしても、住所の90%はおそらく同じ5つの郵便番号を持っているでしょう。

驚くほど高速である必要はありませんが、待ち時間が原因でページに表示されるまでに7秒以上かかるものは、私たちが知っているように、平均的なユーザーが待つには長すぎる可能性があります。そのような架空のサービスが、一度に1つずつクエリを実行するのではなく、一度にアドレスのバッチを送信することをサポートしている場合、それは素晴らしいことです。それでも、アドレスのリストが合計で50を超えるとは思わないでください。

4

8 に答える 8

10

グーグルヤフー!どちらもジオコーディング サービスを無料で提供しています。Haversine 式( .NET または SQL で実装)を使用して距離を計算できます。どちらのサービスも、部分検索 (郵便番号のみ、都市のみ) を実行し、結果の精度を知らせてくれます (そのため、意味のある情報がない場所を除外できますが、Yahoo! は Google よりも精度の高い情報を提供します)。

于 2008-09-22T16:26:50.150 に答える
4

Google Maps API は、使用条件が原因で役に立ちません。ただし、Yahoo は住所を Long/Lat 座標に変換する REST サービスを提供しており、これを使用して距離を計算できます。ここある。

于 2008-09-22T16:27:42.100 に答える
2

郵便番号を入力するように要求し、郵便番号を緯度/経度のペアにマッピングするデータベース テーブルを作成します (またはオンラインで見つけます)。あなたがどこで働いているのかはわかりませんが、ここでは、郵便番号は数メートルに固有である可能性があるため、十分に正確なはずです. 次に、このメソッドを使用して、2 つの郵便番号間の距離を計算します。

public static double distance(double lat1, double lon1, double lat2, double lon2, char unit)
{
  double theta = lon1 - lon2;
  double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) +
    Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
  dist = Math.Acos(dist);
  dist = rad2deg(dist);
  dist = dist * 60 * 1.1515;
  if (unit == 'K')
  {
    dist = dist * 1.609344;
  }
  else if (unit == 'N')
  {
    dist = dist * 0.8684;
  }
  return (dist);
}

private static double deg2rad(double deg)
{
  return (deg * Math.PI / 180.0);
}

private static double rad2deg(double rad)
{
  return (rad / Math.PI * 180.0);
}

ジオコーディング サービスよりも独自のコードを使用する利点は、データに対してより多くの興味深い計算を実行できるだけでなく、データと一緒にデータをデータベースに保存できることです。

于 2008-09-22T16:34:55.857 に答える
1

Google Maps API を使用して距離を取得し、並べ替えることはできませんか?

http://code.google.com/apis/maps/

于 2008-09-22T16:23:12.313 に答える
0

このウェブサイトをチェックしてください:http://geocoder.us/help/utility.shtml

次のように、15秒に1回、レコードを処理できます: http: //geocoder.us/service/distance ?zip1=95472&zip2=94305

また、時間制限のないサブスクリプションサービスもあります

于 2008-09-22T18:34:20.423 に答える
0

Google Maps API を調査することをお勧めします。

外部接続が必要になります (そして、それを介してデータを Web サービスにシャントしても問題ありません)。それ。

ルート案内 API の API リファレンス

于 2008-09-22T16:23:21.563 に答える
0

私の会社で行ったことの 1 つは、ごまかして郵便番号の緯度/経度 (郵便番号エリアのほぼ中央) を使用することです。完璧ではありませんが、y 種類の検索から n マイル以内で x を見つけるには十分な距離です。これは、アドレス クリーニング サービスでアドレスを認識できない場合に特に役立ちます。

ある時点で、この概算で使用する緯度/経度ルックアップ テーブルへの無料の郵便番号に出くわしました。申し訳ありませんが、これ以上のリンクはありません。

于 2008-09-22T16:25:35.007 に答える
0

他の誰かがDaft Logicで既にそれを行っています (編集: タイプミス)。彼らは Google Maps API を使って大圏式を使用しています。実行するのは難しくないと思います。

更新:実際には、お気に入りのプロバイダーから座標を取得するだけでよく、コードで計算を行うだけです。ユーザーが場所を提供するときに、ショップの座標をプリロードできます。これを検証に使用することもできます。次に、リクエストが行われると、顧客の場所を検索することしかできません。

于 2008-09-22T16:28:09.213 に答える