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