三、查询
1、 属性查找。Find、Search方法:注意的是Find方法只支持TAB表文件,不支持空间数据
表。
Find :与FoxPro中Locate定位命令想类似。
Search:支持SQL语句。写法:仅指SQL语句的WHERE 部分,且From语句中只能有一个表—
—仅对单表进行操作:Select * from LayerName WHERE ID LIKE “%北京%”
示例:
A、查找
Dim Ftrs AS MapXlib.Features ‘图元集合
SET Ftrs=Lyr.Search(“ID LIKE ““%北京%”””)
For I=1 to Ftrs.Count
‘执行语句
Next
B、高亮显示
Lyr.Selection.Replace Ftrs ‘将当前查询所得的结果集全部高亮显示(隐含执行:
Lyr.ClearSelection语句)——加入selection集合
闪烁:不能用Selection,否则会对整个屏幕进行整个刷新(抖动)。使用更新Style的方
法进行选定图元的闪烁。
记载图元的老样式:Set Oldsytle=Ftr.Style
Lyr.Selection.Add Ftrs ‘将当前查询所得的结果集添加到已有的结果集中,再全部
高亮显示
C、对查询的结果集进行属性修改
示例程序:完成的是Professional中信息工具功能
Dim ds AS MapXlib.Dataset
Dim Flds AS MapXlib.Fields
Dim Ftr AS MapXlib.Feature
Set Lyr=MainMap.Layers.Item(LayerName)
Set ds=Lyr.Datasets.item(1)
Set Flds=ds.Fields
‘查找
SET Ftrs=Lyr.Search(“ID LIKE ““%北京%”””)
If Ftrs.count=0 then exit sub
‘读取属性值
For I=1 to Ftrs.Count
Set Ftr=Ftrs.Item(I)
For j=1 to Flds.count
FldsName(J)=Flds.Item(J).Name ‘字段列表
Lyr.KeyField=FldsName(J)
ValueStr(I,J)=Ftr.KeyValue ‘值列表
Next
Next
‘修改属性
MainMap.AuyoRedraw=False
Lyr.Editable=True
For j=1 to Flds.count
Lyr.KeyField= Flds.Item(J).Name
Ftrs.Item(j).KeyValue =ValueStr(J) ‘更新值列表
Ftrs.Item(j).Update True
Next
Lyr.Refresh
Lyr.Editable=False
MainMap.AuyoRedraw=True
‘修改样式
Dim NewStyle AS MapXlib.Style
With NewStyle
‘设置样式
End With
MainMap.AuyoRedraw=False
Lyr.Editable=True
For i=1 to Ftrs.count
Set Ftr =Ftrs.Item(I)
SET Ftr.Style=NewStyle ‘更新样式
Ftr.Update True
Next
Lyr.Refresh
Lyr.Editable=False
MainMap.AuyoRedraw=True
2、 空间查找
² 点查找:SearchAtPoint,结果集为Features类型
Dim Pnt AS MapXlib.Point
Pnt.Set X,Y
Set Ftrs=Lyr.SearchAtPoint(Pnt,miSearchResultAll)
For I=1 to Ftrs.Count
‘执行语句
Next
注意:点查找时,一般情况下结果集在一个以上的图层都存在。所以取值时应分别提取
² 园查找:在临时图层上画一个不保存的圆,然后查找被这个圆所包含的所有图层的
图元对象。
Dim Pnt AS MapXlib.Point
Dim TempCir AS MapXlib.Feature
Dim FeaFac AS MapXLIB.featurefactory
Pnt.Set X,Y
Set tempcir=FeaFac.CreateCircularRegion(miCircleTypeMap ,Pnt,1, MainMap.MapUni
t,,)
‘miSearchTypeCentroidWithin :中心点包含
‘miSearchTypePartiallyWithin :部分包含
‘miSearchTypeEntirelyWithin :全部包含
Set Ftrs=Lyr.SearchWithinFeature (TempCir, miSearchTypePartiallyWithin)
For I=1 to Ftrs.Count
‘执行语句
Next
SET Pnt =Nothing
set TempCir =Nothing
set FeaFac =Nothing
3、 相交
判断两个图元是否有交点以及交点坐标信息。
(1)判断是否相交
IF Lyr.IntersectionTest( ftr1, ftr2, miIntersectFeature ) THEN
‘交点
END IF
(2)获取相交点坐标信息
‘交点
Dim Ftr AS MapXlib.Feature
SET Ftr=MainMap.FeatureFactory. IntersectFeatures(Ftr1,Ftr2)
‘交点坐标信息
For J=1 to Ftr.parts.item(1).count
X1= Ftr.parts.item(1).Item(J).X
Y1= Ftr.parts.item(1).Item(J).Y
Next
4、 测距
使用Map对象的Distance方法。如何测量任意多边形的周长?
使用累加的方法,还要使用图元节点集合。
DistanceValue=0
‘第一个点
Pnt.Set Ftr.Parts.Item(1).Item(1).X, Ftr.Parts.Item(1).Item(1).Y
For j=2 TO Ftr.Parts.Item(1).Count
‘累加
X1= Ftr.Parts.Item(1).Item(j-1).X
Y1= Ftr.Parts.Item(1).Item(j-1).Y
X2= Ftr.Parts.Item(1).Item(j).X
Y2= Ftr.Parts.Item(1).Item(j).Y
DistanceValue = DistanceValue +MainMap.Distance(X1, Y1, X2, Y2)
Next
‘多边形周长
Msgbox DistanceValue+” ”+MainMap.MapUnit