PHPアプリケーション用のGeoモジュール

画像 質問「Where?」は質問「What?」の直後に発生します。このパターンはWeb開発にも当てはまります。 多くのサイトはユーザーに情報を要求し、ユーザーに住所(国、地域、都市、通り、家、郵便番号)の入力を促します。 しかし、自由形式で示された場合、このデータをどのように処理するのでしょうか? 最初のプロジェクトでは「自転車」を使用しましたが、成長して発展するにつれて、この「奇跡」が「モンスター」に変わり、ユーザーに関する地理情報の効率的な処理が終了しました。 私はこのモンスターを釘付けし、標準化されたジオベースとそれを操作するためのシンプルなインターフェイスに置き換えるタスクを与えられました。 このトピックのグーグルは既成のソリューションを提供しなかったため、単純なオプションを削除して独自のジオモジュールを作成する必要がありました。



ロシアの住所の拠点



そもそも、ロシアの住所のベースを見つける必要がありました。 アドレスのベースを検索すると、2つに遭遇しました。

  1. KLADR (ロシア連邦の住所の分類子)は* .dbf形式で配布されます
  2. FIAS (連邦情報アドレスシステム)。 デフォルトでは、それらはxml構造の形式で配布されますが、 KLADRに適応する必要があることを確認する必要があり、そのさからFIASもdbf形式で広がり始めました。


それらの違いは次のとおりです。400MBのCLADRと9 GBのFIAS-重要ですよね。 したがって、ボリュームの観点から、彼のデータはより冗長であると想定できるため、 FIASを使用したいのです。 しかし、私はFIASを使用していません。 アドレステーブルのクエリは非常に長く、インデックスの配置もクエリの最適化も役に立たなかったため、MySQL 5.5を使用しました。



KLADRを使用すると、作業が発展し、後に判明したように、私の(標準)タスクの詳細は十分です。 KLADRテーブルの構造のレビューはこちらで読むことができます



プロジェクトでKLADRを使用できるようにするには、分散dbf形式からMySQLが理解できるものに変換する必要があります。 ただし、データベースに直接入力することができます。そのためには、 navicatまたはmydbf2mysqlを使用できます。



したがって、私は簡単なジオモジュールを作成しました。

このプロジェクトはGithubで入手できます。



モジュールとは何ですか?



プロジェクトはphp 5.3を使用して作成されましたが、これは重要です。

DBMS MySQL 5.5。これはあまり重要ではありません。



使用するライブラリ




プロジェクトファイル構造
 .project#プロジェクトルート
 -css \ 
 -js \
 -プラグイン
 ---オートコンプリート 
 ---- jquery.autocomplete.js
 --- jquery.form.js
 --cabinet.js#フォームのあるページのスクリプト
 --initialize.js#初期化スクリプト
 --jquery-1.7.2.js 
 -エンティティ\ 
 --GeoLocation.php#IPアドレスの場所データを持つエンティティ
 --UserLocation.php#ユーザーの位置データを持つエンティティ
 --Kladr.php#エンティティには、最初の4つの分類レベルのオブジェクトを持つレコードが含まれます
 --Socrbase.php#エンティティには、アドレスオブジェクトのタイプの短い名前のエントリが含まれます
 --Street.php#エンティティには、第5レベルの分類のオブジェクトを持つレコードが含まれます
 --Doma.php#エンティティには、第6レベルの分類のオブジェクトを持つエントリが含まれます
 --KladrRepository.php 
 --HomeRepository.php 
 --StreetRepository.php 
 -ジオ\
 -プロバイダー\
 ---配達#配達サービスプロバイダー 
 ---- EMS \ 
 ----- EmsDeliveryDecorator.php#EMS配信を計算するクラスデコレータ 
 ----- EmsDiliveryProvider.php#配信を計算するためのEMSサービスAPIを実装するクラス 
 ----- ENUM_EMS.php#コマンドの列挙
 ----ロシアの郵便\ 
 ----- RussianPostDeliveryDecorator.php#ロシア郵便の配達を計算するクラスデコレータ
 ----- RussianPostDeliveryProvider.php#配信を計算するためのPostCalcサービスAPIを実装するクラス 
 ---ジオコーダー\#ジオコーディングサービスプロバイダー
 ----ヤンデックス\ 
 ----- Geocoder.php
 ---- MapApiBase.php#ジオコーディングの抽象クラス
 --- Delivery.php 
 --- DeliveryBase.php
 --- DeliveryDecoratorBase.php
 --- DeliveryDecoratorRound.php
 --- DeliveryProviderBase.php 
 --common.php
 --Geo.php
 --GoecoderCreater.php#ジオコーディングオブジェクトのファクトリ
 --ILocationBuilder.php 
 --Location.php#geo-ipサービスにリクエストを行うことができるクラス
 --LocationBuilder.php#オブジェクトのビルダー\エンティティ\ UserLocation、ジオコーダーから受信したデータによる
 -_content.php 
 -autobox.php#プルダウンリストプラグインリクエストのエントリポイント(orcug / city)
 -autocomlete.php#エントリポイント
 -Autoloader.php#クラスローダー
 -delivery.php#配信計算リクエストのエントリポイント
 -index.php#メインエントリポイント
 -popup.php#modboxポップアップカラーボックスウィンドウによる実装例 
 -run.php#ブートストラップサンプルアプリケーション
 -String.php#一般的な静的メソッドの文字列




使用されたAPIサービス




私たちにできること




プロセスは次のとおりです。ページがロードされると、IPアドレスによってユーザーの地理的位置を取得します。このために、geoLocationテーブルにキー(IPアドレス)のエントリがあるかどうかを最初に調べます。 geoLocationプレートで、ipgeoサービスへのリクエストのトラフィックをさらに削減します。 ユーザーの位置に関する利用可能なデータを使用して、ユーザーの位置を予測します。 3つの(地域/地区/都市)ドロップダウンリストで、データを入力し、そこから目的の場所を選択します。 場所が正しく推測された場合、ユーザーは通りと家のみを指定する必要があり、インデックス(宝物にある場合)は自動的に置き換えられます。 ただし、IPアドレスによって場所が推測されなかった場合は、地域/地区/都市を変更できます。 このため、jsプラグインは桟橋用に作成されており、選択された地域に応じて、地域とその地域の大都市、および選択された地域に応じて地域の都市を要求します。



ユーザーの保存場所を表示するyandexマップがあります。 ただし、ユーザーが選択した場所に応じて、カードをその場で反応させることができます。



デモのために、住所を指定するフォームのあるページの最後に、配信の計算を行うブロックがあります。 配信パッケージ自体は「デコレータ」として実装されているため、金額または配信時間の計算を設定できます。 実際に計算がどのように機能するかは明確である必要があります。どこで、どこで、そして技術の問題を知る必要があります。 新しい*サプライヤー*を追加することにより、配送計算を拡張できます。



FIASアドレスを指定する構造がKLADRに似ていることは幸運です。同一ではないことに注意してください。ただし、リポジトリコード\ Entities \ KadrRepositoryをわずかにリファクタリングする場合、アドレスのストレージとしてFIASを使用できます。これが必要かどうかだけです。



APIモジュールの詳細な説明は、 githubのWiKiプロジェクトで公開されています



このモジュールが誰かに役立つことを願っていますが、完璧なソリューションのふりをするつもりはありません。コメントや提案を聞いてうれしいです。



All Articles