📄 basworkarea.~pas
字号:
TblAi:=nil;
end;
//属性结构操作
procedure TForm1.AttStruOperClick(Sender: TObject);
var
TblAi:iTblArea;
stru:iRecord_Head;
FieldNum:Integer;
fldinf:Field_Head;
pIStru0:iRecord_Head;
begin
tblai:=createcomobject(class_tblarea) as itblarea;
fldinf:=createcomobject(class_field_head) as ifield_head;
//打开一个表文件
if not TblAi.Load('','','','') then
Exit;
//1. 取属性结构
stru := TblAi.stru;
//可以取各字段名(当然还可以取得字段其他的描述信息)
for FieldNum := 0 to stru.numbfield - 1 do
begin
form2.Panel1.Caption:= stru[FieldNum].fieldname;
form2.ShowModal;
end;
//构造需添加的字段信息
fldinf.fieldname := 'newfld';
fldinf.fieldtype := gisDOUBLE_TYPE;
fldinf.point_leng := 3;
fldinf.msk_leng := 10;
fldinf.edit_enable := 1;
fldinf.ptc_pos := -1;
//2. 添加属性结构字段,添加到最后
bRes:= stru.AppendField(fldinf);
//如果想插入到属性结构的某一位置,则可以:
//bRes := stru.InsertField(fldinf, insTo);
//从insTo(从0开始)位置插入
//3.设置表工作区属性结构
TblAi.stru := stru;
//以上也可以如下方法代替:
//bRes := TblAi.stru.AppendField(fldinf);
//若想删除属性结构,可以直接如下方法:
bRes := TblAi.stru.DelField('ID');
//或者如下:(fldi为字段号)
//bRes := TblAi.stru.DelField2(fldi);
//4. 有时需要比较属性结构,可使用如下方法:
pIStru0:=createcomobject(class_record_head) as iRecord_Head;
//....此处省略PIStru0的字段添加
bRes := TblAi.stru.IsEqual(pIStru0);
TblAi.SaveAs;
stru:=nil;
TblAi:=nil;
fldinf:=nil;
end;
//点工作区间的实体拷贝
procedure TForm1.CopyPntAreaClick(Sender: TObject);
var
//clone,copyall,copylist,copymapparam
//'copyPart,copyTicDots等方法的使用
PntAi:iPntArea;
PntInfo:Pnt_Info;
PntPad:Pnt_Pad;
LayOnOff:LayerOnOffPad;
ai:iWorkArea;
ai1:iPntArea;
lst:iIDList;
rtnNo:Integer;
begin
pntai:=createcomobject(class_pntarea) as ipntarea;
//打开一个点文件
if not PntAi.Load('','','','') then
Exit;
//1. 克隆工作区
ai := PntAi.Clone;
ai.SaveAs; //保存后可以查看是否相同
//2. 拷贝所有实体到工作区ai1中,返回实体数
//此处一定要先New一个PntArea对象
ai1 :=createcomobject(class_pntarea) as iPntArea;
lRes := PntAi.CopyAll(ai1);
//3. 拷贝列表中的点到工作区ai1
//假设拷贝所有点(仅为了方便)
//取所有没有被删除的点号
lst := PntAi.GetAllExistNo;
if ai1.Clear then
//rtnNo-是否通过lst返回新的实体号,返回拷贝的实体数
lRes := PntAi.CopyList(lst, ai1, rtnNo);
//4. 拷贝地图参数到工作区ai
bRes := PntAi.CopyMapParam(ai1);
//5. 拷贝部分点到ai1工作区
//点信息
PntInfo:=createcomobject(class_pnt_info) as iPnt_Info;
//点信息开关板
PntPad:=createcomobject(class_pnt_pad) as iPnt_Pad;
//层开关板
LayOnOff:=createcomobject(class_layeronoffpad) as iLayerOnOffPad;
//假定保存的点信息为第一个点的点信息
PntAi.GetInfo(1, PntInfo);
//设置点信息开关板,假设如下设置
with PntPad do
begin
iclr := gisON;
infoDx := gisON;
infoDy := gisON;
layer := gisOFF;
linNo := gisOFF;
ovprnt := gisOFF;
rect := gisON;
res0 := gisON;
res1 := gisON;
Sub.angle := gisOFF;
Sub.fclr := gisOFF;
Sub.Height := gisOFF;
Sub.penw := gisOFF;
Sub.subno := gisOFF;
Sub.Width := gisOFF;
Type_:= gisON;
//所有开关置为ON
LayOnOff.SetAllOn;
end;
//返回拷贝的实体数
if ai1.Clear then
lRes := PntAi.CopyPart(PntPad, PntInfo, ai1,layonoff);
//若打开层开关板,则如下
//lRes := PntAi.CopyPart(PntPad, PntInfo, Ai1, LayOnOff);
//6. 拷贝所有TIC点到ai工作区
//假如存在Tic点
if (PntAi.GetTicNum > 0) and ai.Clear then
bRes := PntAi.CopyTicDots(ai);
//释放空间
ai:=nil;
ai1:=nil;
lst:=nil;
PntAi:=nil;
PntPad:=nil;
PntInfo:=nil;
LayOnOff:=nil;
end;
//拷贝属性方法
procedure TForm1.CopyRecordClick(Sender: TObject);
var
TblAi:iTblArea;
ai1:iTblArea;
lst:iIDList;
begin
tblai:=createcomobject(class_tblarea) as itblarea;
ai1:=createcomobject(class_tblarea) as itblarea;
lst:=createcomobject(class_idlist) as iidlist;
//打开一个表文件
if not TblAi.Load('','','','') then
Exit;
//CopyAll 拷贝所有属性记录到ai1的attType1类型表中
//ai1必须是ITblArea, attType1必须是TBL或DBSTBL
lRes := TblAi.CopyAll(ai1);
form2.Panel1.Caption:='拷贝了'+inttostr(lRes)+'条纪录';
form2.ShowModal;
ai1.SaveAs;
ai1.Clear;
//CopyList 拷贝lst指定的记录到ai1的attType1类型表中
//假设ai有多于三条的纪录,如下拷贝三条纪录到ai1的属性表里
lst.Append(1);
lst.Append (2);
lst.Append(3);
lRes := TblAi.CopyList(lst, ai1,0,0);
//如果考虑可选参数,就可如下表示:
//changeStru: 是否改变ai1的属性结构,使其结构和ai0的相同
//rtnNo -是否通过lst返回新的实体号
lRes := TblAi.CopyList(lst, ai1, 1, 0);
//上面表示改变属性结构,不通过lst返回新的实体号
//changeStru=1,rtnNo=0也是默认参数
ai1:=nil;
lst:=nil;
TblAi:=nil;
end;
//加载,保存点文件
procedure TForm1.LoadSavePntFileClick(Sender: TObject);
//加载点文件的三种方式
//'保存点文件的四种方式
var
//1. 带文件名的加载
PntAi:iPntArea;
pntinfo:iPnt_Info;
PntPad:Pnt_Pad;
LayOnOff:LayerOnOffPad;
begin
PntAi :=createcomobject(class_pntarea) as iPntArea;
//加载China.wt文件到工作区
bRes := PntAi.Load('China.wt','','','');
if bRes = True then
begin
form2.Panel1.Caption:='China.wt点文件已成功加载!';
form2.ShowModal;
end;
//(1)保存文件到网络数据库中(忽略返回值)
//MSDB为数据源,sa为数据库用户,最后一个为密码
bRes := PntAi.Save('China.wt', 'MSDB', 'sa', '');
//2. 加载网络数据文件
bRes := PntAi.Load('China', 'MSDB', 'sa', '');
//(2)保存原来的文件
PntAi.Save('','','','');
//(3)另存文件为(忽略返回值)...
//可以保存为本地文件,也可以是网络数据文件
PntAi.SaveAs;
//3. 自由加载(弹出对话框选择)
if not PntAi.Load('','','','') then
begin
form2.Panel1.Caption:='加载点文件失败!';
form2.ShowModal;
end;
//(4) 保存部分点
//点信息
pntinfo:=createcomobject(class_pnt_info) as iPnt_Info;
//点信息开关板
PntPad:=createcomobject(class_pnt_pad) as iPnt_Pad;
//层开关板
LayOnOff:=createcomobject(class_LayerOnOffPad) as ilayeronoffpad;
//假定保存的点信息为第一个点的点信息
PntAi.GetInfo(1, PntInfo);
//设置点信息开关板,假设如下设置
with PntPad do
begin
iclr := gisON;
infoDx := gisON;
infoDy := gisON;
layer := gisOFF;
linNo := gisOFF;
ovprnt := gisOFF;
rect := gisON;
res0 := gisON;
res1 := gisON;
Sub.angle := gisOFF;
Sub.fclr := gisOFF;
Sub.Height := gisOFF;
Sub.penw := gisOFF;
Sub.subno := gisOFF;
Sub.Width := gisOFF;
Type_ := gisON;
//所有开关置为ON
LayOnOff.SetAllOn;
end;
//保存部分点到原文件
bRes := PntAi.SavePart(PntPad, PntInfo, LayOnOff);
PntAi:=nil;
PntInfo:=nil;
LayOnOff :=nil;
end;
//记录操作方法
procedure TForm1.RcdOperMethodClick(Sender: TObject);
var
TblAi:iTblArea;
ATT:iRecord;
begin
tblai:=createcomobject(class_tblarea) as itblarea;
//打开一个表文件
if TblAi.Load('','','','') then
Exit;
//注意:以下对记录的操作必须是表工作区!!!
ATT:=createcomobject(class_record_) as iRecord;
//假设已经知道表中字段为ID号,长度等等
//首先取得表中的属性结构
ATT.hd := TblAi.stru;
//也可以直接取得某条属性记录(因为属性结构都是一样的)
//如下取得第一条记录的属性
nRes := TblAi.Get(1, ATT);
//给每个字段赋值
ATT.Value[0] := 100;
ATT.Value[1] := 134.23;
//......其余字段的赋值
//将att做为一个记录添加到到表格的最后
//lRes返回最后的记录号
lRes := TblAi.AppendRcd(ATT);
//删除第i条记录(此处为最后一条)
if TblAi.DelRcd(lRes) then
//撤消对第i条记录的删除
TblAi.UnDelRcd (lRes );
//要想删除所有记录,只要使用如下方法就可:
TblAi.Clear;
ATT:=nil;
TblAi:=nil;
end;
//查找工作区最近点
procedure TForm1.QueryNearPntClick(Sender: TObject);
var
PntAi:iPntArea;
xy:iD_Dot;
dis:Double;
LayPad:iLayerOnOffPad;
begin
pntai:=createcomobject(class_pntarea) as ipntarea;
xy:=createcomobject(class_d_dot) as id_dot;
laypad:=createcomobject(class_layeronoffpad) as ilayeronoffpad;
//打开一个点文件
if not PntAi.Load('','','','') then
begin
form2.Panel1.Caption:='打开文件失败!';
form2.ShowModal;
exit;
end;
//给定一个点坐标
xy.x:= 100;
xy.y:= 100;
// 查找点工作区上离xy最近的点
//注意:下面LayPad,dis是可选参数
//方法1,返回点号
lRes := PntAi.Near(xy,laypad,dis);
//方法2,考虑层,设置层开关板
LayPad.SetAllOn; //设为全开
lRes := PntAi.Near(xy, LayPad,dis);
//方法3,可取得两点间的距离
lRes := PntAi.Near(xy,laypad,dis);
form2.Panel1.Caption:='最近距离是:'+ floattostr(dis);
form2.ShowModal;
xy:=nil;
PntAi:=nil;
LayPad:=nil;
end;
//取,设置点工作区信息
procedure TForm1.GetSetPntInfoClick(Sender: TObject);
var
PntAi:PntArea;
xy:iD_Dot;
xyz:iD_3Dot;
rect:iD_Rect;
laynum:smallint;
mpar:iMap_Para;
mmPath:wideString;
fName:wideString;
PntInfo:iPnt_Info;
pntType:Enum_Pnt_Type;
begin
pntai:=createcomobject(class_pntarea) as ipntarea;
xyz:=createcomobject(class_d_3dot) as id_3dot;
//打开一个点文件
if not PntAi.Load('','','','') then
Exit;
//以下取各种实体信息均具有单独性,因此创建
//一个对象实例,加载文件后就可取的各种信息
//取点1存在标志
nRes := PntAi.GetExistFlag(1);
if nRes <> 1 then
begin
exit;
PntAi:=nil;
end;
//注意:以下给出返回值,但没有处理,可根据情况
//确定是否进行处理
//取点1的位置 1/0/-1成功/失败/已被删除
nRes := PntAi.GetPos(1, xy); //省略返回处理
//取点1的位置
nRes := PntAi.GetPos3D(1, xyz);
//取图元1范围 返回值:1/0/-1=存在/不存在/被删除
nRes := PntAi.GetRect(1, rect);
//取pi点所属图层号 返回值:1/0/-1=存在/不存在/被删除
nRes := PntAi.GetLayer(1, laynum);
//取图元1范围及图层返回值:1/0/-1=存在/不存在/被删除
nRes := PntAi.GetRectLayer(1, rect, laynum);
//取点数据长度(字节长度)
lRes := PntAi.GetDatLen(1);
//取1号图元信息 返回值:1/0/-1=存在/不存在/被删除
nRes := PntAi.GetInfo(1, PntInfo);
//返回点类型
nRes := PntAi.GetType(1, pntType);
//取工作区文件别名
bRes := PntAi.GetAreaAlias(fName);
//设工作区文件别名
bRes := PntAi.SetAreaAlias('点工作区文件别名');
//取工作区文件分类码
nRes := PntAi.GetAreaFClass;
//设工作区文件分类码,设为0类型
bRes := PntAi.SetAreaFClass(1);
//取自动取二进制数据字段标志(0/1 - 不自动/自动)
nRes := PntAi.GetAutoGetBinDatFlag;
//设自动取二进制数据字段标志(0/1 - 不自动/自动)
//设为自动取二进制数据字段
nRes := PntAi.SetAutoGetBinDatFlag(1);
//取工作区文件名(不包括路径)
bRes := PntAi.GetFileName(fName);
//取地图参数
bRes:= PntAi.GetMapParam(mpar);
//设地图参数
bRes := PntAi.SetMapParam(mpar);
//取多媒体数据路径
bRes := PntAi.GetMMDPath(mmPath);
//设多媒体数据路径
bRes := PntAi.SetMMDPath('D:\MapGis61');
//以下为点工作区的一些属性如:
//PntAi.Count 工作区实体数,使用如下:
lRes := PntAi.count;
//由于都是工作区对象属性,调用简单,故省略
xy:=nil;
xyz:=nil;
mpar:=nil;
rect:=nil;
PntInfo:=nil;
PntAi:=nil;
end;
//网络路径操作
procedure TForm1.NetPathOperClick(Sender: TObject);
var
NetAi:iNetArea;
nPath:iIDList;
aPath:iIDList;
LinInfo:iLin_Info;
nLen:Longint;
aLen:Longint;
begin
netai:=createcomobject(class_netarea) as inetarea;
//打开网文件
if not NetAi.Load('','','','') then
begin
NetAi:=nil;
exit;
end;
//取网络路径
if NetAi.Path.Get(1, nPath, aPath, LinInfo)<>0 then
begin
//1. 取网络路径数据项数
nRes := NetAi.Path.GetLen(1, nLen, aLen);
if nRes<>0 then
begin
form2.Panel1.Caption:='结点数为:'+ inttostr(nLen)+ Chr(13)+'弧段数为:'+inttostr(aLen);
form2.ShowModal;
end;
//2. 删除网络路径
nRes := NetAi.Path.Del(1);
if nRes<>0 then
begin
form2.Panel1.Caption:='网络路径1已删除!';
form2.ShowModal;
//3. 恢复被删除的网络路径
NetAi.Path.UnDel (1);
form2.Panel1.Caption:='网络路径已恢复!';
form2.ShowModal;
end;
//4.更新网络路径信息
//这里假设只改变线颜色
LinInfo.lclr := 10;
nRes := NetAi.Path.UpdateInfo(1, LinInfo);
if nRes<>0 then
begin
form2.Panel1.Caption:='更改线信息成功!';
form2.ShowModal;
end;
//5.更新路径(省略)
end;
//6. 添加路径(省略)
NetAi.SaveAs;
aPath:=nil;
nPath:=nil;
NetAi:=nil;
LinInfo:=nil;
end;
//取区域各种信息
procedure TForm1.GetAreaInfClick(Sender: TObject);
var
RegAi:iRegArea;
rdat:iLONGList;
ne :iLONGList;
RegInfo:iReg_Info;
rate :Double;
xy:iD_DotSet;
xy1:iL_DotSet;
xy0:iD_Dot;
begin
regai:=createcomobject(class_regarea) as iregarea;
//打开一个区文件
if not RegAi.Load('','','','') then
exit;
if RegAi.GetExistFlag(1) = 1 then
//取区域 返回:1=成功0=失败-1=已被删除
nRes := RegAi.Get(1, rdat, RegInfo)
else
exit;
//取区域圈数
if nRes = 1 then
if RegAi.GetCircleNum(rdat) < 1 then
exit;
//取区边界坐标
//rdat为区1的数据
//返回:xy为点坐标数据
//返回:ne为区域边界封闭圈点号集合
nRes := RegAi.GetEdge(rdat, xy, ne);
//取区域的长整数边界
rate := 1;
xy0 :=createcomobject(class_D_Dot) as id_dot;
xy0.x := 50;
xy0.y := 50;
nRes := RegAi.GetLongEdge(rdat, xy1, ne, xy0, rate);
//说明以上参数:
//xy1:区域边界坐标数据集合
//ne :区域边界封闭圈点号集合
//xy0:原点坐标
//rate:缩放比例
//返回rdat长度(下面为区1)
lRes := RegAi.GetDatLen(1);
ne:=nil;
xy :=nil;
xy0 :=nil;
xy1:=nil;
rdat:=nil;
RegAi:=nil;
RegInfo:=nil;
end;
//取线,线数据长度
procedure TForm1.GetDatLenClick(Sender: TObject);
var
LinAi:iLinArea;
count:Longint;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -