画面座標変換 – 1 –


既存地物を画像座標変換
transform

画面がない時。画像化最大範囲を決定する場合。

using (ComReleaser com = new ComReleaser())
{
  Type t = Type.GetTypeFromProgID("esriDataSourcesGDB.SdeWorkspaceFactory");
  IWorkspaceFactory2 wsf = (IWorkspaceFactory2)Activator.CreateInstance(t);
  com.ManageLifetime(wsf);

  IFeatureWorkspace fw = (IFeatureWorkspace)wsf.OpenFromString(connectionString, 0);
  com.ManageLifetime(fw);

  var fc = fw.OpenFeatureClass("japan_ver71");
  com.ManageLifetime(fc);

  var feature = fc.GetFeature(951); //OIDで取得
  com.ManageLifetime(feature);

  var shp = feature.Shape;
  com.ManageLifetime(shp);

  IEnvelope env = shp.Envelope;
  com.ManageLifetime(env);

  int width = 400;
  int height = (int)Math.Ceiling(400 * (env.Height / env.Width));
  int dpi = 96;

  Debug.Print("w:{0}/h:{1}", env.Width, env.Height);
  Debug.Print("w:{0}/h:{1}", width, height);
  Console.WriteLine("w:{0}/h:{1}", env.Width, env.Height);
  Console.WriteLine("w:{0}/h:{1}", width, height);


  tagRECT deviceRect;
  deviceRect.left = 0;
  deviceRect.top = 0;
  deviceRect.right = width;
  deviceRect.bottom = height;

  IDisplayTransformation tran = new DisplayTransformationClass();
  com.ManageLifetime(tran);

  tran.VisibleBounds = env;
  tran.Bounds = env; 
  tran.set_DeviceFrame(ref deviceRect);
  tran.Resolution = dpi;

  ISymbol symbol = new SimpleFillSymbolClass();
  com.ManageLifetime(symbol);

  using (Bitmap bmp = new Bitmap(width, height))
  using (Graphics g = Graphics.FromImage(bmp))
  {
    IntPtr ptr = g.GetHdc();
    int hdc = ptr.ToInt32();

    symbol.SetupDC(hdc, tran);
    symbol.Draw(shp);
    symbol.ResetDC();

    g.Dispose();
    bmp.Save(@"c:\img.png", System.Drawing.Imaging.ImageFormat.Png);
  }

}//end com

まあ自分でやっても良いレベルではあるが、あるものは使わないと。
[画面ピクセル 幅:高さ] : [表示地図座標 幅:高さ]の比の問題

直計算は下記のような感じ
https://jpusergis.wordpress.com/2013/07/21/sql-geometryを描画/
https://jpusergis.wordpress.com/2014/03/28/scale-symbol-size/

座標値⇔ピクセル相互変換も出来なければ、扁球間の座標変換も理解出来るかあやうい。
まあ縮尺計算もただプラモの1/xxと一緒だし、表示範囲⇔ピクセルも比の問題でしかない。
頭を悩ませるような話ではないし、扁球の変換は誤差学問なので根拠記述探すぐらいで扁球パラメータなんぞDB化されてる。
しかし、誤差と根拠について探すのが面倒なのでまとまって記述されている場所がないものか。
(-146.414,507.337,680.507,0,0,0,0とかね)

カテゴリー: 開発 タグ: パーマリンク