ArcSDE Java SDK获得要素类的要素数量FeatureCount

99 篇文章 0 订阅
19 篇文章 0 订阅

很早就有用户反映,ArcSDE的SDK没有直接获得要素类要素数量的函数,用户只能通过基本查询循环来获得要素的总数,因为SDE的开发基本没有看过,也没有太在意,今天看了一下相关的帮助,其实还是有不少办法来获得这个FeatureCount的。

不过我是以如果是版本数据和非版本数据来进行函数的编写,而且版本数据的获得肯定是通用的。

相关环境:

ArcSDE SDK 10

Java SDK

注意:我的SDE里面一个要素类名称“conn”

如果是非版本数据的查询,我们可以直接使用SQL语句来获得,非常方便的

public static void queryLayerFeatureCount() {
		try {
			SeConnection conn = getConn();
			SeQuery query = new SeQuery(conn);
			//直接使用SQL语句,该情况只适用于非arcsde版本
			String sql="select count(objectid) from conn";
			query.prepareSql(sql);
			query.execute();

			SeRow row = query.fetch();
			while (row != null)
			{
				System.out.println("------featureclass feature count -----------------");
				System.out.println(row.getObject(0).toString());
				System.out.println("--------------------------------------------------");
				row = query.fetch();
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}


但是如果是用户使用版本编辑的话,上面的函数肯定不行,但是我发现有一个表的统计可以获得RowCount
	public static void queryLayerVersionedFeatureCount() 
	{
		try {
			SeConnection conn = getConn();
			SeTable table = new SeTable(conn, "conn");
			SeColumnDefinition[] tableDef = table.describe();
			String[] cols = new String[tableDef.length];
			for (int j = 0; j < cols.length; j++)
			{
				cols[j] = tableDef[j].getName();
			}
			SeSqlConstruct sqlCons = new SeSqlConstruct("conn");
			SeQuery query = new SeQuery(conn, cols, sqlCons);
			

				SeQueryInfo queryInfo = new SeQueryInfo();
				queryInfo.setQueryType(SeQueryInfo.SE_QUERYTYPE_ATTRIBUTE_FIRST);
				queryInfo.setColumns(cols);
				queryInfo.setConstruct(sqlCons);
				
				//query.prepareQueryInfo(queryInfo);
				//query.execute();
				
					SeTable.SeTableStats stats=query.calculateTableStatistics("*", SeTable.SeTableStats.SE_COUNT_STATS, queryInfo, 0);
					int count= stats.getCount();
					System.out.println("------featureclass feature count -----------------");
					System.out.println(count);
					System.out.println("--------------------------------------------------");
				
			
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

大家是否看到注释的两行代码,如果加上会报如下错误:

 ArcSDE Error Number        : -52
 Error Description          : SHAPE/FID STREAM NOT FINISHED, CAN'T EXECUTE.
 Extended Error Description : 

浪费了我不少时间。

好了,有了上面的例子,大家就不用再整个对要素类进行循环累计计数来获得要素类的要素总数了。


以下代码都运行没有问题,用户只需要修改相关的参数即可,把全部的例子送上

package lish.test;
import com.esri.sde.sdk.client.*;
public class test {
	
	private static SeConnection conn = null;

	private static String server = "192.168.205.142";
	private static String instance = "5353";
	private static String database = "";
	private static String username = "sde";
	private static String password = "sde";

	private static SeConnection getConn() {
		if (conn == null) {
			try {
				conn = new SeConnection(server, instance, database, username,
						password);
			} catch (SeException ex) {
				ex.printStackTrace();
			}
			
		}
	    
		return conn;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		queryLayerVersionedFeatureCount(); 
	}
	public static void queryLayerVersionedFeatureCount() 
	{
		try {
			SeConnection conn = getConn();
			SeTable table = new SeTable(conn, "conn");
			SeColumnDefinition[] tableDef = table.describe();
			String[] cols = new String[tableDef.length];
			for (int j = 0; j < cols.length; j++)
			{
				cols[j] = tableDef[j].getName();
			}
			SeSqlConstruct sqlCons = new SeSqlConstruct("conn");
			SeQuery query = new SeQuery(conn, cols, sqlCons);
			

				SeQueryInfo queryInfo = new SeQueryInfo();
				queryInfo.setQueryType(SeQueryInfo.SE_QUERYTYPE_ATTRIBUTE_FIRST);
				queryInfo.setColumns(cols);
				queryInfo.setConstruct(sqlCons);
				
				//query.prepareQueryInfo(queryInfo);
				//query.execute();
				
					SeTable.SeTableStats stats=query.calculateTableStatistics("*", SeTable.SeTableStats.SE_COUNT_STATS, queryInfo, 0);
					int count= stats.getCount();
					System.out.println("------featureclass feature count -----------------");
					System.out.println(count);
					System.out.println("--------------------------------------------------");
				
			
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	public static void queryLayerFeatureCount() {
		try {
			SeConnection conn = getConn();
			SeQuery query = new SeQuery(conn);
			//直接使用SQL语句,该情况只适用于非arcsde版本
			String sql="select count(objectid) from con";
			query.prepareSql(sql);
			query.execute();

			SeRow row = query.fetch();
			while (row != null)
			{
				System.out.println("------featureclass feature count -----------------");
				System.out.println(row.getObject(0).toString());
				System.out.println("--------------------------------------------------");
				row = query.fetch();
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

-------------------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
------------------------------------------------------------------------------------------------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值