MapXtreme .Netを使用する

みなさんこんにちは! Pitney BowesのMapXtreme .NetなどのSDKでの経験を共有したいと思います。 彼らがウェブサイトで言ったように:
MapInfo MapXtreme for .Netは、Microsoft .Net環境のGISソフトウェア開発者のスイートであり、マッピングとGIS機能をビジネスアプリケーションに統合できます。


設置



最初のステップは、マシンが動作するようにセットアップすることでした。 開発者のサイトからMS VisualStudio 2015をインストールします(MSVS2010で動作します。以下のバージョンは試していません)。



開発者のサイトからインストールパッケージをダウンロードします。 60日間の試用版7.1は、ダウンロードポータルで入手できます(バージョン8は購入可能です。両者の違いは明白ですが、MapXtremeアーキテクチャに影響します。主な操作は変更されていません)。



また、世界地図をダウンロードする必要があります。さもなければ、なぜGISが必要なのでしょうか? MapXtremeには、 ADC WorldMapバージョン7.1カードが適しています。



MapXtremeには.Netが必要なため、この順序で並べてください。



ドキュメント



ライブラリは非常に大きく、多くの機能を備えていますが、それらにアクセスするにはドキュメントが必要であり、MapXtremeには問題があります。 SDKのあるディレクトリにインストールすると、
MapXtreme開発者向けリファレンス
MapXtremeバージョン8.0開発者ガイド


素材自体には、船長の証拠レベルの例が含まれているか、まったく含まれていません。 インターネットでも、このライブラリには多くの説明リソースが含まれていません。 最高は開発者のサイトにあった。 しかし、約6か月前、彼らは彼女のアクセスを閉鎖し、全員を技術サポートに送り始めました。



ところで、彼女の最愛の人についてのいくつかの言葉:



画像






彼らに助けを求める3-4回の電話があり、彼らはいつも私に言った:

「開発者にリクエストを渡しました」

「あなたのソースコードを私たちに送ってください、私たちはあなたの問題を理解していません」など。


カードのガイドも用意されており、便利です。 設定可能なすべてのタグとTPIA値について説明します。



開発



すべてを正しくインストールした場合、新しいプロジェクトを作成すると、VisualStudioでMapXtremeプロジェクトタイプが使用可能になります(ライセンスを購入したため、バージョン8.0があります)。



画像






Windowsフォームアプリを選択します。 新しい要素がツールボックスに表示されていない場合は、メニュー項目を開きます

ツール→ツールボックスアイテムの選択...


表示されるウィンドウで、必要なツールを選択します。



画像






これで、MapXtremeがアプリケーションを作成するための既製のコンポーネントを提供し、すべてのコードをインストール、構成、および作成する準備が整いました。 必要なボタンを格納するメインフォームにToolStripコンポーネントを追加すると、すぐにMapXtemeツールバーを作成できます。



画像






選択したボタンを使用するために、MapControlプロパティをMapControl型の要素の名前にマップします。 私の名前はmapControl1で、異なる場合があります。 または、フォームコンストラクターで記述します



private void Form1_Load(object sender, EventArgs e) { addrectangleToolStripButton1.MapControl = mapControl1; .... }
      
      





すべてが正しく完了したら、次のように成功するはずです。



画像






「すべてを正しく行い、描画ツールを選択しましたが、うまくいきません。 なんで?


この問題を解決するには、描画するレイヤーを選択して変更可能にする必要があります。 デフォルトでは、mapControlのすべてのレイヤーは不変です。



「レイヤーコントロール」ボタンを押して適切な場所にチェックを入れることで、MapXtremeを使用して問題を解決できます。



画像






または、コードで直接実行します。



 var layerTemp = mapControl1.Map.Layers["wldcty25"]; LayerHelper.SetInsertable(layerTemp, true);//      LayerHelper.SetEditable(layerTemp, true); //   
      
      





「上位」レイヤーでしか描画できないことに注意してください。つまり、今オブジェクトを描画するには、「wldcty25」レイヤーを上に移動する必要があります。



画像






または、コードを記述します。



 mapControl1.Map.Layers.Move(lastPosition, nextPosition);
      
      





その結果、最初のオブジェクトが描画されます。



画像






先ほど言ったように、どの設定もインターフェースを介して設定できます。 ただし、顧客はたいてい細心の注意を払い、より柔軟でアクセス可能な構成要素を必要とするため、MapXtremeコンポーネントを介して何かを構成する方法については説明しません。 コードでこれを行う方法を示します。


スタイルから始めたいです。 デザインを担当するメインクラスはCompositeStyleです。 MapXtremeでは、レイヤーとオブジェクトの両方をスタイルできます。 レイヤーのスタイルはオブジェクトのスタイルと重なっていることに注意してください。



 SimpleLineStyle border;//   border= new SimpleLineStyle(<    MapXtreme>, <  >, < >) SimpleInterior interior;//    interior = new SimpleInterior(< >, <  >,< >) AreaStyle polygon;//          polygon = new AreaStyle(border, interior); SimpleLineStyle line;//   line = new SimpleLineStyle(<    MapXtreme>, <  >, < >) BasePointStyle point;//   point = new SimpleVectorPointStyle(< >, < >, < >) CompositeStyle compStyle;//    compStyle = CompositeStyle(polygon, line, null, point);
      
      





結果のスタイルをレイヤーに適用します。



 FeatureOverrideStyleModifier fosm; fosm = new FeatureOverrideStyleModifier(parStyleName, parStyleAlias, compStyle); myLayer.Modifiers.Append(featureOverrideStyleModifier);
      
      





結果のスタイルをオブジェクトに適用します。



 Feature feature = null; feature = new Feature(<   >, compStyle);
      
      





オブジェクト作成



マルチラインまたはマルチポリゴンを作成するには、最初にソースデータを作成します。



 //    DPoint[] pts1 = new DPoint[5]; pts1[0] = new DPoint(-20, 10);//      pts1[1] = new DPoint(10, 15); pts1[2] = new DPoint(15, -10); pts1[3] = new DPoint(-10, -10); pts1[4] = new DPoint(-20, 10); //    DPoint[] pts2 = new DPoint[5]; pts2[0] = new DPoint(-40, 50); pts2[1] = new DPoint(60, 45); pts2[2] = new DPoint(65, -40); pts2[3] = new DPoint(25, 20); pts2[4] = new DPoint(-40, 50); //LineString     DPoint LineString lineString1 = new LineString(coordSys, pts1); LineString lineString2 = new LineString(coordSys, pts2);
      
      





上記のコードを使用して、次を作成します。



-マルチポリゴン



 //Ring     coordSys   LineString Ring ring1 = new Ring(coordSys, lineString1); Ring ring2 = new Ring(coordSys, lineString2); Ring[] rng1 = new Ring[2]; rng1[0] = ring2; rng1[1] = ring1; //MultiPolygon    Ring MultiPolygon multiPol = new MultiPolygon(coordSys, rng1);
      
      





-マルチライン



 //Curve     coordSys   LineString Curve curve4 = new Curve(coordSys, lineString1); Curve curve5 = new Curve(coordSys, lineString2); Curve[] crv = new Curve[2]; crv[0] = curve5; crv[1] = curve4; //MultiCurve    Curve MultiCurve mc = new MultiCurve(coordSys, crv);
      
      





地図投影を使用する



受信中:



 CoordSys oordSys= mapControl1.Map.GetDisplayCoordSys();
      
      





現在の座標系の作成と変更:



 CoordSys cs = Session.Current.CoordSysFactory.CreateCoordSys("EPSG:3395", CodeSpace.Epsg); mapControl1.Map.SetDisplayCoordSys(cs);
      
      





実際、多くのオーバーロードされたコンストラクターがありますが、実際のタスクでは3〜4つの座標系で作業する必要があるため、通常は2つで十分です。



ビットマップ画像の操作についてはまだ何も言いません。 彼女もここにいます。 ただし、座標系を変更した場合、トレースを登録しないと画像は変換されません。 行:



 mapControl1.Map.RasterReprojectionMethod = ReprojectionMethod.Always; /** *ReprojectionMethod    * None = 0, //    * Always = 1,//  * Optimized = 2//     ,         *  */
      
      





個人的には、GeoTiffでのみ作業しました。 MapXtremeは画像を直接操作しません。 すべてが適切であるためには、システムは、ラスタ記述、座標系、および角度の座標を含む* .tabファイルを必要とします。



MapXtremeを使用してラスターの* .tabを作成する方法を見つけられず、インターネットもヒントを提供しなかったため、このファイルを自分で作成するメソッドを記述する必要がありました。



 private string CreateTabFile(List<DoublePoint> parImageCoordinate)//   { NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat; var ext = m_fileName.Split(new Char[] { '.' }); var fileExt = ext[ext.GetLength(0) - 1]; string fileTabName = m_fileName.Substring(0, m_fileName.Length - fileExt.Length) + "TAB"; StreamWriter sw = new StreamWriter(fileTabName); string header = "!table\n!version 300\n!charset WindowsCyrillic\n \n"; sw.WriteLine(header); string definitionTables = "Definition Table\n "; definitionTables += "File \"" + m_fileName + "\"\n "; definitionTables += "Type \"RASTER\"\n "; for (var i = 0; i < parImageCoordinate.Count; i++) { definitionTables += "(" + parImageCoordinate[i].Longitude.ToString("N", nfi) + "," + parImageCoordinate[i].Latitude.ToString("N", nfi) + ") "; definitionTables += "(" + parImageCoordinate[i].PixelColumn.ToString() + "," + parImageCoordinate[i].PixelRow.ToString() + ") "; definitionTables += "Label \" " + (i + 1).ToString() + " \",\n "; } definitionTables = definitionTables.Substring(0, definitionTables.Length - 4); definitionTables += "\n "; definitionTables += "CoordSys Earth Projection 1, 104\n "; definitionTables += "Units \"degree\"\n"; sw.WriteLine(definitionTables); string metaData = "begin_metadata\n"; metaData += "\"\\IsReadOnly\" = \"FALSE\"\n"; metaData += "\"\\MapInfo\" = \"\"\n"; string hash; using (MD5 md5Hash = MD5.Create()) { hash = GetMd5Hash(md5Hash, m_fileName); } metaData += "\"\\MapInfo\\TableID\" = \"" + hash + "\"\n"; metaData += "end_metadata\n"; sw.WriteLine(metaData); sw.Close(); return fileTabName; }
      
      





MSDNから取得したGetMd5Hashメソッド。 これで、mapControl1でラスターを操作する準備が整いました。



今のところすべてです。 たぶん出てきてボリュームがありました。 なぜ書くことにしたのですか? なぜなら、この問題に関する良いコンテンツがハブやインターネットのru / eセグメントで見つからなかったからです。



All Articles