MapBasic在城市部件数据生产中的实践与应用Word格式文档下载.docx
《MapBasic在城市部件数据生产中的实践与应用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《MapBasic在城市部件数据生产中的实践与应用Word格式文档下载.docx(7页珍藏版)》请在冰豆网上搜索。
Include“icons.def”
include“mapbasic.def”
DeclareSubMain
DeclareSubdraw_via_button
SubMain
CreateButtonPad“工具条”As
ToolButton
Callingdraw_via_button
ID149
Icon149File“ICO32.DLL”‘创建图标文件
HelpMsg“\n公交站亭”
ID151
Icon151File“ICO32.DLL”
HelpMsg“\n交通标志牌”
.…..
Width2
show
EndSub
Subdraw_via_button
dimsym_makepIfMapId&
gt;
0then
MapNm=LayerInfo(FtWin,MapId,LAYER_INFO_NAME)
Else
Note“请将图层设为可编辑!
”
ExitSub
EndIf
Tlid=CommandInfo(CMD_INFO_TOOLBTN)
DoCaseTlid
Case149
FtId=74
Case151
FtId=80
.......
EndCase
x1=CommandInfo(CMD_INFO_X)
y1=CommandInfo(CMD_INFO_Y)
sym_maker=MakeFontSymbol(FtId,BLACK,12,”bujian07”,0,0)
CreatePointintoVariableObjPt(x1,y1)Symbolsym_maker
Endsub
1.2合并图层
在城市部件生产过程中,数据需要分给不同的作业员进行处理,处理完的数据又需要重新合并。
如果碰到数据量比较大,需要合并的图层多时,很费时间。
这时,将图层合并进行批处理,会极大的提高工作效率。
下面的代码,说明了多层图层的合并,怎样进行批处理。
CreateMenu“批处理表”As
“合并图层”Callingbatch_packtable
AlterMenuBarAdd“批处理表”
Subbatch_packtable
&
amp;
acute;
循环控制变量
DimiAsinteger
DimTabNumAsinteger&
一次打开的表的数量
DimTabNameAsstring&
存取表名的变量
DimNameList
(1)Asstring
DimListNumAsinteger&
初始表名数组大小
RunMenuCommandM_File_Open
TabNum=NumTables()
ListNum=UBound(NameList)&
得到数组的大小
ReDimNameList(TabNum)
循环访问得到表的名字
Fori=1toTabNum&
TabName=TableInfo(i,TAB_INFO_NAME)
NameList(i)=TabName
Next
TabName=NameList(i)
OpenTable”D:
\合并图层.tab”as合并图层
InsertInto合并图层
select*fromTabName
ClosetableTabName
committable合并图层
CloseTable合并图层
1.3新增部件添加流水号
城市部件数据是一种不断变化的数据,每年都有新增、删除和变更。
对新增的城市部件数据需要按照地理数据建设标准加上流水号,城市部件流水号是唯一的,新增的城市部件流水号必须在往年的基础上增加,使用mapbasic的功能,找到往年流水号中的最大值,将新增部件的流水号在此基础上增加,就不会出现号码重复的情况,从而保证的标识码的唯一性。
下面用程序说明怎样给新增部件添加流水号。
include“MENU.def”
DeclareSubseparate_table
CreateMenu“部件批处理”As
“加标识码”Callingseparate_table
AlterMenuBarAdd“部件批处理”
Subseparate_table
Dimi,j,kAsinteger&
DimNameList
(1)Asstring&
记录新增的部件代码
DimCol_NumAsInteger&
查询结果记录数
DimTableNameAsString&
创建表名
DimFilespecnameasString&
部件存储路径
DimMaxIDasString&
记录某类部件最大流水号
OpenTable“D:
\部件批处理\合并.tab”As合并
\部件批处理\新增.tab”As新增
Select*From新增Where标识码=““
GroupBy部件代码IntoSelection
Col_Num=SelectionInfo(SEL_INFO_NROWS)
IfCol_Num=0Then&
如果没有找到标识码为空的记录
Note“标识pSelect*From合并Where部件代码=NameList(i)
OrderBy标识码Into标识码排序表
IfTableInfo(标识码排序表,TAB_INFO_NROWS)=0then
Print“部件代码为”+NameList(i)+”没有最大标识码!
FetchLastFrom标识码排序表
MaxID=标识码排序表.标识码&
获得该类中最大的标识码号
Select*From新增Where部件代码=NameList(i)And标识码=““IntoSelection&
找到该类中没有标识码的全部记录
k=SelectionInfo(SEL_INFO_NROWS)
Print“当前部件图层”+NameList(i)+”最大标识码为”+MaxID+”共有”+k+”为空的记录!
DimLeftStrAsString&
标识码由两部分组成,部件代码+流水号
DimRightStrAsString
DimIDStrAsString
LeftStr=Left$(MaxID,10)&
获得该类部件的部件代码
Forj=1Tok
RightStr=“000000”+Str$(Val(Right$(MaxID,6))+j)
IDStr=LeftStr+right$(Rightstr,6)
UpdateSelectionSet标识码=IDStr
WhereRowID=j
CommitTable新增
1.4修改表结构
在北京市东城区网格化城市管理信息系统建设中,城市部件数据结构经常变换,特别是原崇文区和原东城区合并成一个行政区划后,由于之前两个区城市部件数据的数据结构不同,需要按照新的标准统一在一起。
城市部件有96种,每种部件存放在一个表中,共96张表,每张表中有14个属性字段需要修改。
一个一个手动修改,需要大量时间并极容易出错,使用mapbasic中的修改字段的功能,对96张表进行批处理,就可以提高工作效率和准确度。
以原东城区为例,说明mapbasic怎样批量修改数据结构。
Include“mapbasic.def”
DeclareSubmain
DimMapCountasInteger
Dimi,j,n,kasInteger
DimMapNmasString
DimcolNumasAlias
i=FrontWindow()
IfWindowInfo(FrontWindow(),Win_INFO_TYPE)&
lt;
WIN_MAPPERThen
Note“请打开地图窗口!
MapCount=MapperInfo(i,MAPPER_INFO_LAYERS)
IfMapCount&
g