ArcSDE SDK For Java二次开发介绍、示例

在一个工作中,遇到了需要java后台来查询ArcGIS 中用到的Oracle数据库空间数据,由于对ArcGIS空间数据首次接触,只知道Oracle可以使用ST_GEOMETRY字段存储,如下图

但是查询时会发现这个ST_GEOMETRY字段会在结果中出现个多个子的字段,对于arcgis地理知识了解甚少,不知道单独查询一个坐标怎么弄了,有些朋友说需要配置监听文件。

不管怎么说,至少参考了一个大牛的文章,http://blog.csdn.net/linghe301/article/details/8058806 根据 ArcSDE For Java的API中,可以对其进行增删改查等操作。

对于ArcSDE for Java的介绍请参考大牛文章,就不重复写了。下面的示例代码中,经过修改,加了一些注释,还是不错的

package cn.sde.test;

import com.esri.sde.sdk.client.SeColumnDefinition;
import com.esri.sde.sdk.client.SeConnection;
import com.esri.sde.sdk.client.SeCoordinateReference;
import com.esri.sde.sdk.client.SeException;
import com.esri.sde.sdk.client.SeFilter;
import com.esri.sde.sdk.client.SeInstance;
import com.esri.sde.sdk.client.SeLayer;
import com.esri.sde.sdk.client.SeQuery;
import com.esri.sde.sdk.client.SeQueryInfo;
import com.esri.sde.sdk.client.SeRelease;
import com.esri.sde.sdk.client.SeRow;
import com.esri.sde.sdk.client.SeShape;
import com.esri.sde.sdk.client.SeShapeFilter;
import com.esri.sde.sdk.client.SeSqlConstruct;
import com.esri.sde.sdk.client.SeTable;

public class ArcSDE_Test3 {

	private static SeConnection conn = null;
	private static String server = "172.25.0.253"; // sde服务器
	private static String instance = "5151"; // sde端口
	private static String database = "orcl"; // sde数据库
	private static String username = "sde"; // sde用户名
	private static String password = "sde"; // sde密码

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

	/**
	 * ArcSDE管理
	 */
	public static void GetArcSDEInfo() {
		try {
			SeInstance instance = new SeInstance(server, "5151");
			SeInstance.SeInstanceStatus status = instance.getStatus();
			System.out.println("连接数:" + status.getNumConnections());
			System.out.println("可以连接:" + status.isAccepting());

			System.out.println("------------------------------------------------");

			SeInstance.SeInstanceConfiguration config = instance.getConfiguration();
			System.out.println("最大连接数:" + config.getMaxConnections());

			System.out.println("------------------------------------------------");

			SeInstance.SeInstanceStats[] stats = instance.getStats();
			for (int i = 0; i < stats.length; i++) {
				System.out.println("操作数:" + stats[i].getOperationCount());
			}

			System.out.println("------------------------------------------------");

			SeInstance.SeInstanceUsers[] users = instance.getUsers();
			for (int j = 0; j < users.length; j++) {
				System.out.println("用户名:" + users[j].getUserName());
				System.out.println("系统名:" + users[j].getSysName());
				System.out.println("服务器开始时间:" + users[j].getServerStartTime());
				System.out.println("服务器PID:" + users[j].getServerPid());
				System.out.println("*****************************");
			}

			System.out.println("------------------------------------------------");
			System.out.println("系统名:" + instance.getServerName());
			System.out.println("------------------------------------------------");

			System.out.println("------------------------------------------------");
			SeInstance.SeInstanceTableLocks[] tablelocks = instance.getTableLocks();
			for (int i = 0; i < tablelocks.length; i++) {
				System.out.println("表级别锁类型:" + tablelocks[i].getLockType());
				System.out.println("表级别锁PID:" + tablelocks[i].getPid());
				System.out.println("表级别锁注册ID:" + tablelocks[i].getRegistrationId());
				System.out.println("*****************************");
			}
			System.out.println("------------------------------------------------");
		} catch (SeException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 空间条件查询
	 * 目前存在的问题是,实际应该返回2条,但是,只返回了一条记录,有知道解决方法的朋友请告诉我,留言  跪谢!
	 */
	public static void SpatialQuery_Hz() {
		try {
			String tbname = "EZGISDATA.DCQWG_HB";	// 表名
			String[] cols = new String[7];	// 要查询字段的数组
			cols[0] = "JDNAME";
			cols[1] = "JDCODE";
			cols[2] = "SQNAME";
			cols[3] = "SQCODE";
			cols[4] = "WGNAME";
			cols[5] = "WGCODE";
			cols[6] = "TYPE";
			SeConnection conn = getConn();
			SeLayer layer = new SeLayer(conn, tbname, "SHAPE");	// shape为要查询的表中的空间数据字段

			SeCoordinateReference cr = layer.getCoordRef();
			SeFilter[] filters = new SeFilter[1];
			SeShape shape = new SeShape(cr);

			double x = 507638.3125000;	// x坐标
			double y = 303547.9687500;	// y坐标
			double xs = 0.000000001;

			double x1 = x - xs;
			double y1 = y + xs;

			double x2 = x + xs;
			double y2 = y + xs;

			double x3 = x + xs;
			double y3 = y - xs;

			double x4 = x - xs;
			double y4 = y - xs;
			String  polygonstr = "POLYGON((" + Double.toString(x1) + " " + Double.toString(y1);
					polygonstr = polygonstr + "," + Double.toString(x2) + " " + Double.toString(y2);
					polygonstr = polygonstr + "," + Double.toString(x3) + " " + Double.toString(y3);
					polygonstr = polygonstr + "," + Double.toString(x4) + " " + Double.toString(y4);
					polygonstr = polygonstr + "," + Double.toString(x1) + " " + Double.toString(y1);
					polygonstr = polygonstr + "))";
			shape.generateFromText(polygonstr);		// 设置查询参数,根据polygon查询

			// SDEPoint pt = new SDEPoint(507638.3125000,303547.9687500);//X,Y
			// shape.generatePoint(1, new SDEPoint[] { pt });
			SeFilter filter = new SeShapeFilter(tbname, layer.getSpatialColumn(), shape, SeShapeFilter.METHOD_AI);	// 设置过滤
			filters[0] = filter;

			SeSqlConstruct sqlCons = new SeSqlConstruct(tbname);
			SeQuery query = new SeQuery(conn, cols, sqlCons);
			query.prepareQuery();
			query.setSpatialConstraints(SeQuery.SE_OPTIMIZE, false, filters);
			query.execute();
			SeRow row = query.fetch();	// 类似数据库游标的功能
			int reccount = 0;
			while (row != null) {
				reccount = reccount + 1;
				String info = Integer.toString(reccount);
				for (int i = 0; i < cols.length; i++) {	// 将字段和结果同时输出
					info = info + " : " + cols[i] + ":" + row.getObject(i).toString();
				}
				System.out.println(info);
				row = query.fetch();
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 *  属性条件查询
	 */
	public static void AttributeQuery() {
		try {
			String tbname = "EZGISDATA.DCQWG_PY";
			String[] cols = new String[4];
			cols[0] = "NEWSQMC";
			cols[1] = "NEWSQBM";
			cols[2] = "NEWWGMC";
			cols[3] = "NEWWGBM";
			SeConnection conn = getConn();
			SeSqlConstruct sqlCons = new SeSqlConstruct(tbname);
			sqlCons.setWhere("JDNAME='和平里'");		// 设置条件,类似sql语句
			SeQuery query = new SeQuery(conn, cols, sqlCons);

			query.prepareQuery(cols, sqlCons);
			query.execute();
			SeRow row = query.fetch();
			int reccount = 0;
			while (row != null) {
				reccount = reccount + 1;
				System.out.println(Integer.toString(reccount) + " : " + row.getObject(0).toString() + " : " + row.getObject(1).toString()
						+ " : " + row.getObject(2).toString() + " : " + row.getObject(3).toString());
				row = query.fetch();
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 *  普通查询
	 */
	public static void CommonQuery() {
		try {
			SeConnection conn = getConn();
			SeTable table = new SeTable(conn, "EZGISDATA.DCQWG_PY");
			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("EZGISDATA.DCQWG_PY");
			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();
			SeRow row = query.fetch();
			while (row != null) {
				System.out.println(row.getObject(0).toString() + " : " + row.getObject(1).toString() + " : " + row.getObject(3).toString() + " : " + row.getObject(4).toString() + " : "
						+ row.getObject(5).toString() + " : " + row.getObject(6).toString() + " : " + row.getObject(7).toString() + " : " + row.getObject(8).toString());
				row = query.fetch();
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 *  获得ArcSDE版本信息
	 */
	public static void GetVersion() {
		SeConnection conn = getConn();
		SeRelease release = conn.getRelease();
		System.out.println(release.getBugFix());
		System.out.println(release.getDesc());
		System.out.println(release.getRelease());
		System.out.println(release.getMajor());
		System.out.println(release.getMinor());
	}

	public static void main(String[] args) {
//		 GetArcSDEInfo();
//		 GetVersion();
//		 CommonQuery();
//		 AttributeQuery();
		 SpatialQuery_Hz();	// 空间查询
	}

}

结果:

------------------------------------------------

1 : JDNAME:东花市 : JDCODE:13 : SQNAME:忠实里社区 : SQCODE:1303 : WGNAME:忠实里社区3号网格 : WGCODE:13033-0152 : TYPE:SG

时间: 2024-10-13 15:48:04

ArcSDE SDK For Java二次开发介绍、示例的相关文章

ArcSDE SDK For Java二次开发介绍、演示样例

在一个工作中,遇到了须要java后台来查询ArcGIS 中用到的Oracle数据库空间数据,因为对ArcGIS空间数据首次接触,仅仅知道Oracle能够使用ST_GEOMETRY字段存储,例如以下图 可是查询时会发现这个ST_GEOMETRY字段会在结果中出现个多个子的字段,对于arcgis地理知识了解甚少,不知道单独查询一个坐标怎么弄了,有些朋友说须要配置监听文件. 无论怎么说,至少參考了一个大牛的文章,http://blog.csdn.net/linghe301/article/detail

短信猫JAVA二次开发遇到的问题

公司最近买了个GSM 短信猫池用于发短信.在途中遇到很多问题,现在总结下遇到的问题. 1.首先GSM 自带有个针对数据库开发的软件,长短信服务器.按照对应规则,存入数据到表中,然后长短信服务器就会自动发送短信.按照客服给的资料一套流程走下来,磕磕绊绊的总算是可以发送短信了.结果把短信猫放到服务器上,长短信服务器就报各种错误,反正就是工作不了坑爹啊!因为我们服务器的系统是win2008R2,而我测试的机子是win7系统.至此决定用第2种方法:dll开发. 2.dll开发,用java开发,其中有自带

浅析软件二次开发的基本要求

二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能,一般来说都不会改变原有系统的内核.一般的来说,一些大公司如IBM开发了一个大型的软件系统平台,根据不同的客户的需要,一些其它的中小公司为客户根据需求在该平台上进行第二次有针对性的开发.是否提供相应的接口,有的软件公司只提供软件,但也有小公司连代码一起出售,如是后者,就更方便进行二次开发.比如售票系统,车站里面弄好了,提供几个储存过程给银行,银行就可以代理售票了,这也是一种,还有一种如我们利用delphi,C#等

软件二次开发的系统平台

二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能,一般来说都不会改变原有系统的内核.一般的来说,一些大公司如IBM开发了一个大型的软件系统平台,根据不同的客户的需要,一些其它的中小公司为客户根据需求在该平台上进行第二次有针对性的开发.是否提供相应的接口,有的软件公司只提供软件,但也有小公司连代码一起出售,如是后者,就更方便进行二次开发.比如售票系统,车站里面弄好了,提供几个储存过程给银行,银行就可以代理售票了,这也是一种,还有一种如我们利用delphi,C#等

配送短信猫二次开发接口提供多种开发语言示例

免费配送的信猫二次开发接口提供有多种开发语言示例,如C#.C++.Delphi.PowerBuilder.VB.net.VC++.VisualBasic等多种开发示例方便程序开发人员开发调试.使用简单方便,将sms.dll文件拷贝到系统安装目录中的system32文件夹中,然后再根据以下接口函数说明和提供的例程源码开发,无需安装,免加密狗. 短信猫二次开发接口提供的开发语言示例有: 部分短信猫二次开发接口函数说明: 1.Sms_Connection(Com_Port As Integer,Com

基于Java的Arc Engine二次开发的环境的配置

1.软件准备 ArcGIS for Desktop 10.2, Arc engine, jdk-7u60-windows-i586,Eclipse Mar2 2.软件的安装 2.1 ArcGIS for Desktop 10.2的安装 软件的下载:ArcGIS for Desktop 10.3全套的下载:http://pan.baidu.com/s/1o7F4yue,附带破解方法 本文使用的是10.2,其下载路径与安装破解方法如:http://jingyan.baidu.com/article/

Lucene.Net 2.3.1开发介绍 —— 三、索引(二)

原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的基础,Directory是索引建立中或者建立好存储的介质,Document和Field类是逻辑结构的核心,IndexWriter是操作的核心.其他类的使用都被隐藏掉了,这也是为什么Lucene.Net使用这么方便的原因. 2.1 Analyzer 前面已经对Analyzer进行了很详细的讲解,Ana

【转】Java开源项目源码阅读方法及二次开发方法

一直以来,都想要阅读某些Java开源项目的源代码,甚至想要修改某些代码,实现对开源项目进行二次开发的目的.但总是不知从何入手,直接将开源项目的源代码导入Eclipse,总是会报很多错误,而无法编译.可以直接通过Eclipse打开开源项目的源代码,至少能够达到可视化源码阅读.源码导航的目的,还是能在一定程度上解决源码阅读不爽的问题,因为直接打开并没有改变源文件项目的目录结果,对于修改过后的代码,可以通过命令行找到源文件项目目录,并使用mvn或者ant对项目进行编译,再查看修改后的项目是否正确. 由

基于java的微信公众号二次开发视频教程

详情请交流  QQ  709639943 00.基于java的微信公众号二次开发视频教程 00.leetcode 算法 面试 00.北风网 零基础到数据(大数据)分析专家-首席分析师 00.快速上手JMeter 00.Jmeter 00.2017年Java web开发工程师成长之路 00.R语言速成实战 00.R语言数据分析实战 00.Python+Django+Ansible Playbook自动化运维项目实战 00.Java深入微服务原理改造房产销售平台 00.Python3入门机器学习 经