不同比例尺下計算固定顯示範圍/距離 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;
}
}