我以前写过一篇文章《ArcEngine中将地图导出为图片》是关于如何将当前视图内的地图输出为一个图片的。
昨天有个同事让我帮下忙,写一段代码将某个特定的。或某几个特定的要素导出为一个图片。
我想到了我们的代码中有一段是将一个符号转化为一个图片的。当时就想能不能修改一下那个代码来提供这个功能。结果还真是搞出来了。
完整的代码如下:
/**这个方法使用HDC、图形的范围和要输出的图片的大小来构造一个 ITransformation.
*/
public ITransformation CreateTransformation(IntPtr hdc,IEnvelope geomEnv,int imageWidth,int imageHeight)
{
tagRECT frame=new tagRECT ();
frame.left=0;
frame.top =0;
frame.right=imageWidth;
frame.bottom=imageHeight;
double dpi=Graphics.FromHdc (HDC).DpiY;
long lDpi=(long)dpi;
if(lDpi==0)
{
System.Windows .Forms .MessageBox .Show ("获取设备比例尺失败!");
return null;
}
IDisplayTransformation dispTrans=new DisplayTransformationClass();
dispTrans.Bounds =geomEnv;
dispTrans.VisibleBounds =geomEnv;
dispTrans.set_DeviceFrame(ref frame);
dispTrans.Resolution =dpi;
return dispTrans;
}
/**
*这个方法将多个Geometry输出到一个Bitmap文件中,文件路径为filePath,图片的大小为width*height。
*/
public void SaveGeometryToImage(ArrayList geomCol,int width,int height,String filePath)
{
//首先处理一下列表,去掉有问题的数据。
int geomCount=geomCol.Count;
for(int geomIndex=geomCount-1;geomIndex>=0;geomIndex--)
{
IGeometry selGeom =geomCol[geomIndex] as IGeometry;
if(selGeom==null||selGeom.isEmpty())
{
geomCol.Remove(geoIndex);
}
}
//看看还有没有图形
geomCount=geomCol.Count;
if(geomCount<=0)
{
MessageBox.Show("指定的图形对象有问题,不能输出");
return ;
}
//开始计算总体范围
IEnvelope totalEnv=(geomCol[0] as IGeometry).Envelope;
for(int geomIndex=1;geomIndex<geomCount;geomIndex++)
{
totalEnv.Union(geomCol[geomIndex] as IGeometry).Envelope);
}
Image image=new Bitmap(width,height);
Graphics gc=Graphics.FromImage(image);
IntPtr hdc=gc.GetHdc();
ITransformation transformation=this.CreateTransformation(hdc,totalEnv,width,height);
for(int geomIndex=0;geomIndex<geomCount;geomIndex++)
{//一个一个输出了。
IGeometry drawGeom=geomCol[geomIndex] as IGeometry;
//根据几何图形来构造不同的符号。点有点的符号,线有线的符号,面有面的符号。
ISymbol drawSym=this.CreateSymbol(drawGeom);
drawSym.SetupDC((int)hdc,transformation);
drawSym.Draw(drawGeom);
drawSym.ReleaseDC();
}
//默认保存为Bmp也可以保存为其他的格式。
image.Save(filePath,System.Drawing.Imaging.ImageFormat.Bmp);
}
}
/**
*只输出一个图形的快捷方法
*/
public void SaveGeometryToImage(IGeometry geom,int width,int height,String filePath)
{
ArrayList list=new ArrayList();
list.add(geom);
this.SaveGeometryToImage(list,width,height,filePath);
}
这里还有一个方法没有写出来 CreateSymbol 就是根据一个IGeometry来建立一个符号,应该不很难就不写了。
对这个功能可能的扩展包括输出的时候是参数为Feature,而不是Geometry,那么就可以在建立符号的时候,根据Feature的内容来判断,可以达到不同的要素使用不同的符号输出的效果。
(本文已被浏览 次) | | |