📄 basworkarea.~pas
字号:
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 + -