cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5917
  • QQ14265545
  • 铜币29669枚
  • 威望217点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
阅读:1392回复:1

MapObjects地图填充符号库扩展

楼主#
更多 发布于:2007-12-02 10:13
在地图制图学中,将所有的地图符号划分为三大类:点状符号、线状符号和面状符号。<BR><BR>    各种GIS平台都有自己的符号库用于地物的表示。ESRI的ArcMap中就提供了非常丰富的地图符号库,在安装目录下的Bin\Styles目录中你会 发现许多以.Style的文件,这些文件中存储的就是一些符号信息。另外安装目录下的Styles目录中有许多以.ServerStyle为扩展名的文 件,这些也是ESRI提供符号库文件,不过这些是专门提供给ArcGis Engine使用的。关于.Style和.ServerStyle的信息访问<a href="http://www.esri.com/" target="_blank" ><FONT color=#003399>www.esri.com</FONT></A>可以获得更多的信息。通过这些符号库用户可以在ArcMap中制作出各式各样的专题地图。ArcMap中提供的符号信息非常丰富,基本满足了用户的需求,当然在不够用的情况下还可以自己增加符号库中的符号,甚至制作一套自己的符号库。<BR><BR>    MapObjects是ESRI提供的一组供应用开发人员使用的制图与GIS功能组件。它由一个OLE控件和一系列可编程OLE对象组成。利用 MapObjects, 开发人员可以在应用程序中添加制图和GIS功能。由于利用MapObjects组件开发出系统开销小,开发周期也相对短些,因此许多应用系统都采用它。 ArcGIS Engine是ESRI ArcGIS 9系列中推出的高级地图应用组件,功能非常强大开发也非常容易,对于MapObjects和ArcGIS Engine ESRI的观点好象是更推荐使用ArcGIS Engine进行开发,不过ArcGIS Engine占系统资源多,普通配置的机器运行ArcGIS Engine开发出来的系统比较慢。<BR><BR>    还是回到符号上来,MapObjects对点、线、面地理要素分别提供了相应的符号。<BR><BR>    1、点符号:MapObjects提供了4个基本的点符号,不过可以通过TrueType字体对点符号进行扩充,如:Wingdings索引为81的符号 就是一架小飞机了。可以用造字程序创建自己的TrueType字体符号库,Font Creator Program 是一个TrueType字体造字程序非常好用。另外还可以实现ICustomMarker进行扩充。不过使用TrueType字体比实现 ICustomMarker的操作更为有效方便。<BR><BR>    2、线符号:MapObjects只提供5个基本的线符号,需要更多的线型只能自己通过实现ICustomLine接口来扩充。<BR><BR>    3、面符号:MapObjects中包含11中填充的符号。与点、线符号类似可以通过实现ICustomFill进行扩充。
<P>    下面主要讨论Dotnet C# 实现MapObjects面符号的扩充。我们知道WIN API提供了位图画刷,且画刷可以支持彩色相关位图及设备不相关位图。因此我们可以通过位图BITMAP构建画刷进行面区域的填充,如果完全通过底层的 WIN API从图片创建BITMAP位图填充的画刷,对于API不太了解的人来说感觉很麻烦。不过还好通过Dotnet框架只需要几个API就可以搞定了,而且 还可以很好的对这些符号进行组织,如:增加、删除、编辑、存档等。<BR><BR>    下面是需要用到的WINAPI函数: <BR><BR>
<TABLE cellSpacing=1 cellPadding=4 width="90%" align=center bgColor=#999999 border=0>

<TR>
<TD bgColor=#cccccc> <FONT color=#0000ff>#region</FONT> 调用Windows API 的GDI函数<BR>[DllImport("gdi32.dll", EntryPoint="PolyPolygon")]<BR><FONT color=#0000ff>public static extern int</FONT> PolyPolygon (<BR> <FONT color=#0000ff>int</FONT> hdc,<BR> <FONT color=#0000ff>ref</FONT> int lpPoint,<BR> <FONT color=#0000ff>ref</FONT> int lpPolyCounts,<BR> <FONT color=#0000ff>int</FONT> nCount<BR> );<FONT color=#339933>//绘制多边形</FONT><BR>[DllImport("gdi32.dll", EntryPoint="CreatePen")]<BR><FONT color=#0000ff>public static extern int</FONT> CreatePen (<BR> <FONT color=#0000ff>int</FONT> nPenStyle,<BR> <FONT color=#0000ff>int</FONT> nWidth,<BR> <FONT color=#0000ff>int</FONT> crColor<BR> );<FONT color=#339933>//创建画笔</FONT><BR>[DllImport("gdi32.dll", EntryPoint="SelectObject")]<BR><FONT color=#0000ff>public static extern int</FONT> SelectObject (<BR> <FONT color=#0000ff>int</FONT> hdc,<BR> <FONT color=#0000ff>int</FONT> hObject<BR> ); <FONT color=#339933>//将对象[画笔、画刷、位图等]选入指定的设备描述表</FONT><BR>[DllImport("gdi32.dll", EntryPoint="DeleteObject")]<BR><FONT color=#0000ff>public static extern int</FONT> DeleteObject (<BR><FONT color=#0000ff> int</FONT> hObject<BR> );<FONT color=#339933>//删除对象 释放资源</FONT><BR>[DllImport("gdi32.dll", EntryPoint="CreatePatternBrush")]<BR><FONT color=#0000ff>public static extern int</FONT> CreatePatternBrush (<BR> <FONT color=#0000ff>int</FONT> hBitmap<BR> );<FONT color=#339933>//通过位图创建画刷</FONT><BR><FONT color=#0000ff>#endregion</FONT></TD></TR></TABLE><BR>    为了更好的组织符号信息以及利于复用,可以编写两个可以序列化[Serializable]的类:填充符号:PatternStyle和符号集:StyleContainer<BR><BR>    <STRONG>PatternStyle</STRONG>: 描述符号的基本信息:符号内容即图象[Image]、符号名称[PatternName]、符号描述[PatternDescription]。<BR><BR>    <STRONG>StyleContainer</STRONG>: 是一系列PatternStyle的集合,并包含一些增、删、修改PatternStyle的方法以及保存和打开二进字填充样式文件 [*.pattern]的静态方法。标明[Serializable]的类在Dotnet中可以方便的进行序列化存储为本地的文件。标明 [Serializable]的类的存取:<BR><BR>
<TABLE cellSpacing=1 cellPadding=4 width="90%" align=center bgColor=#999999 border=0>

<TR>
<TD bgColor=#cccccc><FONT color=#666666>/// <summary><BR>/// <FONT color=#000000>读去填充样式文件</FONT><BR>/// </summary><BR>/// <param name="filename"><FONT color=#000000>样式文件路径</FONT></param></FONT><BR><FONT color=#0000ff>public static </FONT>StyleContainer LoadStyles(<FONT color=#0000ff>string</FONT> filename)<BR>{<BR> <FONT color=#0000ff>try</FONT><BR> {<BR>  Stream StreamRead = File.OpenRead(filename);<BR>  BinaryFormatter BinaryRead = <FONT color=#0000ff>new</FONT> BinaryFormatter();<BR>  StyleContainer StyleContainerObj =  BinaryRead.Deserialize(StreamRead) as StyleContainer;<BR>  StreamRead.Close();<BR>  <FONT color=#0000ff>return</FONT> StyleContainerObj;<BR> }<BR> <FONT color=#0000ff>catch</FONT><BR> {<BR>  <FONT color=#0000ff>return null</FONT>;<BR> }<BR>}<BR><FONT color=#666666>/// <summary><BR>/// <FONT color=#000000>保存填充样式文件</FONT><BR>/// </summary><BR>/// <param name="styles"><FONT color=#000000>StyleContainer对象</FONT></param><BR>/// <param name="filename"><FONT color=#000000>存储文件名</FONT></param></FONT><BR><FONT color=#0000ff>public static void</FONT> SaveStyles(StyleContainer styles,<FONT color=#0000ff>string</FONT> filename)<BR>{   <BR> Stream StreamWrite = File.Create(filename);<BR> BinaryFormatter BinaryWrite = <FONT color=#0000ff>new</FONT> BinaryFormatter();<BR> BinaryWrite.Serialize(StreamWrite,styles);<BR> StreamWrite.Close();<BR>}
</TD></TR></TABLE></P>
<P>实现ICustomFill接口,主要实现SetupDC、ResetDC和Draw三个函数。</P>
<TABLE cellSpacing=1 cellPadding=4 width="90%" align=center bgColor=#999999 border=0>

<TR>
<TD bgColor=#cccccc>
<P><FONT color=#0000ff>private int</FONT> g_hOldPen;<BR><FONT color=#0000ff>private int</FONT> g_hPen;<BR><FONT color=#0000ff>private int</FONT> g_hOldBrush;<BR><FONT color=#0000ff>private int</FONT> g_hBrush;<BR><FONT color=#0000ff>private</FONT> PatternStyle m_PatternStyle; <BR><BR><FONT color=#0000ff>#region</FONT> ICustomFill 成员<BR><BR><FONT color=#0000ff>public void</FONT> ResetDC(<FONT color=#0000ff>int</FONT> hDC)<BR>{<BR> <FONT color=#339933>// TOD  添加 Polygons.ResetDC 实现<BR> //释放资源</FONT><BR> <FONT color=#0000ff>if</FONT>(<FONT color=#0000ff>this</FONT>.g_hPen != 0)<BR> {<BR>  SelectObject(hDC,g_hOldPen);<BR>  DeleteObject(g_hPen);    <BR> }<BR> <FONT color=#0000ff>if</FONT>(<FONT color=#0000ff>this</FONT>.g_hOldBrush != 0)<BR> {<BR>  SelectObject(hDC,g_hOldBrush);<BR>  DeleteObject(g_hBrush);<BR> }<BR>}</P>
<P><FONT color=#0000ff>public void</FONT> SetupDC(<FONT color=#0000ff>int</FONT> hDC, <FONT color=#0000ff>double</FONT> dpi, <FONT color=#0000ff>object</FONT> pBaseSym)<BR>{<BR> <FONT color=#339933>// TOD  添加 Polygons.SetupDC 实现<BR> //边界样式</FONT><BR> ESRI.MapObjects2.Core.Symbol sym = pBaseSym <FONT color=#0000ff>as</FONT> ESRI.MapObjects2.Core.Symbol;<BR> g_hPen = CreatePen(sym.Style,sym.Size,(<FONT color=#0000ff>int</FONT>)sym.Color);   <BR> <FONT color=#339933>//通过GDI+和API从Bitmap创建画刷</FONT><BR> System.Drawing.Bitmap bmp =( System.Drawing.Bitmap)<FONT color=#0000ff>this</FONT>.m_PatternStyle.Image;    <BR> <FONT color=#0000ff>int</FONT> ibmp = bmp.GetHbitmap().ToInt32();<BR> g_hBrush = CreatePatternBrush(ibmp);<BR> DeleteObject(ibmp);<BR>}</P>
<P><FONT color=#0000ff>public void</FONT> Draw(<FONT color=#0000ff>int</FONT> hDC, <FONT color=#0000ff>ref</FONT> <FONT color=#0000ff>int</FONT> points, <FONT color=#0000ff>ref int</FONT> partCounts, <FONT color=#0000ff>int</FONT> numParts)<BR>{<BR> <FONT color=#339933>// TOD  添加 Polygons.Draw 实现   <BR> //将画笔、画刷选入当前的设备描述表</FONT><BR> <FONT color=#0000ff>this</FONT>.g_hOldPen  = SelectObject(hDC, g_hPen);<BR> <FONT color=#0000ff>this</FONT>.g_hOldBrush = SelectObject(hDC,g_hBrush);<BR> <FONT color=#339933>//绘制多边形</FONT><BR> PolyPolygon(hDC,<FONT color=#0000ff>ref</FONT> points,<FONT color=#0000ff>ref</FONT> partCounts,numParts);<BR>}<BR><FONT color=#0000ff>#endregion</FONT></P></TD></TR></TABLE><BR>应用示例:<BR>
<P align=center><IMG src="http://www.gispower.org/Files/Remoteupfile/2007-11/12/2005712131037.gif"><BR><BR>图一、单一符号填充效果<BR><BR><IMG src="http://www.gispower.org/Files/Remoteupfile/2007-11/12/2005712131049.gif"><BR><BR>图二、独立值填充效果</P>
<P align=center><BR> </P>
喜欢0 评分0
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
cafecat
路人甲
路人甲
  • 注册日期2003-07-29
  • 发帖数375
  • QQ
  • 铜币894枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2007-12-15 20:47
服就一个字!!!            
http://3s2go.blogspot.com/
举报 回复(0) 喜欢(0)     评分
游客

返回顶部