ArcGIS中应用Expressions标注(Label)之二—使用外部数据库中数据标注要素
2008-02-26 14:28
891 查看
标注的具体步骤:
1. 打开ArcMap,添加需要标注的图层。
2. 点击该图层属性(layer properties)对话框中的标注(label)标签,点击Expression按钮。
3. 在Label Expression对话框中,选中Advanced复选框,在Expression框里即可见FindLabel()函数的桩代码。
4. 将光标移至FindLabel后面的括号里,在Label Fields中双击需要使用的字段的字段名。
5. 在Expression表达式里书写VBScript代码(如下)。
6. 通过给函数名赋值返回字符串(例如:FindLabel = aString)。
7.最后点击Verify按钮,验证代码是否正确,如果代码无误,ArcMap将显示标注的样例。
该方法的优点就是迅速,只需几秒钟就可以标注上百个多边形(尽管标注的速度与PC机性能及网络速度有关)。
该方法的缺点是它要创建、打开再关闭数据库连接,并且为地图上的每一个可见要素做查询。需要做很多要素的标注时,这样的动作会使处理速度减慢,增加网络流量。解决此问题的一个方法就是设置可见比例尺(Scale Range)。在LayerProperties对话框的Label标签里,点击Scale Range按钮,定义标注的可见比例尺范围。
VBScript代码如下:
Function FindLabel ( [OBJECTID] )
Dim strPrclQry, strInfostrPrclQry = "SELECT OWNER_NAME FROM aTABLE WHERE OBJECTID = ' " & [OBJECTID] & " ' "Dim ADOConnset ADOConn = createobject("ADODB.Connection")Dim rsPrcl
set rsPrcl = createObject("ADODB.Recordset")
ADOConn.Open "PROVIDER=MSDAORA;Data Source=aDatabaseService;
User ID=aUserName;Password=aPassword"
ADOConn.CursorLocation = 3
rsPrcl.Open strPrclQry, ADOConn, 3, 1, 1
'如果没有找到记录,则返回空字符串
'如果找到多于一条的记录,则通过"<<More>>"来暗示含有多条业主信息
'可以做循环,直到标注出所有的业主信息
Select Case rsPrcl.RecordCount
Case -1, 0
strInfo = ""
Case 1
'只读取第一条记录
strInfo = trim(rsPrcl.Fields("OWNER_NAME").Value & " ") '在空值的情况下将出错
Case Else
strInfo = rsPrcl.Fields("OWNER_NAME").Value & "<< More >>"
End Select
'关闭连接
rsPrcl.Close
ADOConn.Close
Set rsPrcl = Nothing
Set ADOConn = Nothing
'返回字符串用于标注
FindLabel = strInfo
End Function
注意:在VBScript中,创建任何对象都要使用CreateObject()函数,并且要含有正确库名和对象名(例如:ADODB.Connection)。只要创建了Connection和RecordSet 对象,就可以使用正确的连接字符串打开数据库连接,通过一个正确的SQL语句打开RecordSet,使用带有字段名的RecordSet对象的Value属性获取数据。当获取数据之后,必须确保RecordSet和Connection对象关闭并且置空。
1. 打开ArcMap,添加需要标注的图层。
2. 点击该图层属性(layer properties)对话框中的标注(label)标签,点击Expression按钮。
3. 在Label Expression对话框中,选中Advanced复选框,在Expression框里即可见FindLabel()函数的桩代码。
4. 将光标移至FindLabel后面的括号里,在Label Fields中双击需要使用的字段的字段名。
5. 在Expression表达式里书写VBScript代码(如下)。
6. 通过给函数名赋值返回字符串(例如:FindLabel = aString)。
7.最后点击Verify按钮,验证代码是否正确,如果代码无误,ArcMap将显示标注的样例。
该方法的优点就是迅速,只需几秒钟就可以标注上百个多边形(尽管标注的速度与PC机性能及网络速度有关)。
该方法的缺点是它要创建、打开再关闭数据库连接,并且为地图上的每一个可见要素做查询。需要做很多要素的标注时,这样的动作会使处理速度减慢,增加网络流量。解决此问题的一个方法就是设置可见比例尺(Scale Range)。在LayerProperties对话框的Label标签里,点击Scale Range按钮,定义标注的可见比例尺范围。
VBScript代码如下:
Function FindLabel ( [OBJECTID] )
Dim strPrclQry, strInfostrPrclQry = "SELECT OWNER_NAME FROM aTABLE WHERE OBJECTID = ' " & [OBJECTID] & " ' "Dim ADOConnset ADOConn = createobject("ADODB.Connection")Dim rsPrcl
set rsPrcl = createObject("ADODB.Recordset")
ADOConn.Open "PROVIDER=MSDAORA;Data Source=aDatabaseService;
User ID=aUserName;Password=aPassword"
ADOConn.CursorLocation = 3
rsPrcl.Open strPrclQry, ADOConn, 3, 1, 1
'如果没有找到记录,则返回空字符串
'如果找到多于一条的记录,则通过"<<More>>"来暗示含有多条业主信息
'可以做循环,直到标注出所有的业主信息
Select Case rsPrcl.RecordCount
Case -1, 0
strInfo = ""
Case 1
'只读取第一条记录
strInfo = trim(rsPrcl.Fields("OWNER_NAME").Value & " ") '在空值的情况下将出错
Case Else
strInfo = rsPrcl.Fields("OWNER_NAME").Value & "<< More >>"
End Select
'关闭连接
rsPrcl.Close
ADOConn.Close
Set rsPrcl = Nothing
Set ADOConn = Nothing
'返回字符串用于标注
FindLabel = strInfo
End Function
注意:在VBScript中,创建任何对象都要使用CreateObject()函数,并且要含有正确库名和对象名(例如:ADODB.Connection)。只要创建了Connection和RecordSet 对象,就可以使用正确的连接字符串打开数据库连接,通过一个正确的SQL语句打开RecordSet,使用带有字段名的RecordSet对象的Value属性获取数据。当获取数据之后,必须确保RecordSet和Connection对象关闭并且置空。
相关文章推荐
- ArcGIS中应用Expressions标注(Label)之一—上下标、分数等特殊形式
- ArcGIS中应用Expressions标注(Label)之一—上下标、分数等特殊形式标注
- Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定之二:使用外部URL的XML文件)
- VC中ODBC数据库技术应用源程序详解之二(串口数据保存相关)
- ArcGIS中标注(label)的使用技巧
- Entity Framework应用:使用Code First模式管理数据库创建和填充种子数据
- 便携Gis数据库spatialite使用及与Arcgis数据互转
- Windows 8 Metro应用中使用C#连接SQLite及创建数据库,数据表的增删改查
- ArcGIS Engine Maplex Label(标注)使用一例
- Android应用开发之sqlite使用模糊查询数据库数据的三种方式
- java、Extjs导出数据库里的数据至Excel并下载至本地进行数据备份方法之二——使用Action
- ASP.net 中使用Flexigrid详细教程之二-直接使用数据库数据(有图有真相)
- Unity3D -- 使用数据库MySQL(数据存储之二)
- 使用spring框架在应用启动时加载数据库中的数据资源加入缓存
- Code-First 在SQLServer Compact 4.0 中的应用(二),使用Migrations更改数据库架构并保留历史数据
- ArcGIS中标注(label)的使用技巧
- 数据库中使用Blob处理二进制数据
- 关于使用sql删除数据库重复的数据的方法整理:
- 使用HibernateTemplate持久化数据无法进入数据库的解决方法
- 使用SqlBulkCopy将DataTable中的数据批量插入数据库中