⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basworkarea.~pas

📁 mapgis二次开发delphi实例Del_basWorkArea
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:
 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 + -