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

📄 basworkarea.~pas

📁 mapgis二次开发delphi实例Del_basWorkArea
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:
 length:Double;
begin
linai:=createcomobject(class_linarea) as ilinarea;
//打开一个线文件
if not LinAi.Load('','','','') then
Exit;

//GetDatLen和GetLength是不一样的功能
//前者取取线数据长度(字节长度),后者取线长度
//立即窗口打印各条线的线数据长度
for count := 1 to LinAi.count do
begin
form2.Panel1.Caption:=inttostr(LinAi.GetDatLen(count));
form2.ShowModal;
end;

//立即窗口打印各条线的长度
for count := 1 to LinAi.count do
begin
bRes := LinAi.GetLength(count, length);
If bRes then
  begin
 form2.Panel1.Caption:=floattostr(length);
 form2.ShowModal;
 end;
end;
//可以对照以上显示的值
 LinAi:=nil;
end;

//查找最近线
procedure TForm1.QueryNearLinClick(Sender: TObject);
var
 LinAi:iLinArea;
 xy:iD_Dot;
 dis:Double;
 LayPad:LayerOnOffPad;
begin
 linai:=createcomobject(class_linarea) as ilinarea;
 xy:=createcomobject(class_d_dot) as id_dot;
 laypad:=createcomobject(class_layeronoffpad) as ilayeronoffpad;
 //打开一个点文件
if not LinAi.Load('','','','') then
 begin
 form2.Panel1.Caption:='打开文件失败!';
 form2.ShowModal;
 exit;
 end;

//给定一个点坐标
xy.x := 100;
xy.y := 100;

// 查找点工作区上离xy最近的线
//注意:下面LayPad,dis是可选参数

//方法1,返回线号
lRes := LinAi.Near(xy,laypad,dis);

//方法2,考虑层,设置层开关板
LayPad.SetAllOn; //设为全开
lRes := LinAi.Near(xy, LayPad,dis);

//方法3,可取得点到线的最近距离
lRes := LinAi.Near(xy,laypad,dis);
form2.Panel1.Caption:='最近距离是:'+floattostr(dis);
form2.ShowModal;

 xy:=nil;
 LinAi:=nil;
 LayPad:=nil;
end;

//区工作区中有关计算
procedure TForm1.GetorCalMethodClick(Sender: TObject);
var
 RegAi:iRegArea;
 area:Double;
 par:Double;
 rdat:iLONGList;
 inf:iReg_Info;
 minDis:Double;
 maxDis:Double;
 xy:iD_Dot;
begin
 regai:=createcomobject(class_regarea) as iregarea;
 xy:=createcomobject(class_d_dot) as id_dot;
 //打开一个区文件
 if not RegAi.Load('','','','') then
 exit;

//计算面积 该函数要求xy构成的多边形封闭
//返回面积<0时表示该区逆时针旋转,>0时表
//示该区顺时针旋转
if RegAi.GetExistFlag(1) <> 1 then
exit;

//为计算方便,这里计算第一个区的面积
//取区域1返回:1=成功0=失败-1=已被删除
if RegAi.Get(1, rdat, inf) = 1 then
  begin
  bRes := RegAi.CalculateArea(rdat, area, par);
  if bRes then
  begin
  form2.Panel1.Caption:=floattostr(area)+floattostr(par);
  form2.ShowModal;
  end;
end;

//计算给定区1的更简单的方法如下:
 if RegAi.GetArea(1, area) then
 begin
 form2.Panel1.Caption:=floattostr(area);
 form2.ShowModal;
 end;

//取区域1的周长
 if RegAi.GetPerimeter(1, par) then
 begin
 form2.Panel1.Caption:=floattostr(par);
 form2.ShowModal;
 end;

xy.x := 100;
xy.y := 100;
//计算点到区之间的距离(包括最大,最小距离)
if RegAi.DistOfPntToReg(xy, 1, minDis, maxDis) then
 begin
 form2.Panel1.Caption:=floattostr(minDis)+floattostr(maxDis);
 form2.ShowModal;
 end;
//计算点到区之间的最大距离
maxDis := RegAi.MaxDistOfPntToReg(xy, 1);
minDis := RegAi.MinDistOfPntToReg(xy, 1);
//比较三种方法得到的值
form2.Panel1.Caption:=floattostr(minDis)+floattostr(maxDis);
form2.ShowModal;

 xy:=nil;
 inf:=nil;
 rdat:=nil;
 RegAi:=nil;
end;

//控制点(TIC)存取函数
procedure TForm1.TicDotMethodClick(Sender: TObject);
var
 PntAi:iPntArea;
 tic:iTic_Dot;
 lst:iTic_DotSet;
 ai:iPntArea;
begin
pntai:=createcomobject(class_pntarea) as ipntarea;
tic:=createcomobject(class_tic_dot) as itic_dot;
//打开一个点文件
if not PntAi.Load('','','','') then
Exit;

//初始化TicDot
tic.xy0.x := 50; //图形坐标值
tic.xy0.y := 50;
tic.xy1.x := 100;  //理论坐标值
tic.xy1.y := 100;

//判断是否有Tic点
if PntAi.GetTicNum <= 0 then
begin
form2.Panel1.Caption:='当前工作区没有Tic点!';
form2.ShowModal;
end;

//添加Tic点
if PntAi.AppendTicDot(tic) then
//取Tic点列表
bRes := PntAi.GetTicList(lst);

ai:=createcomobject(class_PntArea) as ipntarea;
//拷贝所有TIC点到ai工作区
if PntAi.CopyTicDots(ai) then
begin
form2.Panel1.Caption:=inttostr(ai.GetTicNum);
form2.ShowModal;
end;

tic.xy0.x := 20;
tic.xy0.x := 20;
tic.xy1.y := 40;
tic.xy1.y := 40;
//给lst中再添加一个Tic点
lst.Append(tic);
//将lst中的TIC点替换ai工作区中原来的TIC点
if PntAi.ReplaceTicList(lst) then
begin
//显示目前工作区的的点数
form2.Panel1.Caption:=inttostr(PntAi.GetTicNum);
form2.ShowModal;
end;

//清除所有Tic点,忽略返回值
PntAi.ClearAllTicDot;
 ai:=nil;
 tic:=nil;
 lst:=nil;
 PntAi:=nil;
end;

//字段统改操作
procedure TForm1.ModAllMethodClick(Sender: TObject);
var
 TblAi:iTblArea;
 ATT:iRecord;
 lst:iIDList;
 pRepFldFlg:iRepFldFlag;
begin
 tblai:=createcomobject(class_tblarea) as itblarea;
 lst:=createcomobject(class_idlist) as iidlist;
//打开一个表文件
if not TblAi.Load('','','','') then
Exit;

//字段统改
//======替换ptLst表所含记录的字段值===========================//
//Lst-统改记录号表,Lst(0)=记录数,Lst(1)-Lst(Lst(0))=记录号
//ptLst=NULL则统改所有记录
//titleName-统改条件输入窗口标题
//返回值:IDYES(6)、IDNO(7)、IDCANCEL(2),失败=0
//==========================================================//
//假设统改前三条记录(统改哪些记录,由开发人员决定)
lst.Append(1);
lst.Append(2);
lst.Append(3);
//统改lst中的记录,弹除对话框进行统改
nRes := TblAi.RepLstRcdFld(lst, '这是统改标题');
TblAi.SaveAs;

//统改属性记录字段
//======根据条件表达式替换指定的记录字段======================//
//替换ptLst表所列记录的指定字段,返回统改的记录数
//lst同上面所述
//ptRepFldFlag-替换字段开关;ptRepFldFlag(i)对应i(从0开始)
//号字段,1=替换,0=不替换
//attExp-属性条件表达式字符串,可为NULL,即无属性条件
//repAtt-替换值记录数据,
//==========================================================//
//如下,假设替换值记录数据为第一条记录,只改动第二个字段,属性条件为空
pRepFldFlg.Append(0);
pRepFldFlg.Append(1);
//取第一条记录
nRes := TblAi.Get(1, ATT);

if TblAi<>nil then
begin
lRes := TblAi.RepLstRcdFld0(lst, pRepFldFlg, '', ATT);
form2.Panel1.Caption:='统改的记录数为:'+inttostr(lRes);
form2.ShowModal;
end;
TblAi.SaveAs;

//统改所有字段域值 , lst = NULL则统改所有记录
//如下统改lst中所列记录的第i号字段(给定所有记录的字段均修改成一样的值)
nRes := TblAi.ModLstRcdFldVal(lst, 1, '这是统改字段域值');

TblAi.SaveAs;
 lst:=nil;
 ATT:=nil;
 TblAi:=nil;
 pRepFldFlg:=nil;
end;

//字段操作方法
procedure TForm1.FieldOperMethodClick(Sender: TObject);
var
//这里使用区文件是为了方便
 RegAi:iRegArea;
 ATT:iRecord;
 fldinf:Field_Head;
 errVal:olevariant;
begin
 regai:=createcomobject(class_regarea) as iregarea;
 fldinf:=createcomobject(class_field_head) as ifield_head;
//打开一个区文件
if not RegAi.Load('','','','') then
Exit;

//根据实体号1取属性ID , 返回属性ID号
lRes:= RegAi.RegAtt.GetID(1);

//取最大ID值
lRes := RegAi.RegAtt.GetMaxID;

{计算字段值:======================================================
入口参数:
     fldName-计算字段名称
      calExp-计算表达式
      domainErrVal-表达式计算过程中定义域错时(如除0错),计算结果替换值
      若domainErrVal!=NULL,则用domainErrVal作为fldName的字段值
      若domainErrVal==NULL,则不修改当前记录的fldName字段值
例:
    ...
   errVal=10.0;
   ...
工作区对象.CalculateFldVal("人均土地面积","面积/人口",errVal)
就是计算ai(区工作区)工作区中的REG类型属性中的"人均土地面积"字段值,
计算表达式为"面积/人口",即面积字段值除人口字段值,当人口字段值为0时,
产生除0错,此时,用errVal值(10.0)作为"人均土地面积"的字段值。
================================================================}
//主要用在区工作区属性中,如下添加一个字段名为:计算的字段值
//其值为面积除以周长 (区默认属性字段有面积和周长)
fldinf.fieldname := '面积除周长';
fldinf.fieldtype := gisSTR_TYPE;
fldinf.msk_leng := 32;
fldinf.edit_enable := 1;
fldinf.ptc_pos := -1;

bRes := RegAi.RegAtt.stru.AppendField(fldinf);
RegAi.Save('','','','');
if bRes then
begin
errVal := 10;
bRes := RegAi.RegAtt.CalculateFldVal('面积除周长', '面积/周长', 10);
end;

if bRes then
begin
form2.Panel1.Caption:='成功计算字段值!';
form2.ShowModal;
end;

RegAi.SaveAs;
 ATT:=nil;
 RegAi:=nil;
 fldinf:=nil;
end;

//合并,分裂,匹配区域
procedure TForm1.UnionSplitMathClick(Sender: TObject);
var
 RegAi:iRegArea;
 delCommArc:Integer; //是否删除公共弧段
 rdat:iLONGList;
 RegInfo:iReg_Info;
begin
regai:=createcomobject(class_regarea) as iregarea;
//打开一个区文件
if not RegAi.Load('','','','') then
Exit;

//合并子区弧段
//如下把第一个区的弧段合并为一
if RegAi.Lin.count < 2 then
begin
 RegAi:=nil;
 exit;
end;

//保证两个区存在(区2和区3)
if (RegAi.GetExistFlag(2) = 0) Or (RegAi.GetExistFlag(3) = 0) then
begin
 RegAi:=nil;
 exit;
end;

 rdat :=createcomobject(class_LONGList) as ilonglist;
 bRes := RegAi.UnionArc(rdat);
if bRes then
    begin
    form2.Panel1.Caption:='合并弧段成功!';
    form2.ShowModal;
    end
else
    begin
    form2.Panel1.Caption:='合并弧段失败!';
    form2.ShowModal;
    end;

//区域合并
//把区域ra合并到区域rb, (delCommArc:是否删除公共弧段)
//如下: 把区域2合并到3
delCommArc := 0; //(不删除弧段)
bRes := RegAi.UnionAtoB(2, 3, delCommArc);
if bRes then
    begin
    form2.Panel1.Caption:='区域合并成功!';
    form2.ShowModal;
    end
else
    begin
    form2.Panel1.Caption:='区域合并失败!';
    form2.ShowModal;
    end;

//分裂区,如下把上面合并的区域分裂
//用于分裂区的弧段必须是经过结点平差后的弧段
//......RegAi.Split...略
if RegAi.Get(3, rdat, RegInfo)<>0 then
nRes := RegAi.Split(3, rdat);
if nRes<>0 then
    begin
    form2.Panel1.Caption:='分裂区域成功!';
    form2.ShowModal;
    end
else
    begin
    form2.Panel1.Caption:='分裂区域失败!';
    form2.ShowModal;
    end;

//匹配子区
//重新搜索所有区之间的包含关系,建立匹配关系
//匹配子区3
if RegAi.MathSubreg(3) then
    begin
    form2.Panel1.Caption:='匹配子区3成功!';
    form2.ShowModal;
    end
else
    begin
    form2.Panel1.Caption:='匹配子区3失败!';
    form2.ShowModal;
    end;

//匹配所有子区
if RegAi.MathAllSubreg then
    begin
    form2.Panel1.Caption:='匹配所有子区成功!';
    form2.ShowModal;
    end
else
    begin
    form2.Panel1.Caption:='匹配所有子区失败!';
    form2.ShowModal;
    end;

 rdat:=nil;
 RegAi:=nil;
 RegInfo:=nil;
end;

//拷贝部分实体到IDlist
procedure TForm1.PartToListClick(Sender: TObject);
var
 PntAi:iPntArea;
//层开关板
 LayPad:iLayerOnOffPad;
//点信息
 PntInfo:iPnt_Info;
//点信息开关板
 PntPad:iPnt_Pad;
//ID列表(集合)
 lst:iIDList;
 lCount:Longint;
begin
pntai:=createcomobject(class_pntarea) as ipntarea;
laypad:=createcomobject(class_layeronoffpad) as ilayeronoffpad;
//打开一个点文件
if not PntAi.Load('','','','') then
begin
form2.Panel1.Caption:='打开文件失败!';
form2.ShowModal;
Exit;
end;

//假定拷贝的点信息为第一个点的点信息
if PntAi.GetExistFlag(1)<>0 then
 PntAi.GetInfo(1, PntInfo)
else
Exit;
//设置点信息开关板,假设如下设置
 PntPad:=createcomobject(class_pnt_pad) as iPnt_Pad;
 lst := PntAi.PartToList(PntPad, PntInfo,laypad);

with PntPad  do
begin
iclr := gisON;
infoDx := gisON;
infoDy := gisON;
layer := gisON;
linNo := gisON;
ovprnt := gisON;
rect := gisON;
res0 := gisON;
res1 := gisON;
Sub.angle := gisON;
Sub.fclr := gisON;
Sub.Height := gisON;
Sub.penw := gisON;
Sub.subno := gisON;
Sub.Width := gisON;
Type_ := gisON;
end;
//所有开关置为ON
LayPad.SetAllOn;

//拷贝部分点到列表
//方法1
 lst := PntAi.PartToList(PntPad, PntInfo,laypad);
//方法2,考虑层开关板
 lst := PntAi.PartToList(PntPad, PntInfo, LayPad);

//依次显示满足的IDList中的ID号
for lCount := 0 to lst.count - 1 do
begin
form2.Panel1.Caption:=lst(lCount);
form2.ShowModal;
end;

 lst :=nil;
 PntAi :=nil;
 LayPad :=nil;
 PntPad :=nil;
 PntInfo :=nil;
end;

//区中Seek,IsDotIn用法
procedure TForm1.RegQueryClick(Sender: TObject);
var
 RegAi:iRegArea;
 xy:iD_Dot;
 LayPad:iLayerOnOffPad;
 flg:Integer;
 regnum:Longint;
begin
regai:=createcomobject(class_regarea) as iregarea;
xy:=createcomobject(class_d_dot) as id_dot;
laypad:=createcomobject(class_layeronoffpad) as ilayeronoffpad;
xy.x := 200;
xy.y := 200;
//打开一个区文件
if not RegAi.Load('','','','') then
Exit;

LayPad.SetAllOn;
//查找点在哪个区内
lRes := RegAi.Seek(xy);
//如果打开层开关板,则如下:
lRes := RegAi.Seek(xy, LayPad);
//立即窗口显示区号
form2.Panel1.Caption:='点在区'+inttostr(lRes)+'内';
form2.ShowModal;

//点是否在区域内
for regnum := 1 to RegAi.count do
begin
//flg==1则严格套合,否则只检查第一圈
//返回值:2/1/0=内/边界/外
nRes := RegAi.IsDotIn(xy, regnum, flg);
if nRes = 2 then
  begin
  form2.Panel1.Caption:'点在区'+ inttostr(regnum)+'内';
  form2.ShowModal;
  Exit;
  end;
if nRes = 1 then
  begin
  form2.Panel1.Caption:='点在区'+inttostr(regnum)+'边界上';
  exit;
  end;
end;

 xy:=nil;
 RegAi:=nil;
 LayPad:=nil;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -