IMapServer


arcobjectsでローカルMSDからIMapServer作成の例
レンダリングエンジン違うらしいのでExportImageは通常より多少早いはず。
初期化遅いけども。。。

#!/usr/bin/env python
# -*- coding: cp932 -*-

import sys
import os
import arcpy

def main(argv):

  #sys.exit
  #文字列を指定すると、標準エラー出力に引数の内容を表示しつつプロセスの戻り値は0以外(正常ではない終了の値)になる
  if len(argv) != 2:
    sys.exit("Usage: %s <mxd path> <out msd path>" % sys.argv[0])
  if not os.path.exists(argv[0]):
    sys.exit('ERROR: file %s was not found!' % argv[0])

  #print argv[0]
  msddoc = argv[1]

  mapdoc = arcpy.mapping.MapDocument(argv[0])
  analysis = arcpy.mapping.AnalyzeForMSD(mapdoc)
  errs = analysis['errors']
  if (errs != {}):
    errmsg = "Analyzer Errors:"
    for k in errs.keys():
      errmsg += '\n\t' + k[0]

    sys.exit(errmsg)
  
  arcpy.mapping.ConvertToMSD(mapdoc, msddoc)


if __name__ == "__main__":
    main(sys.argv[1:])
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;


using ESRI.ArcGIS;
using ESRI.ArcGIS.Carto;
using esri = ESRI.ArcGIS.Geometry;


class MapServiceUtil : IDisposable
{
  private string _mxdPath = null;

  private string _msdPath = null;


  private string _pythonPath = null;

  private IMapServer _mapServer;


  /// <summary>
  /// コンストラクタ
  /// </summary>
  /// <param name="mxdPaht"></param>
  public MapServiceUtil(string mxdPath)
  {
    var runtimes = RuntimeManager.InstalledRuntimes;
    var pythonPath = @"C:\Python27\ArcGISx64" + RuntimeManager.ActiveRuntime.Version.ToString() + @"\python.exe";

    this.init(mxdPath, pythonPath);
  }

  /// <summary>
  /// コンストラクタ
  /// </summary>
  /// <param name="mxdPath"></param>
  /// <param name="pythonPath"></param>
  public MapServiceUtil(string mxdPath, string pythonPath)
  {
    this.init(mxdPath, pythonPath);
  }

  /// <summary>
  /// 初期化
  /// </summary>
  /// <param name="mxdPath"></param>
  /// <param name="pythonPath"></param>
  private void init(string mxdPath, string pythonPath)
  {
    this._mxdPath = mxdPath;
    this._pythonPath = pythonPath;
    //MXDからMSDへ変換
    this.convertMXDToMSD();
    //マップサービスのセットアップ
    this.setupMapServer();
  }

  /// <summary>
  /// MXDからMSDへ変換
  /// </summary>
  private void convertMXDToMSD()
  {
    var mxdfile = this._mxdPath;
    var asm = System.Reflection.Assembly.GetExecutingAssembly();

    var dir = Path.GetDirectoryName(asm.Location);

    var scriptFile = Path.Combine(dir, "mxd2msd.py");
    var msdfile = Path.Combine(Path.GetDirectoryName(mxdfile), Path.GetFileNameWithoutExtension(mxdfile) + ".msd");
    this._msdPath = msdfile;

    ProcessStartInfo start = new ProcessStartInfo();
    start.FileName = this._pythonPath;
    start.Arguments = "\"" + string.Join("\" \"", new string[] { scriptFile, mxdfile, msdfile }) + "\"";
    start.UseShellExecute = false;
    start.RedirectStandardOutput = true;
    start.RedirectStandardInput = false;

    start.CreateNoWindow = true;

    using (Process process = Process.Start(start))
    {
      using (StreamReader reader = process.StandardOutput)
      {
        string result = reader.ReadToEnd();
        Console.Write(result);
      }

      process.WaitForExit();
      if (process.ExitCode != 0)
        throw new Exception("MSD変換ミス");
    }

  }

  /// <summary>
  /// マップサービス設定
  /// </summary>
  private void setupMapServer()
  {
    var msdfile = this._msdPath;

    IMapServer mapServer = Activator.CreateInstance(Type.GetTypeFromProgID("esriCartoX.MapServerX")) as IMapServer;
    IMapServerInit2 mapServerInit = (IMapServerInit2)mapServer;
    mapServerInit.PhysicalOutputDirectory = System.IO.Path.GetTempPath();
    mapServerInit.VirtualOutputDirectory = System.IO.Path.GetTempPath();

    mapServerInit.Connect(msdfile);
    this._mapServer = mapServer;
  }//end method

  /// <summary>
  /// かくにん
  /// </summary>
  public void Test()
  {
    var width = 800;
    var height = 600;

    var mapServer = this._mapServer;

    var mapInfo = (IMapServerInfo)mapServer.GetServerInfo(mapServer.DefaultMapName);
    var md = mapInfo.DefaultMapDescription;

    using (var com = new ESRI.ArcGIS.ADF.ComReleaser())
    {
      var it = new ImageTypeClass();
      com.ManageLifetime(it);

      it.Format = esriImageFormat.esriImagePNG32;
      it.ReturnType = esriImageReturnType.esriImageReturnMimeData;

      var imgDesplay = new ImageDisplayClass();
      com.ManageLifetime(imgDesplay);

      imgDesplay.Width = width;
      imgDesplay.Height = height;


      var imgDescription = new ImageDescriptionClass();
      com.ManageLifetime(imgDescription);

      imgDescription.Display = imgDesplay;
      imgDescription.Type = it;

      var mapExtent = new MapExtentClass();
      com.ManageLifetime(mapExtent);

      var env = new esri.EnvelopeClass();
      com.ManageLifetime(env);

      env.PutCoords(132.453504843, 34.387393538, 132.458544541, 34.391243506);
      mapExtent.IMapExtent_Extent = env;

      md.MapArea = mapExtent;

      var mapImg = mapServer.ExportMapImage(md, imgDescription);
      using (var mem = new MemoryStream(mapImg.MimeData))
      using (var img = System.Drawing.Bitmap.FromStream(mem))
      {
        img.Save(@"C:\temp\mapserver.png");
      }
    }
  }


  //----------------------------------------------------
  #region IDisposable Support
  private bool disposedValue = false; // 重複する呼び出しを検出するには

  protected virtual void Dispose(bool disposing)
  {
    if (!disposedValue)
    {
      if (disposing)
      {
        // TODO: マネージ状態を破棄します (マネージ オブジェクト)。
      }

      // TODO: アンマネージ リソース (アンマネージ オブジェクト) を解放し、下のファイナライザーをオーバーライドします。
      // TODO: 大きなフィールドを null に設定します。
      if (this._mapServer == null)
      {
        Marshal.FinalReleaseComObject(this._mapServer);
        this._mapServer = null;
      }

      disposedValue = true;
    }
  }

  // TODO: 上の Dispose(bool disposing) にアンマネージ リソースを解放するコードが含まれる場合にのみ、ファイナライザーをオーバーライドします。
  // ~MapServiceUtil() {
  //   // このコードを変更しないでください。クリーンアップ コードを上の Dispose(bool disposing) に記述します。
  //   Dispose(false);
  // }

  // このコードは、破棄可能なパターンを正しく実装できるように追加されました。
  public void Dispose()
  {
    // このコードを変更しないでください。クリーンアップ コードを上の Dispose(bool disposing) に記述します。
    Dispose(true);
    // TODO: 上のファイナライザーがオーバーライドされる場合は、次の行のコメントを解除してください。
    // GC.SuppressFinalize(this);
  }
  #endregion IDisposable Support
  //----------------------------------------------------
}
カテゴリー: 開発, 設計 タグ: パーマリンク