1. 程式人生 > >不同比例尺下計算固定顯示範圍/距離 arcengine

不同比例尺下計算固定顯示範圍/距離 arcengine

在不同比例尺下繪製出的距離相等,本例是有一個預設的範圍然後在這個預設的範圍上加上一個距離(毫米),然後繪製出新的範圍要素,無論比例尺如何縮放,新舊兩個範圍要素的內邊距都不會變化,程式碼如下:


private void draw()
{
  IEnvelope oldEnvelope;   //這是預設的一個範圍 可自己定義,本人是從Element中獲得的;
  axMapControl.Map.DistanceUnits=esriUnits.esriMillmeters;  //設定距離單位為毫米; 
  double pixeksOfMill= millToPixels(10);   //假設設定的決定距離為10毫米;

  double mapDis=CalcMapScale(pixeksOfMill);   //轉10毫米對應的畫素值等於多少地理寬度;

  IEnvelope   pNewEnvelope=new EnvelopeClass(){XMin=oldEnvelope.XMin-mapDis,YMin=oldEnvelope.YMin-mapDis,XMax=oldEnvelope.XMax+mapdis,YMax=oldEnvelope.YMax+mapDis};  //這就是一個比oldEnvelope長寬都多10毫米的一個範圍了;

}

//毫米轉畫素

private double millToPixels(double mill)

{

  Graphics g=Graphics.FromHwnd((IntPtr)AxmapControl1.ActiveView.ScreenDisplay.hWnd);

  double pixels=Math.Round(g.DpiX  / 25.4 * mill); //1英寸=25.4mm=96DPI,那麼1mm=96/25.4DPI

  return pixels;

}

//畫素轉地理距離

private double CalcMapScale(IActiveView activeView,double iDevUnit)

{

   double dMapUnit=0.01;

   IScreebDisplay pScreenDis=activeView.ScreenDisplay;

   if(pSreenDis!=null)

  {

    IDisplayTransformation pDisTra=pScreenDis.DisplayTransformation;

    tagRECT  rect=pDisTra.get_DiviceFrame();

    int iPixelWid=rect.right-rect.left;  //畫素個數 

    IEnvelope pEnvelope=activeView.Extent;  //當前地圖檢視的地理寬度

    dMapUnit=pEnvelope.Width / iPoxelWid * iDevUnit; // iDevUnit個畫素代表的地理寬度

    return dMapUnit;

  }

}