不同比例尺下计算固定显示范围/距离 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;

  }

}

转载自:https://blog.csdn.net/wangtao510/article/details/51023177

You may also like...