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

  }

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值