ArcView中指定矩形区域地图输出的实现
ArcView软件由于其友好的用户界面和强大稳定的GIS功能而拥有较多用户。在ArcView 3.x软件中,其Layout模块提供了图形输出功能。利用系统提供的图形用户界面可以进行简单的图形输出,如对屏幕区域范围进行指定比例尺图形输出等。这种图形输出的特点是:ArcView的版面设计窗口输出相应视图窗口所显示视图区域的图形。如按缺省状态,系统产生一个包含整个视图图形区域的版面设计,这样的图形输出不能保证视图按用户所需要的比例尺进行输出;如设定版面的比例尺和图纸大小,系统可以按照给定的比例尺和图纸大小输出。由于ArcView中图形数据的存放是连续和成片的,手工操作无法保证视图窗口显示的视图区域就是用户严格要求绘图输出的区域,视图窗口显示的视图区域与用户所需的绘图区域总有微小的差异。这对于常规按图幅使用地形图的用户是非常不便的,甚至是无法容忍的。
实际应用当中,地图输出一般有两种情况:①常规的用图方法,按照地形图分幅输出标准规格尺寸的地图;②非常正规的灵活用图方法,按照地形图的比例尺,输出指定矩形区域地图。这个区域可以是跨图幅的或一个标准图幅的某个局部。针对ArcView地图输出的不足和地图输出的用户需求,笔者用ArcView的Avenue编程,实现了这两项地图的输出功能,实际上①是②的一个特例。以下给出实现任意指定矩形区域范围地图精确输出的方法、步骤、程序源代码及其解释,与读者共享。
一、输出的方法
1.任意指定区域范围,地图精确输出程序的编写思路。在ArcView输出过程中,实际包括两个坐标系:视图坐标系和绘图输出坐标系。图形输出时,就要建立两者之间的关系并保证所选择输出的视图区域严格按照指定比例尺输出。
2.给以上所编程序重命名。
系统新编的程序一般以“‘script’+数字”命名,程序编好并通过编译后可给其另起一便于记忆的程序名如LayoutAsPointedRectangle。
3.在系统之View模块的莱单栏或工具栏增加“任意指定区域范围,地图精确输出”的菜单项或工具项。
利用ArcView的Customize功能,将“任意指定区域范围,地图精确输出”菜单项或工具项增加至其菜单栏或工具栏中。当用户单击该菜单项或工具项时,系统将执行LayoutAsPointed Rectangle程序。
以上几步做好后,该项功能就可以使用了。
二、输出的步骤
1.指定地图单位和距离单位。在View模块的View菜单的Properties菜单项正确指定地图单位和距离单位(此两单位我国一般采用m)。
2.选择与所设计“任意指定区域范围,地图精确输出”模块相应的菜单项或工具项。鼠标单击“任意指定区域范围,地图精确输出”的菜单项或工具项,系统选定该项输出功能。
3.选择要输出地图的视图矩形区域。用鼠标在计算机屏幕上选择要输出地图的视图矩形区域,系统运行以上所编Avenue程序。系统产生一个版面。若为标准图幅,则输入图幅号,系统自动计算要输出图幅的地理坐标范围。
4.绘图输出或打印。在绘图仪或打印机上输出该区域地图。
三、输出的Avenue程序源代码
任意指定区域范围,地图精确输出的Avenue程序源代码如下:
theView=av.Find(“视图名”) ’获取要绘的视图
theMapDisplay=theView.GetDisplay ’得到地图显示器
aRect=theView.ReturnUserRect ’用地图坐标单位设定地图显示器上要绘图输出的矩形地图范围(地方坐标)
if(aRect.IsNil.Not)then
theMapDisplay.ZoomToRect(aRect) ’将地图显示器(视图)范围缩放为要绘图输出的矩形地图范围
theMapDisplay.InvalidateRect(aRect) ’令地图显示器(视图)无效使其重绘
theLayout=Layout.Make ’制作版面设计输出页
thePageDisplay=theLayout.GetDisplay ’获取版面设计输出页的页面显示器
thePageDisplay.SetPageSize(图纸横向长度@图纸纵向长度) ’设定输出图纸
’(页面显示器)的页面尺寸,此尺寸单位应为英寸
thePageExtent=thePageDisplay.ReturnPageExtent ’获取页面显示器的图纸范围(英寸)
thePageOrigin=thePageExtent.ReturnOrigin ’获取页面显示器图纸范围的左下角坐标(英寸)
theRect=Rect.Make(thePageOrigin,图纸绘图区域的横向长度@图纸绘图区域的纵向长度)
’指定页面绘图矩形区域(英寸为单位)
thePageDisplay.ZoomToRect(theRect) ’将页面显示器缩放至该页面绘图矩形区域
theVFrame = ViewFrame.Make(theRect) ’以该绘图矩形区域为界,制作视图框(viewframe)
theVFrame.SetView(theView,False) ’设定该视图框不随视图显示范围的变化而变化
theVFrame.SetScalePreserved(True) ’设定视图框比例尺保持不变
theVFrame.SetUserScale(用户指定的比例尺分母) ’设定用户输出地图的比例尺
theLayout.GetGraphics.Add(theVFrame) ’将要输出图形加到输出页
end
“thePageDisplay.SetPageSize(图纸横向长度@图纸纵向长度)”步骤中的两个参数计算方法是
图纸横向长度=aRect.GetWidth * Scale + deltaX
图纸纵向长度=aRect.GetHeight * Scale + deltaY
其中,Scale为用户输出地图的比例尺分母,deltaX和deltaY是不大于地图边框到图纸边缘距离的某个值。图纸横向长度和图纸纵向长度的最大值应小于等于绘图纸的长度,图纸横向长度和图纸纵向长度的最小值应小于等于绘图纸的宽度(这里假定绘图纸的长度大于宽度)。
“theRect = Rect.Make(thePageOrigin,图纸绘图区域的横向长度@图纸绘图区域的纵向长度)”步骤中
图纸绘图区域的横向长度应为aRect. ReturnWidth * Scale,图纸绘图区域的纵向长度应为aRect.ReturnHeight * Scale。
四、结束语
ArcView由于其优越的性能而广为GIS用户采用,但在图形输出和汉字注记方面的缺憾影响了其性能的进一步发挥。笔者所编程序完善了其图形输出功能,并已在北京市测绘供图信息查询系统和密云县城市规划管理信息系统中得到广泛应用。