クライアントは、ユーザーが自社の製品範囲の仕入れ業者を検索できるWebサイト上のページを望んでいます。彼らが望んでいるのは、英国の郵便番号を入力し、彼らのストッカーのリストを最も近い順序で表示する機能です。
Googleマップを利用して最寄りのサプライヤーを特定する方法はありますか?
私はすべてのサプライヤーの郵便番号と詳細を含むPHPMySQLデータベースを持っており、使用するユーザーの郵便番号も持っています。
クライアントは、ユーザーが自社の製品範囲の仕入れ業者を検索できるWebサイト上のページを望んでいます。彼らが望んでいるのは、英国の郵便番号を入力し、彼らのストッカーのリストを最も近い順序で表示する機能です。
Googleマップを利用して最寄りのサプライヤーを特定する方法はありますか?
私はすべてのサプライヤーの郵便番号と詳細を含むPHPMySQLデータベースを持っており、使用するユーザーの郵便番号も持っています。
郵便番号を経度と緯度にマッピングするには、OrdnanceSurveyCodePointデータが必要になると思います。Codepointは商用製品として入手可能ですが、 CodepointOpenもあります
緯度と経度が決まったら、HaversineやVincentyなどの標準アルゴリズムを使用してポイント間の距離を計算できます。
編集
CodePointOpenCSVファイルの構造はここにあります。場所は経度と緯度ではなく北緯と東経として保持されるため、変換する必要があることに注意してください。これに関する記事はウェブ上にたくさんあります。
http://www.deepbluesky.com/blog/-/converting-os-coodinates-into-longitude-latitude_7/
http://mediakey.dk/~cc/convert-northing-and-easting-utm-to-longitude-and-latitude/
ただし、OS Northings / Eastingsは、Googleマップ(およびほとんどのGSMシステム)で使用されるWGS84モデルではなく、Airy1830楕円体に基づいていることに注意する必要があります。この違いを考慮に入れないと、コーンウォールとイーストアングリアの間の70〜120mの距離であなたを追い出すことができます。
この変換を行うPHP関数はMovableTypeサイトでも見つけることができます( GeoDataを使用するPHP開発者にとって必読です。経度と緯度については、ストッカーデータベースにいくつかの列を追加することをお勧めします。コードポイントデータを使用して既存のすべてのデータを更新するスクリプトを作成し、ストッカーの挿入/更新ルーチンを変更して、この情報を最新の状態に保ちます。PHPを使用するこの変換の別のソリューションは、JonathanStottによるPHPCoordです。
データベースクエリのパフォーマンスを向上させるには、距離を計算する前に、「バウンディングボックス」に対して緯度/経度を検索します。同様のクエリに応答してこれを行う方法を説明しました。
それより少し多くのデータが必要になると思います。すべての英国の郵便番号の緯度と経度を郵便番号自体と一緒に保存する必要があることをお勧めします。このデータはRoyalMailから有料で入手できると思います。どこかで、パブリックドメインでも入手できるようになると読んだことを覚えています。ユーザーに郵便番号を入力してもらい、データベースで緯度と経度を調べてから、それを使用して、おそらく特定のマイル数以内で、ユーザーに最も近いサプライヤーを計算する別のクエリを実行します。おそらく、このすべてをデータベースで実行するためのストアドプロシージャを作成できます。この投稿には、これを行う方法についての詳細が含まれているようです。
高速にしたい場合は、互いに特定の半径内の郵便番号間の距離を事前に計算します。以下を参照してください。
ユーザーが製品を購入するために100マイル以上移動する意思があると思わない限り、これはあなたのケースではうまくいくはずです。
Googleマップの代わりに、このオープンな郵便番号ジオコーディングAPIが役立つ場合があります。他の人が述べているように、両方のポイントの緯度が長くなると、標準のアルゴを使用して距離を見つけることができます。前の質問には、SQLでこれを直接行う方法に関する情報が含まれています。
このWebサイトが役立つ場合があります:SQL/CSV郵便番号データベース
私は以前、これを使用して、郵便番号「outcode」からlong/latを検索しました。
2つの郵便番号間の距離を計算するphpスクリプト(私はテストしていません)もあります。