私の郵便局はどこですか? -インデックスで郵便局DublGisを検索

引っ越した後、郵便局の検索に困惑しなければなりませんでした。 幸いなことに、2Gisデスクトップバージョンの最新バージョンでは、ほとんどの都市でインデックスの構築に関する情報があり、最終的にはインデックスの最後の3桁に等しい数の郵便局を選択することになりましたが、このためのルーチン操作の数は非常に多かったので、暇なときに心のウォームアップとして、適用されたアルゴリズムへの愛情から、このプロセスを自動化してみてください。





試行番号1



最初は、「額に」、つまり、インデックスによって郵便局の住所を取得する方法を見つけることが決定されました。 この方法はすぐに見つかりました-ロシアの郵便のウェブサイトには、このタスクを実装する郵便局の検索サービスがあります。 このサービスの安定性と速度は望まれていませんが(予防保守のために最後の数日間は完全にオフにされています)、この情報を反映するサードパーティのサービスがかなり見つかりました(例: ロシア郵便局の パッケージまたは独立格付け) 。 ただし、別の問題が発生しました。受信したアドレスは、ユニバーサル「Where」フィールドのユーザーインターフェイスを介してのみアプリケーションにフィードできます。



ただし、プラグインAPIにはこのような機会はありません;検索メソッドによって、3つの別個のフィールド(決済、通り、家)を裏切る必要があります。 原則として、この段階では、受信した文字列から必要なフィールドを噛むことで困惑することを試みることができますが、このタスクは面白くなく、バイパスすることを決定しました(今はこのオプションに戻ります)



試行番号2



郵便局の住所に加えて、上記のサービスはその名前も提供します。これは、一般的な場合、和解の名前と複数ある場合は事務所のシリアル番号で構成されます。 一般に、この情報は組織のディレクトリを検索するのに十分なはずです(部署の場所と名前で)。 この段階で、プラグインの最初の作業バージョンが実装され、可用性( GitHubのリポジトリ )に基づいて、指定された3つのサービスすべてに問い合わせが行われました 。 ただし、いずれの場合でも、応答時間は不安定であり、2Gisデスクトップアプリケーションのイデオロギーは、オフラインモードで本格的な作業が行われる可能性を示唆しています。



試行番号3



オフラインデータベースの短い検索の後、 郵便サービスオブジェクトの郵便番号の参照ディレクトリが見つかりました。これはDBFファイルであり、うらやましい頻度で更新されます。 18メガバイトのファイルから、必要な情報のみが選択され、プラグインに含まれました。

しかし、この段階で、郵便局の名前と入植地への割り当てに関して多くの問題が発見されました。 それらのほとんどすべては、プラグインの現在の実装( GitHubの現在のブランチ )で解決されました。

以下は、組織のディレクトリ内の郵便局を検索するための基準を形成するための基本的なアルゴリズムです。

//     string postOfficeName = LocalFileInformationService.Instance.GetPostOffice(postIndex); if (postOfficeName != null) { //     "< > <>" Match m = CITY_POST_OFFICE_NAME.Match(postOfficeName); String city; String number; if (m.Success) { //     city = m.Groups[1].Value; number = m.Groups[2].Value; } else { // ,        city = postOfficeName; number = null; } try { ICriteriaSet criteries = _pBaseView.Factory.CreateCriteriaSet(); //     " " criteries.set_Criterion("grym_rub:name", " "); string gisCityName; if (_cities.TryGetValue(city, out gisCityName)) { //        ,     ,       criteries.set_Criterion("grym_city:name", gisCityName); } if (number != null) { //     ,        criteries.set_Criterion("grym_name", number); } else { //        int officesCount = LocalFileInformationService.Instance.GetCityPostOffices(city, postIndex.Substring(0, 3)); if (officesCount > 2) { //      ( )  ,        "" criteries.set_Criterion("grym_name", ""); } else if (String.IsNullOrEmpty(gisCityName)) { //          ( .   .       ),         //       ,       ,          . if (((int)dr.Value["addr_count"]) > 0) { //        string featureCity = dr.Value["city"].ToString(); //           int officesCount2 = LocalFileInformationService.Instance.GetCityPostOffices(NormalizeCityName(featureCity), postIndex.Substring(0, 3)); if (officesCount2 > 0) { //         ,      ,     (     ) (. , ) //       criteries.set_Criterion("grym_name", city); } else { //              . ,          //     .  ,    criteries.set_Criterion("grym_city:name", featureCity); } // else     ,     ,     ? } else { //   ? ,      criteries.set_Criterion("grym_name", city); } } } _pBaseView.Frame.DirectoryCollection.Search(criteries, "  " + postIndex, "<criterion> </criterion><description>" + postOfficeName + "</description>"); } catch (Exception e) { MessageBox.Show(e.Message + e.StackTrace + e.GetType().ToString()); } } else { MessageBox.Show(",     ."); }
      
      





公式にはトムスク市の一部であるティミリヤゼヴォの村に問題がありました-その支店は「ティミリヤゼフスキー」と呼ばれますが、村自体はディレクトリ内で独立した集落(それは)として強調されていません。 おそらく、ステップ1に戻って、アドレス情報を操作してみてください。



試行番号4


また、郵便局のある建物のインデックスが事務所自体と同じであるという仮定もありましたが、これは事実ではありませんでした。たとえば、Prokopyevskの郵便局39のインデックスは653033です。さらに、API 2Gisは検索基準の組織を許可しません建物の郵便番号を示します。



パンと改善。



自動更新。


リファレンスマニュアルの更新頻度を考えると、インデックスベースの自動更新機能を追加したいという要望があります。



インターフェース


プラグインが考案されたとき、その機能を可能な限り既存のインターフェイスに統合する、つまり、建物情報カードの建物インデックスを検索を開始するハイパーリンクにするという要望がありました。



ただし、フルタイムAPIはそのような機会を提供しませんが、このタブの代わりにコントローラーを使用することで回避策が見つかりました(プラグインの最初のバージョンで実装):

 class CustomMainController : IMapInfoController, IControlAppearance, IObjectCustomization { private IMapInfoController _innerController; private IBaseViewThread _pBaseView; private string _currentCity; public CustomMainController(IBaseViewThread pBaseView) { _innerController = ((GrymCore.IMapInfoControllers2)pBaseView.Frame.Map.MapInfoControllers).FindMapInfoController("Grym.MapInfo.Default"); _pBaseView = pBaseView; _currentCity=_pBaseView.BaseReference.Name; ((GrymCore.IMapInfoControllers2)pBaseView.Frame.Map.MapInfoControllers).RemoveController(_innerController); ((GrymCore.IMapInfoControllers2)pBaseView.Frame.Map.MapInfoControllers).AddController(this); PostalInformationServiceManager.Instance.BaseViewThread = _pBaseView; } public bool Check(IFeature f) { return _innerController.Check(f); } ... }
      
      





ただし、この実装にはいくつかの問題があります:情報タブがリストの最後に移動し、ディレクトリの複数のコピーが異なる都市で同時に起動されるとクラッシュが表示されます)、今のところ、カードの地下にカスタムリンクを追加できる通常のカスタマイザーメカニズムを支持して、アイデアを放棄する必要がありました。



おわりに



この段階で、プラグインを作成する主要なタスク(興味深い問題を解決し、新しいことを学び、c#を思い出す)は完了したようです。 さらに、「Now works」フィルターの機能を拡張する別のプラグインのアイデアが登場しました。 したがって、次に何をすべきかを決定する必要があります。 この中で、私はコミュニティの意見に耳を傾けたいと思います-突然誰かがこの開発に興味を持つか、その開発のための興味深いアイデアが表示されます。



ダウンロード:


プラグインの通常バージョン

プラグインのバージョンは、建物のインデックスをリンクに置き換えます (注意してください 、バージョンは不安定であり、2Gisシェルの崩壊につながる可能性があります)。



All Articles