在MapInfo中实现征地计算
李 玲
(广西第一测绘院)
【摘 要】 介绍在MapInfo中如何统计征地覆盖范围内原土地利用现状各地类面积,为征地前的规划作好准备。
【关键词】 MapInfo 规划用地 覆盖面积 地类净面积
1 引言
MapInfo Professional是基于Windows之上的桌面地图软件,用于存取、管理、可视化、分析综合的地理数据,是目前世界上最为完备、功能强大、全面而直观的桌面地图信息系统。它复杂而深层次的可视化地理分析功能可以帮助用户在数据库中不同的数据之间建立关联,在同一个环境下显示,并迅速揭示数据之间的关系以及易被忽视的数据模式,从而作出快速有效的决策,提高运作效率,加强竞争能力。 因此,MapInfo在林业、土地、规划等部门获得广泛使用。在土地利用规划过程中,经常需要征用土地以作建设或交通用地等其他用途,征用的耕地或居民用地等需按规定作好用地补偿及安置,因此,征用前需要知道征地覆盖范围内土地利用现状的地类分布情况。本文介绍在MapInfo中如何统计征地覆盖范围内原土地利用现状各地类面积,为征地前的规划分析作好准备。
2 统计征地覆盖范围内原土地利用现状各地类面积
2.1 原土地利用现状

图1
如图1所示,粗线界线为征地范围线,其余为原土地利用现状的图斑和线状地物。

设原土地利用现状用表zhtb.tab记录,表的结构如下:
其中,图斑类别为1,线状地物类别为2。
2.2 征地界线
征用地一般会有征用批文,批文内记录有征用地界线的各点坐标。假设征用地坐标批文格式如下(各征地间以空行间隔):
点号,X坐标,Y坐标
……
点号,X坐标,Y坐标
点号,X坐标,Y坐标
……
点号,X坐标,Y坐标
将征地坐标展入MapInfo中并连成图形,并检查图形是否正确。

图2
设征地表为zd.tab,结构中第一个字段为“批文”,第二个字段为“宗地”。
展入征地界线程序对话框如图2所示。部分程序段如下:
Dim s_file_coord,s_str As String
Dim s_delichar As String
Dim i_pos,i_pnum,i_reg As Integer
Dim fl_x,fl_y As Float
Dim obj_polygon As Object
s_file_coord=FileOpenDlg("","","txt","打开坐标文件")
If s_file_coord<>"" Then
s_delichar=","
Open File s_file_coord For Input As #1
Create Region Into Variable obj_polygon 0 Pen MakePen(1, 2, RED)
i_pnum=0
i_reg=0
s_file=PathToFileName$(s_file_coord)
i_pos=Instr(1,s_file,".")
If i_pos<>0 Then
s_file=Left$(s_file,i_pos-1)
End If
Do While Not EOF(1)
Line Input #1 , s_str
If Rtrim$(s_str)<>"" Then
i_pos=Instr(1,s_str,s_delichar)
s_str=Mid$(s_str,i_pos+1,Len(s_str)-i_pos)
i_pos=Instr(1,s_str,s_delichar)
fl_x=Val(Mid$(s_str,1,i_pos-1))
s_str=Mid$(s_str,i_pos+1,Len(s_str)-i_pos)
fl_y=Val(s_str)
i_pnum=i_pnum+1
Alter object obj_polygon Node Add (fl_y , fl_x)
Else
If i_pnum>=3 Then
Insert Into zd (object) Values (obj_polygon)
i_reg=i_reg+1
Update zd Set Col2=Str$(i_reg) Where RowID=i_reg
End If
i_pnum=0
Create Region Into Variable obj_polygon 0 Pen MakePen(1, 2, RED)
End If
Loop
Close File #1
Update zd Set Col1=s_file
Commit Table zd
End If
2.2 统计征地覆盖范围内原土地利用现状各地类面积
2.2.1 计算征地范围内图斑及线状覆盖面积
MapBASIC中有一个重要的函数Overlap,它的调用方法如下:
OverLap( object1,object2 )
object1,object2 是图形对象,可以是面状或线状地物。
函数返回:object1被object2覆盖的部分构成的新图形对象。
另一个相关的函数为ProportionOverlap,它的调用方法如下:
ProportionOverlap (object1,object2)
object1,object2 是图形对象,可以是面状或线状地物。
函数返回:object1被object2覆盖的部分占原object1对象的比例,是一个Float型值。
计算征地范围内图斑及线状覆盖面积需要用到以上两个函数。
例如,设某征地界线对象为zd.obj,原现状某对象为zhtb.obj,则OverLap( zhtb.obj ,zd.obj )返回此现状对象(图斑或线状)被征地覆盖范围内的图形(图斑或线状)。而portionOverLap(zhtb.obj ,zd.obj)*Area(zhtb.obj,"sq m")*0.0015返回图斑在征地覆盖范围内的图形面积(单位:亩)。ObjectLen(Overlap(Query1.obj,Zhtb.obj),"m")返回线状在征地覆盖范围内的长度(单位:米)。
设查询结果存放表Querult.tab结构为:
范围 |
图斑号 |
地类号 |
覆盖面积 |
扣除线状面积 |
地类面积 |
类别 |
宽度 |
长度 |
批文 |
宗号 |
|
|
|
|
|
|
|
|
|
|
|
计算征地范围内图斑及线状覆盖面积的部分程序段如下:
Select * From Zd,Zhtb Where Zd.obj Intersects Zhtb.obj Into Query1
i_result=SelectionInfo(SEL_INFO_NROWS)
i=1
Do While i<=i_result
Fetch Rec i From Query1
objtype=ObjectInfo(Query1.obj,OBJ_INFO_TYPE)
s_piwen=Query1.批文
s_recnum=Query1.宗地号
s_fw=Query1.范围
s_tbh=Query1.图斑号
s_dlh=Query1.地类号
If objtype=OBJ_TYPE_REGION Then
fl_lsmj=ProportionOverLap(Query1.obj,Zhtb.obj)*Area(Query1.obj,"sq m")*0.0015
obj_overlap=OverLap(Query1.obj,Zhtb.obj)
i_leibie=1
Insert Into Querult (obj,范围,图斑号,地类号,覆盖面积,类别,批文,宗号)
Values (obj_overlap,s_fw,s_tbh,s_dlh,fl_lsmj,i_leibie,s_piwen,s_recnum)
Else If objtype=OBJ_TYPE_PLINE Then
fl_width=Query1.宽度
fl_length=ObjectLen(Overlap(Query1.obj,Zhtb.obj),"m")
obj_overlap=OverLap(Query1.obj,Zhtb.obj)
fl_lsmj=fl_length*fl_width*0.0015
i_leibie=2
Insert Into Querult (obj,范围,图斑号,地类号,覆盖面积,类别,宽度,长度,批文,宗号)
Values (obj_overlap,s_fw,s_tbh,s_dlh,fl_lsmj,i_leibie,fl_width,fl_length,s_piwen,s_recnum)
End If
End If
i=i+1
Loop
Update Querult Set 地类面积=覆盖面积
2.2.2 计算征地范围内图斑地类净面积
由2.2.1节计算出来的图斑面积尚未扣除其中所含的线状的面积。因为每批文的某宗所覆盖的图斑可以由批文、宗号、范围、图斑号唯一指定,所以可以将查询结果表Querult中的线状面积按批文、宗号、范围、图斑号聚合,对应的图斑只需扣除聚合后的相应面积即可。
计算征地范围内图斑地类净面积部分程序段如下:
Select范围,图斑号,Sum(覆盖面积),批文,宗号 From Querult Where 类别=2 Group By 批文,宗号,图幅号,范围,图斑号
Into Query1
i_result=SelectionInfo(SEL_INFO_NROWS)
i=1
Do While i<=i_result
Fetch Rec i From Query1
s_fw=Query5.Col1
s_tbh=Query5.Col2
fl_summj=Query5.Col3
s_piwen=Query5.Col4
s_recnum=Query5.Col5
Select * From Querult Where 批文=s_piwen And 宗号=s_recnum And 范围=s_fw And 图斑号=s_tbh And 类别=1 Into Query2
fl_lsmj=Query2.覆盖面积
Update Query2 Set 地类面积=fl_lsmj-fl_summj,扣除线状面积=fl_summj
i=i+1
Loop
Commit Table Querult
扣除线状面积后的查询结果表Querult如下:

2.2.3 统计征地范围内各地类面积
将查询结果表Querult中的各记录地类面积按批文、宗号、范围、图斑号、地类号聚合后,得到的征地范围内各地类分布情况如图3所示:

图3
3 结束语
类似征地覆盖范围内各地类面积统计的这种计算方法,土地变更过程中的图形变更和信息提取也可用到,但土地变更涉及图形自动变化,要比征地计算复杂得多,本文不再赘述。
参考文献:
[1] MapInfo Corporation;MapInfo 用户手册
[2] MapInfo Corporation;MapBasic Help 电子手册
[3] 全国农业区划委员会;《土地利用现状调查技术规程》;1984.9
|