不同比例尺下计算固定显示范围/距离 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
}
//像素转地理距离
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;
}
}
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;
}
}
相关文章推荐
- CSS hack
- 云计算:利用叶子云桌面虚拟化管理平台搭建企业的桌面云,叶子云安装(二)
- datatable、dataset和datarow
- 汉诺塔(三)
- PHP+ajax实现连接数据库、加载更多
- 优化Android Studio/Gradle构建
- Oracle存储过程基本语法介绍-存储过程创建语法
- android activity的四种启动模式
- iOS之搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)
- Note Pad++ 和 Srt 两个工具的两点小应用
- JavaScript笔记4--闭包
- MINGW64位编译QT
- Smobiler实现图表分析功能—Chart控件(开发日志十一)
- EditText常用属性【三】:EditText选取操作
- java
- 页面checkbox处理
- Android volley 使用OkHttp3.0
- 欢迎使用CSDN-markdown编辑器
- 【12c新特性】12c中如何自动启动PDB Pluggable Database
- HR筛选简历的12个要点,投简历必读!