点、线、面一体化地物符号形成方法

文档序号:6571766阅读:431来源:国知局
专利名称:点、线、面一体化地物符号形成方法
技术领域
本发明涉及一种地图、地理信息中地物符号的形成方法,具体说是一种点、线、面一体化地物符号形成方法。
背景技术
地图符号是地理空间的抽象,是用来修饰地图上对象的图形。根据地图符号的视觉变量和排列顺序来区分地物的类型、属性以及分布规律,也是地理信息系统(GIS)表达地理信息和空间概念的主要形式。
目前,一般的地物符号的形成方法大致相似,都为点、线、面独立的设计、形成方法。点、线和面符号的设计和形成各自独立,如ArcGIS符号设计系统中,点符号的设计利用现有的箭头符号、字体符号、图片和简单符号在符号编辑器里按分层叠加的方式组合设计新的点符号;用制图线、切线、点符号线、图片线和简单线组合叠加设计新的线形;面符号是在轮廓线范围内配置不同的点状符号、晕线、图片或颜色,填充方式包括渐变颜色填充、阴影线填充、点符号填充、图片填充和简单颜色填充。SuperMap Deskpro提供了线型编辑能力,但只能其线型库编辑器环境中提供的41种子线型模板的基础上通过调整线模板的参数来组合线型。因此,目前这种相对独立的符号设计形成方法,限制了符号表达的丰富程度和用户符号的自定义能力。

发明内容
本发明的目的是,针对目前点、线、面设计和形成独立化,导致符号自定义能力差情况,提供一种点、线、面一体化地物符号形成方法,在传统符号形成方法的基础上,将地图符号分解为多个图素,并按一定的顺序绘制图素,只要合理划分基本图素、每一种图素的绘制算法精确,线可以由自定义的点组成,面可以有自定义的线或点组成,那么任何用户都可以在一个可视化的界面里设计自己需要的地图符号,从而使得符号的可编辑性和可维护性大大增强。
本发明方法的基础是点、线、面三种符号的分层叠加方法,即将每个符号都分解为一个个独立的图素,这些图素都有各自的绘制参数和绘制方法,通过调用响应的绘制方法就可以实现在图元编辑器和GIS的MAP控件上地物符号的形成。点、线、面三种符号是相互关联的,如点图元和线图元都可以作为面图元的一个图素,当点图元的样式改变也会改变以该点图元为填充方式的面图元的填充样式。具体思路是(1)将点、线、面分解为图素;(2)点、线、面采用分层形成的方式;(3)线、面的形成采用参数化方式;(4)点、线修改后,利用点、线填充的面同步更新。
本发明点、线、面一体化地物符号形成方法,包括如下步骤(1)定义符号图素集合,具体包括点、线和面图素集合,点图素的集合表示为PT={pt1,pt2,pt3,pt4,pt5,pt6,pt7,pt8,pt9,pt10,pt11}、其中pti为点符号的有效图素,依次为线图素、三角形图素、填充三角形、椭圆、填充椭圆、弧、文字、矩形、填充矩形、圆、填充圆;线图素的集合表示为LT={lt1,lt2,lt3,lt4,∑PTi},其中包括四种基础图素(实线SolidLine、切线HashLine断线DashLine点线DotLine)和一个特殊图素---点符号(∑PTi);面图素集合表示为,
RT={rt1,rt2,∑LTi∑PTj},其中的∑LTi代表线符号,∑PTj表示点符号;(2)点符号的形成,首先选择点图素RT,多个点图素的组合,形成点符号PS=Σi=1∞PT;]]>(3)线符号的形成,普通的线符号由多个线图素组成的LS=Σi=1∞LT,]]>同时可以根据条件(是否选择修饰点,Sele=0表示“否”,其他的值表示“是”)来确定是否进行点填充,拓展后的线符号表达为LS=Σi=1∞LTSele=0Σi=1∞LT+PSSele≠0]]>上式代表的是先判断是否需要进行点符号的填充算法,如果需要,先选择点符号PS,然后插入到线符号的形成过程中;如果不需要,则按照传统线符号直接通过公式LS=Σi=1∞LT]]>生成;(4)面符号的形成,面符号包含多个简单面图素,例如位图、颜色等,同时允许填充线符号和点符号,线符号填充的变量为SeleL(0表示否,其他表示是),点符号填充的变量为SeleP(0表示否,其他表示是),面符号的综合表达为RS=Σi=1∞RTSeleL=0SeleL=0Σi=1∞RT+PS+LSSeleL≠0SeleL≠0Σi=1∞RT+PSSeleL=0SeleL≠0Σi=1∞RT+LSSeleL≠0SeleL=0]]>上式代表的是是否需要填充的四种情况,先判断是否进行点符号填充,如果需要先选择点符号,然后按照步骤(2),填充点符号;如果需要进行线填充,先选择线符号,然后按照步骤(3),最后完成线符号的填充;如果都不需要,则按照传统面符号的形成方法RS=Σi=1∞RT]]>生成面符号。
本发明方法,在传统的符号形成方法的基础之上,通过对点、线、面各个符号图素的解析,扩展了符号的自定义能力。本发明方法提供了扩展符号自定义能力的渠道,其核心思想是提取符号共有的几何特性,也就是图素;自定义点、线、面;面图元的点填充方式和线填充方式都是采用了自定义的点符号和线符号,修改点符号和线符号后,同时也会使面符号的相应的点填充和线填充方式发生改变,充分体现了一体化的思想,对于提高GIS地图符号表达能力有更大的作用。


图1为本发明方法的程序流程框图;具体实施方式
下面结合附图和实施例对本发明作进一步详细说明。
实施例 在计算机上实现本发明方法的实例。如图1所示,包括如下步骤(1)定义符号图素集合,具体包括点、线和面图素集合,点图素的集合表示为PT={pt1,pt2,pt3,pt4,pt5,pt6,pt7,pt8,pt9,pt10,pt11}、其中pti为点符号的有效图素,依次为线图素、三角形图素、填充三角形、椭圆、填充椭圆、弧、文字、矩形、填充矩形、圆、填充圆;线图素的集合表示为LT={lt1,lt2,lt3,lt4,∑PTi},其中包括四种基础图素(实线SolidLine、切线HashLine断线DashLine点线DotLine)和一个特殊图素---点符号(∑PTi);面图素集合表示为,RT={rt1,rt2,∑LTi∑PTj},其中的∑LTi代表线符号,∑PTj表示点符号;(2)点符号的形成,首先选择点图素RT,多个点图素的组合,形成点符号PS=Σi=1∞PT;]]>对于每一个点符号,我们可以把它看成多个图素的组合。点符号的图素包括直线、三角形、圆、矩形、文字等。每一个图素都有一些绘制参数,绘制参数不同,是同一种图素具有不同的表现形式,如三角形有空心三角形和颜色填充三角形,圆有椭圆和圆,矩形有空心矩形和颜色填充矩形。选择图素、输入相应的参数,确定各图素的坐标,就可以实现点符号形成。
用计算机实施点符号形成的过程1)选择需要生成的图元,设置目前的绘制状态,程序模块如下procedure TFrmTy.SetBtn(Sender:TObject);
beginOperation.SetBtn(Sender);
with Sender as TToolButton doPointStatus.Panels
.Text:=caption;
Operation.PointTYimageRefresh;
end;
2)把需要生成的图元形成在画布上。程序模如下proccdure TFrmTy.PointImageMouseDown(Sender:TObject;Button;TMouseButton;Shift:TShiftState;X,Y:Integer);beginCase Button ofMbLeft:beginXYSnapGW(X,Y,TempX,TempY);
if Use_Figure<>nil then beginPointSetStatue;Use_Figure.OnMouseDown(PointImage.Canvas,Button,Shift,TempX,TempY);
end;end;MbRight:BeginUpdate.Enabled:=true;Operation.SaveCurData;Operation.PointTYimageRefresh;
end;end;end;procedure TFrmTy.PointImageMouseUp(SenderTObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);beginXYSnapGW(X,Y,TempX,TempY);if Use_Figure<>nil then beginif(Use_Figure.Begin_Draw=true)and(Use_Figure.end_draw<>true)thenOperation.PointTYimageRefresh;PointSetStatue;
Use_Figure.OnMouseUp(PointImage.Canvas,Button,Shift,TempX,TempY);end;end;procedure TFrmTy.PointImageMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);beginMx.Caption:=inttostr(X);My.Caption:=inttostr(Y);ifUse_Figure<>nil thenif(Use_Figure.Begin_Draw=true)and(Use_Figure.end_draw<>true)then beginOperation.PointTYimageRefresh;
Use_Figure.OnMouseMove(PointImage.Canvas,Shift,X,Y);
end;end;
3)选择不同的图元,重复以上方法,并且把形成的数据保存起来。procedure TPublic.UpdateData;beginCurPointSymbol.FHBM:=FHBM;if Line_List<>nil thenwith Line_List dobeginCurPointSymbol.LineNumber:=count;
setlength(CurPointSymbol.P_LineArr,count);
for i:=0 to count-1 dowith items[i]dobeginLux:=X1;Luy:=Y1;RBX:=X2;RBY:=Y2;
CurPointSymbol.P_LineArr[i].TSBM:=No;
CurPointSymbol.P_LineArr[i].fstx:=Lux;
CurPointSymbol.P_LineArr[i].fsty:=Luy;
CurPointSymbol.P_LineArr[i].secx:=RBX;
CurPointSymbol.P_LineArr[i].secy:=RBY;
CurPointSymbol.P_LineArr[i].color:=Pencolor;
end;
end;//Rect Ellipse Tri text的存储方法类似//把CurPointSymbol写回符号数据库;FrmTY.mGraphics.SetPSym(CurPointSymbol);TYEdit.FrmTY.mGraphics.SetOpr(FHBM,3);end;(3)线符号的形成,普通的线符号由多个线图素组成的LS=Σi=1∞LT,]]>同时可以根据条件(是否选择修饰点,Sele=0表示“否”,其他的值表示“是”)来确定是否进行点填充,拓展后的线符号表达为LS=Σi=1∞LTSele=0Σi=1∞LT+PSSele≠0]]>上式代表的是先判断是否需要进行点符号的填充算法,如果需要,先选择点符号PS,然后插入到线符号的绘制过程中;如果不需要,则按照传统线符号直接通过公式LS=Σi=1∞LT]]>生成;从线型的规范性和可构建的角度出发,可以将线型符号分为四种图素,即四种基本线型实线、断线、切线和点线。每一种都具有很多形成参数(如线长、线宽、偏移、间隔等)使得基本线型的表现各异,GIS中的线型就是一个或多个图素按形成参数形成并叠加起来的。具有丰富表现形式的四种图素能充分满足线型设计的要求。
基线是线型形成的参照物,各种图素都是根据基线的坐标对串来绘制的。实线是按一定的偏移值、线宽和颜色绘制的平行或重合于基线的折线,断线表现为与基线平行或重合的定长线段、矩形或多边形,切线表示为与基线相交的直线段或矩形,点线是指圆心线平行或重合于基线,按一定的半径和填充方式形成的圆。断线、切线和点线都是按首间隔、间隔、偏移、填充、线长、角度等参数在基线上的循环配置,参数是否合理、是否具有可操作性对于整个线型的形成效果非常重要。
用计算机实施线符号形成的过程1)选择需要生成的线图素,设置生成参数,程序模块如下procedure TFrmTy.CBLineTypeChange(Sender:TObject);begincase CBLineType.Itemindex of0:PageSimpleLine.Visible:=true;
1 PageDash.Visible:=true;
2:PageHarsh.Visible:=true;
3:PageDot.Visible:=true;
else PageMark.Visible:=true;end;procedure ResetLayer;beginif hasbeginpoint or hasendpoint then FreshLineImage;if m_solidlist<>nil thenfor i:=0 to m_solidlist.Count-1 do beginmBM:=m_solidlist.Items[i].bm;if mBM=strtoint(n_SymID)thenbeginm_solidlist.Items[i].Color:=TYEdit.FrmTY.Pane18.Color;m_solidlist.Items[i].LineWidth:=TYEdit.FrmTY.SpinEdit2.Value;m_solidlist.Items[i].OffSet:=TYEdit.FrmTY.SpinEdit13.Value;TYEdit.FrmTY.ListBox1.Repaint;FreshLineImage;exit;end;end;//其他的线图素依此类推end;2)按照上一步选择的参数,生成线图素,程序模块如下procedure TFrmTy.ListBox1DrawItem(Control:TWinControl;Index:Integer;Rect:TRect;State:TOwnerDrawState);beginmCanvas:=TListBox(Control).Canvas;x1:=Rect.left;
y1:=rect.top+listBox1.ItemHeight div 2;x2:=rect.Right;
if odSelected in State thenbeginSelectRect(mCanvas,Rect);m_SymID:=listBOx1.Items[index];
comm_Function.Draw(mCanvas,x1,x2,y1);
endelse beginClearRect(mCanvas,Rect);m_SymID:=listBOx1.Items[Index];
comm_Function.Draw(mCanvas,x1,x2,y1);
end;end;
3)选择填充参数,在线符号中调用填充方法填充点符号。程序模块如下procedure TFrmTy,beginpointselectClick(Sender:TObject);beginFrmPointDialog:=TFrmPointDialog.Create(Application);tryFrmPointDialog.ShowModal;Curfhbm:=FrmPointDialog.returncode;if Curfhbm=-1 thenbeginbeginpointcheck.Checked:=false;
beginpointselect.Enabled:=false;
hasbeginpoint:=false;ResetLayer;endelse beginbeginPoint:=GETL_Marker_TS(inttostr(Curfhbm));ResetLayer;end;finallyFrmPointDialog.Destroy;end;end;4)线符号数据保存,其中包括点符号的信息。程序模块如下Procedure SaveToDataBase;begincur_LineSymbol.FHBM:=n_FHBM;if m_SolidList<>nil thenwith m_SolidList dobeginfor i:=0 to count-1 dobegincur_LineSymbol.SolidNumber:=cur_LineSymbol.SolidNumber+1;
setlength(cur_LineSymbol.L_SolidArr,cur_LineSymbol.SolidNumber);
cur_LineSymbol.L_SolidArr[i]TSBM:=items[i].TSBM;
cur_LineSymbol.L_SolidArr[i].Color:=items[i].Color;
cur_LineSymbol.L_SolidArr[i].LineWidth:=items[i].linewidth;
cur_LineSymbol.L_SolidArr[i].offset:=items[i].Offset;
end;
end;//DashLine HashLine DotLine MarkLin与上述存储方法一样//保存两个端点的点符号if hasbeginpoint thenbegincur_LineSymbol.IfhaveSTpt:=1;
SetFHBM0(beginpoint);
cur_LineSymbol.StartPoint:=beginpoint;
end clse cur_LineSymbol.IfhaveSTpt:=0;
if hasendpoint thenbegincur_LineSymbol.IfHaveEDpt:=1;
SetFHBM0(endpoint);
cur_LineSymbol.EndPoint:=endpoint;
end else cur_LineSymbol.IfHaveEDpt:=0;FrmTY.mGraphics.SetLSym(cur_LineSymbol);TYEdit.FrmTY.mGraphics.SetOpr(n_FHBM,3);end;
(4)面符号的形成,面符号包含多个简单面图素,例如位图、颜色等,同时允许填充线符号和点符号,线符号填充的变量为SeleL(0表示否,其他表示是),点符号填充的变量为SeleP(0表示否,其他表示是),面符号的综合表达为RS=Σi=1∞RTSeleL=0SeleL=0Σi=1∞RT+PS+LSSeleL≠0SeleL≠0Σi=1∞RT+PSSeleL=0SeleL≠0Σi=1∞RT+LSSeleL≠0SeleL=0]]>上式代表的是是否需要填充的四种情况,先判断是否进行点符号填充,如果需要先选择点符号,然后按照步骤(2),填充点符号;如果需要进行线填充,先选择线符号,然后按照步骤(3),最后完成线符号的填充;如果都不需要,则按照传统面符号的形成方法RS=Σi=1∞RT]]>生成面符号。
面符号的形成过程有颜色填充、点填充、线填充和图片填充,点填充是指把点符号按间隔、比例和角度重复绘制来填充区域;线填充是指线符号按角度和间隔重复绘制来填充区域。一体化的方法体现在面符号的点、线图素(符号)的填充上。
用计算机实施线符号形成的过程1)线图素填充,程序模块如下procedure TR_line.Draw(Ecanvas:TCanvas;rect1:trect);begintemp_drawLine:=TPublic_Line.Create;trytemp_drawLine.GetAllLineTS(Line_TS);ifenable_color=1 then temp_drawLine.draw_L_atregionSetColor(color);if offset>Separation then offset:=offset mod Separation;case(angle mod 180) of0:
beginy1:=rect1.Top;i:=1;
hile(y1>=rect1.Top)and(y1<=rect1.Bottom)do beginx1:=rect1.Left;y1:=offset+(i-1)*Separation+rect1.Top;x2:=rect1.Right;y2:=offset+(i-1)*Separation+rect1.Top;
if(y1>=rect1.Top)and(y1<=rect1.Bottom)then begintempstr:=inttostr(x1)+′,′+inttostr(y1)+′,′+inttostr(x2)+′,′+inttostr(y2);
temp_drawLine.draw_L_atregion(Ecanvas.Handle,tempstr);
end;i:=i+1;
end;end;
1.89:
beginh1:=0;i:=1;jd:=(angle mod 180)*3.14/180;h:=trunc((rect1.Bottom-rect1.top)/cos(Jd)+(rectl.Right-rect1.Left)*sin(Jd)-(rect1.Bottom-rect1.Top)*sin(Jd)*sin(Jd)/cos(Jd));
buttom_X:=0;m:=0;step_x:=trunc(Separation/sin(Jd));step_y:=trunc(Separation/cos(Jd));
offset_X:=trunc(offset/sin(Jd));offset_y:=trunc(offset/cos(Jd));
while h1<h do beginh1:=offset+(i-1)*Separation;
ifh1<h then beginx1:=rect1.Left+offset_X+(i-1)*step_x;y1:=rect1.top;
y2:=rect1.top+offset_y+(i-1)*step_y;x2:=rect1.Left;
ify2>rect1.Bottom then beginm:=m+1;
ifm=1 then buttom X:=rect1.Left+round(round((y2-rect1.Bottom)/sin(Jd))*cos(Jd));
x2:=buttom_X+(m-1)*step_x;y2:=rect1.Bottom;
end;
tempstr:=inttostr(x1)+′,′+inttostr(y1)+′,′+inttostr(x2)+′,′+inttostr(y2);
temp_drawLine.draw_L_atregion(Ecanvas.Handle,tempstr);
end;
i:=i+1;
end;end;
90:
……2)点图素填充,程序模块如下procedure TR_marker.Draw(Ecanvas:TCanvas;rect1:trect);begininherited;trytemp_drawPoint:=Tpublic_point.Create;
temp_drawPoint.GetAllMarkerTS(Marker_TS);
if enable_color=1 thentemp_drawPoint.draw_P_atregionSetColor(color);
H:=true;L:=true;
x:=rect1.left+(offet_x mod Separation_x)+10;
y:=rect1.top+(offset_y mod Separation_y)+10;
setlength(pointarr,0);offsetx:=x;offsety:=y;
while L dobeginwhile H dobeginsetlength(pointarr,length(pointarr)+1);
pointarr[length(pointarr)-1].X:=offsetx;
pointarr[length(pointarr)-1].y:=offsety;
offsetx:=offsetx+Separation_x;
if offsetx>rect1.Right then H:=false;
end;
offsetx:=rect1.left+10+(offset_x mod Separation_x);
offsety:=offsety+Separation y;
if offsety>rect1.Bottom then L:=false;
H:=true;
end;
//调用外部程序for i:=low(pointarr)to high(pointarr)dobegin
tempstr:=inttostr(pointarr[i].x)+′,′+inttostr(pointarr[i].y);
temp_drawPoint.Set_ScalePatR(scale/10);
temp_drawPoint.draw_P_atregion(Ecanvas.Handle,tempstr);
end;finallypointarr:=nil;end;end.
权利要求
1.点、线、面一体化地物符号形成方法,包括如下步骤A、定义符号图素集合,即点、线和面图素集合,——点图素的集合表示为PT={pt1,pt2,pt3,pt4,pt5,pt6,pt7,pt8,pt9,pt10,pt11};——线图素的集合表示为LT={lt1,lt2,lt3,lt4,∑PTi};——面图素集合表示为,RT={rt1,rt2,∑LTi∑PTj};B、点符号的形成,首先选择点图素RT,多个点图素的组合,形成点符号PS=Σi=1∞RT;]]>C、线符号的形成,根据条件来确定是否进行点填充,拓展后的线符号表达为LS=Σi=1∞LTSele=0Σi=1∞LT+PSSele≠0]]>上式代表的是先判断是否需要进行点符号的填充算法,如果需要,先选择点符号PS,然后插入到线符号的形成过程中;如果不需要,则按照传统线符号直接通过公式LS=Σi=1∞LT]]>生成;D、面符号的形成,面符号包含多个简单面图素,同时允许填充线符号和点符号,线符号填充的变量为SeleL,点符号填充的变量为SeleP,面符号的综合表达为RS=Σi=1∞RTSeleL=0SeleL=0Σi=1∞RT+PS+LSSeleL≠0SeleL≠0Σi=1∞RT+PSSeleL=0SeleL≠0Σi=1∞RT+LSSeleL≠0SeleL=0]]>上式代表的是是否需要填充的四种情况,先判断是否进行点符号填充,如果需要先选择点符号,然后按照步骤B,填充点符号;如果需要进行线填充,先选择线符号,然后按照步骤C,最后完成线符号的填充;如果都不需要,则按照传统面符号的形成方法RS=Σi=1∞RT]]>生成面符号。
全文摘要
本发明公开了一种点、线、面一体化地物符号形成方法,包括如下步骤A、定义符号图素集合;B、选择点图素RT,多个点图素的组合,形成点符号;C、线符号的形成,根据条件来确定是否进行点填充,如果需要填充,先选择点符号PS,然后插入到线符号的绘制过程中;如果不需要,则按照传统线符号生成;D、面符号的形成,面符号包含多个简单面图素,同时允许填充线符号和点符号,先判断是否进行点符号填充,如果需要先选择点符号,然后按照步骤B填充点符号;如果需要进行线填充,先选择线符号,然后按照步骤C完成线符号的填充;如果都不需要,则按照传统面符号生成面符号。本发明方法,通过对点、线、面各个符号图素的解析,扩展了符号的自定义能力。
文档编号G06F17/30GK101075244SQ20071002139
公开日2007年11月21日 申请日期2007年4月11日 优先权日2007年4月11日
发明者焦东来, 朱虹, 张书亮 申请人:南京师范大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1