您的位置:首页 > 其它

不同比例尺下计算固定显示范围/距离 arcengine

2016-03-31 09:34 267 查看
在不同比例尺下绘制出的距离相等,本例是有一个默认的范围然后在这个默认的范围上加上一个距离(毫米),然后绘制出新的范围要素,无论比例尺如何缩放,新旧两个范围要素的内边距都不会变化,代码如下:

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: