<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1109386848296845044</id><updated>2011-07-08T04:07:34.046+08:00</updated><category term='Map'/><category term='PHP'/><category term='Mobile'/><category term='QT'/><category term='杂谈'/><category term='REST'/><category term='Linux'/><category term='GPT'/><category term='GPS'/><category term='ArcGIS'/><category term='GeoData'/><category term='Flex'/><category term='其它'/><category term='PostgreSQL/PostGIS'/><category term='Java'/><category term='Android'/><category term='SDE'/><category term='OGC'/><category term='GeoServer'/><title type='text'>☆牛魔王的作坊☆</title><subtitle type='html'>猴子都能写代码，这个年代还有什么不可能？</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default?start-index=101&amp;max-results=100'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>158</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-1083422189549059032</id><published>2010-06-21T11:21:00.000+08:00</published><updated>2010-06-30T00:29:38.597+08:00</updated><title type='text'>《ArcSDE SDK Java 快速实践》 PDF</title><content type='html'>http://cid-c71882196b68eee5.office.live.com/self.aspx/%E5%85%AC%E5%BC%80%E5%85%B1%E4%BA%AB%E6%96%87%E6%A1%A3/ArcSDE%20SDK%20Java%20%E5%BF%AB%E9%80%9F%E5%AE%9E%E8%B7%B5.pdf  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-1083422189549059032?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/1083422189549059032/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=1083422189549059032' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1083422189549059032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1083422189549059032'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-sdk-java-pdf.html' title='《ArcSDE SDK Java 快速实践》 PDF'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-6142202851076682063</id><published>2010-06-21T11:09:00.000+08:00</published><updated>2010-06-30T00:29:07.485+08:00</updated><title type='text'>ArcSDE SDK Java 快速实践 8</title><content type='html'>I. ArcSDE服务管理 · SeInstance 通过SeInstance对象可以管理和查询ArcSDE的服务实例，比如通过下面的代码可以从实例中获取ArcSDE服务的配置信息： try { SeInstance instance = new SeInstance("localhost", 5151); SeInstanceConfiguration config = instance.getConfiguration(); System.out.println("最大连接数："+config.getMaxConnections()); } catch (SeException e) { e.printStackTrace(); } 还可以获得实例的运行状态信息： try { SeInstance instance = new SeInstance("localhost", 5151); SeInstanceStatus status = instance.getStatus(); System.out.println("连接数："+status.getNumConnections&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-6142202851076682063?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/6142202851076682063/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=6142202851076682063' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6142202851076682063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6142202851076682063'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-sdk-java-8.html' title='ArcSDE SDK Java 快速实践 8'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8744192304583068849</id><published>2010-06-21T11:08:00.001+08:00</published><updated>2010-06-30T00:29:08.492+08:00</updated><title type='text'>ArcSDE SDK Java 快速实践 6</title><content type='html'>I. 图层锁 · 图层锁的类型和作用 ArcSDE图层中定义了两种锁，SE_READ_LOCK和SE_WRITE_LOCK。锁影响的范围可以是整个图层或者是图层中的某个范围。 当数据以SE_READ_LOCK的方式锁住以后，这部分数据就被保护起来以防止被更新。其它用户也可以在相同的数据上建立SE_READ_LOCK锁，但是不能再加SE_WRITE_LOCK锁或者更新数据。 当数据以SE_WRITE_LOCK的方式锁住以后，这部分数据不但不能被其它用户更新，而且其它用户也不能再在相同的数据上加任何锁。 由此也可以推出，如果在图层上以SE_READ_LOCK方式锁定的数据互相是可以有重叠的，而以SE_WRITE_LOCK方式锁定的数据是不能相互重叠的。 · 使用锁 以下的代码显示了如何在图层上添加和释放锁： SeConnection conn = getConn(); if (conn != null) { try { SeLayer layer = new SeLayer(conn, "SDE_CITIES", "SHAPE"); layer.lock(SeLayer.SE_READ_L&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8744192304583068849?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8744192304583068849/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8744192304583068849' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8744192304583068849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8744192304583068849'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-sdk-java-6.html' title='ArcSDE SDK Java 快速实践 6'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5749757039456060634</id><published>2010-06-21T11:08:00.000+08:00</published><updated>2010-06-30T00:29:06.974+08:00</updated><title type='text'>ArcSDE SDK Java 快速实践 7</title><content type='html'>I. 版本 · 添加删除版本 通过如下的代码可以基于Default版本创建一个新的子版本： SeConnection conn = getConn(); if (conn != null) { try { SeVersion v_1 = new SeVersion(conn, SeVersion.SE_QUALIFIED_DEFAULT_VERSION_NAME); v_1.setName("v_1"); v_1.create(true, v_1); } catch (SeException e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SeException e) { e.printStackTrace(); } } } 至于删除版本就更容易了： SeConnection conn = getConn(); if (conn != null) { try { SeVersion v_1 = new SeVersion(conn, "v_1"); v_1.delete(); } catch (SeE&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5749757039456060634?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5749757039456060634/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5749757039456060634' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5749757039456060634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5749757039456060634'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-sdk-java-7.html' title='ArcSDE SDK Java 快速实践 7'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-7013482362451271743</id><published>2010-06-21T11:07:00.000+08:00</published><updated>2010-06-30T00:29:05.967+08:00</updated><title type='text'>ArcSDE SDK Java 快速实践 5</title><content type='html'>I. 数据操作 · 添加 添加数据操作封装在SeInsert类中，如下的代码展示了如何在一个名为“PT”的点图层中添加数据： SeConnection conn = getConn(); if (conn != null) { try { SeInsert insert = new SeInsert(conn); insert.intoTable("PT", new String[] { "SHAPE", "NAME" }); insert.setWriteMode(true);// 开启buffer SeLayer layer = new SeLayer(conn, "PT", "SHAPE"); SeCoordinateReference cr = layer.getCoordRef(); for (int i = 0; i 4"); String[] cols = new String[] { "OBJECTID", "SHAPE","NAME" }; SeQuery query = new SeQuery(conn, cols, sqlC); query.prepareQuer&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-7013482362451271743?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/7013482362451271743/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=7013482362451271743' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7013482362451271743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7013482362451271743'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-sdk-java-5.html' title='ArcSDE SDK Java 快速实践 5'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5344139547703363999</id><published>2010-06-21T11:04:00.000+08:00</published><updated>2010-06-30T00:29:05.390+08:00</updated><title type='text'>ArcSDE SDK Java 快速实践 3</title><content type='html'>I. 表和图层 在ArcSDE中的“表”（Table）指的就是所有的数据库表对象，而“图层”（Layer）指的是在ArcSDE中注册过的空间表。 · SeTable 1. 创建表 通过SeTable的create方法可以创建一个表，一下代码展示了如何创建一个名为“CREATE_TEST”的表： SeConnection conn = getConn(); if(conn !=null){ try { SeTable table = new SeTable(conn, "CREATE_TEST"); SeColumnDefinition[] colDefs = new SeColumnDefinition[2]; colDefs[0] = new SeColumnDefinition("ID", SeColumnDefinition.TYPE_INT32, 10, 0, false); colDefs[1] = new SeColumnDefinition("NAME", SeColumnDefinition.TYPE_STRING, 0, 0, true); table.create(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5344139547703363999?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5344139547703363999/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5344139547703363999' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5344139547703363999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5344139547703363999'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-sdk-java-3.html' title='ArcSDE SDK Java 快速实践 3'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-6044202888762860151</id><published>2010-06-18T10:46:00.000+08:00</published><updated>2010-06-30T00:29:04.396+08:00</updated><title type='text'>ArcSDE SDK Java 快速实践 2</title><content type='html'>I. 连接和流 · ArcSDE连接SeConnection 通过ArcSDE SDK可以通过服务连接和直连两种方式进行连接。如果要进行直连可以参考这里： http://edndoc.esri.com/arcsde/9.3/api/japi/japi.htm 不过直连的配置比较复杂，一般尽量通过服务方式连接到ArcSDE服务器，以下的代码可以通过服务连接到ArcSDE，然后返回一个SeConnection对象: private SeConnection conn = null; private static String server = "192.168.200.222"; private static String instance = "5151"; private static String database = ""; private static String username = "sde"; private static String password = "sde"; public SeConnection getConn() { if (conn == null) &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-6044202888762860151?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/6044202888762860151/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=6044202888762860151' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6044202888762860151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6044202888762860151'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-sdk-java-2.html' title='ArcSDE SDK Java 快速实践 2'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-7389651116579986109</id><published>2010-06-18T10:45:00.000+08:00</published><updated>2010-06-30T00:29:03.353+08:00</updated><title type='text'>ArcSDE SDK Java 快速实践 1</title><content type='html'>I. 几何对象 ArcSDE SDK中的几何对象定义分布在很多地方，他们各自有不同的用途。其中一部分几何对象类型组织在com.esri.sde.sdk.geom包中、在com.esri.sde.sdk.client包中包含有SeShape和SDEPoint等类型。 com.esri.sde.sdk.geom包中组织的是符合OGC规范的简单对象，它们之间的关系如下图：   图 1 com.esri.sde.sdk.geom包的类关系图 com.esri.sde.sdk.client包中组织的则是ArcSDE客户端中的几何对象。 · SeGeometry 构造SeGeometry对象还需要一个空间参考对象SeCoordRef，比如一个点对象应该用如下的方式构造： SeCoordRef cr = new SeCoordRef(); SePoint pt = new SePoint(cr, 116.39, 39.9); 这里通过X、Y坐标值就可以构造一个点对象，类似的，线对象和面对象则可以通过SePoint点的集合来进行构造： SeCoordRef cr = new SeCoordRef();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-7389651116579986109?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/7389651116579986109/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=7389651116579986109' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7389651116579986109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7389651116579986109'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-sdk-java-1.html' title='ArcSDE SDK Java 快速实践 1'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-3138614753137296094</id><published>2010-06-13T11:10:00.000+08:00</published><updated>2010-06-30T00:29:39.499+08:00</updated><title type='text'>《ArcSDE vs. Oracle Spatial》 PDF</title><content type='html'>   http://cid-c71882196b68eee5.office.live.com/embedicon.aspx/%e5%85%ac%e5%bc%80%e5%85%b1%e4%ba%ab%e6%96%87%e6%a1%a3/ArcSDE%20vs.%20Oracle%20Spatial.pdf &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-3138614753137296094?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/3138614753137296094/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=3138614753137296094' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3138614753137296094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3138614753137296094'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-vs-oracle-spatial-pdf.html' title='《ArcSDE vs. Oracle Spatial》 PDF'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-2254412579345878556</id><published>2010-06-13T10:51:00.000+08:00</published><updated>2010-06-30T00:29:15.999+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 18</title><content type='html'>一些补充测试结果： 1. 几何对象的存储空间 为了测试Oracle Spatial和ArcSDE在相对真实的环境中几何对象存储空间的大小，测试分别使用了2个包含约1亿个要素的线数据和面数据进行。其中线数据只包含几何信息，面数据还包含一些属性信息。大部分线数据只包含2个节点，而面数据一般都是几十个节点以上  对这2个数据分别进行了存储空间的比较：      数据  存储类型  空间数据表存储大小(G)   线数据  ST_GEOMETRY  14.72   SDO_ GEOMETRY  16.51   面数据  ST_ GEOMETRY  49.93   SDO_ GEOMETRY  87.87 可见随着几何对象节点数的增加，SDO_Geometry存储耗费的空间要多不少。  &amp;nbsp; · 空间索引的性能 1. 空间索引的用处 对于空间数据库进行空间查询的操作一般都有两个阶段，对于Oracle Spatial而言，一个空间查询分为2个步骤，一个称为主过滤（Primary Filter），另外一个称为次过滤（Secondary Filter）。主过滤通过矩形的MBR相交从海量的数据中首先过滤出可&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-2254412579345878556?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/2254412579345878556/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=2254412579345878556' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2254412579345878556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2254412579345878556'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-vs-oracle-spatial-18.html' title='ArcSDE vs. Oracle Spatial 18'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-2197704142840461724</id><published>2010-06-13T10:19:00.000+08:00</published><updated>2010-06-30T00:29:15.521+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 17</title><content type='html'>I. 其它 · 还没有涉及的话题 关于Oracle Spatial的GeoRaster支持本文没做研究。另外，Oracle Spatial中现在还支持一些更“GIS”的功能，比如网络、拓扑；还有一些更“Web”的功能，比如Web Service的支持。对这些功能我的兴趣实在不大，由于精力有限暂时也就不再研究了。事实上从第III章开始，后面的比较都有些“多余”，因为在实际应用中，如果采用ArcSDE和ArcGIS的产品，很少会直接在数据库服务器上执行这些空间关系运算、几何处理等操作，取而代之的是在客户端的ArcGIS Engine或者应用服务器的ArcGIS Server等环境中进行的。而与此相对的是，如果仅采用Oracle Spatial，必然将基本的空间数据存取和其它高级GIS业务的压力（通常是高CPU资源消耗）都放到数据库服务器，这样的系统设计我觉得也并不太可取。 而且，ArcSDE和Oracle Spatial也并不冲突，ArcSDE支持ST_Geometry类型的存储，同样也支持SDO_Geometry类型的存储，使用ArcSDE也并不意味着就摒弃了Oracle Spatial&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-2197704142840461724?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/2197704142840461724/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=2197704142840461724' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2197704142840461724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2197704142840461724'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-vs-oracle-spatial-17.html' title='ArcSDE vs. Oracle Spatial 17'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4037493612738634946</id><published>2010-06-13T10:15:00.000+08:00</published><updated>2010-06-30T00:29:57.776+08:00</updated><title type='text'>切图地图服务使用Flex API编辑和更新切图</title><content type='html'>ArcGIS Flex API 2.0开始支持访问ArcGIS Server 10 的Feature Service进行编辑。  Flex：  &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;   &amp;nbsp; 更新数据完成后，再通过基于ArcObjects开发的Web服务更新切图  Java：  &amp;nbsp;&amp;nbsp;&amp;nbsp; private String result(String objectids) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String result = "false";  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IServerContext serverContext = null;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResourceBundle rb = ResourceBundle.getBundle("wuyf.Config");  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String host = rb.getString("HOST");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String username = rb.getStr&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4037493612738634946?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4037493612738634946/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4037493612738634946' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4037493612738634946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4037493612738634946'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/flex-api.html' title='切图地图服务使用Flex API编辑和更新切图'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-9103942404480952194</id><published>2010-06-12T22:53:00.000+08:00</published><updated>2010-06-30T00:29:13.507+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 16</title><content type='html'>I. 线性参考 · Oracle Spatial 1. 创建线性参考的空间对象   图 15 一个线性参考空间对象的例子 对于如图 15的例子，Oracle Spatial中需要通过如下的SQL语句进行创建： SQL&gt; select SDO_GEOMETRY(3302, NULL, NULL,SDO_ELEM_INFO_ARRAY(1,2,1),SDO_ORDINATE_ARRAY(5,10,0, 20,5,NULL, 35,10,NULL, 55,10,100)) shape from dual; SHAPE(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES) ------------------------------------------------------------------------------------------------------------------------ SDO_GEOMETRY(3302, NULL, NULL, SDO_ELEM_INFO_ARRA&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-9103942404480952194?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/9103942404480952194/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=9103942404480952194' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/9103942404480952194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/9103942404480952194'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-vs-oracle-spatial-16.html' title='ArcSDE vs. Oracle Spatial 16'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-211113470733528970</id><published>2010-06-10T14:03:00.000+08:00</published><updated>2010-06-30T00:29:12.896+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 15</title><content type='html'>I. 几何处理 · 缓冲分析 Oracle Spatial中缓冲分析使用SDO_GEOM.SDO_BUFFER函数实现，下面是SDO_GEOM包中SDO_BUFFER函数的原型： function sdo_buffer(geom IN MDSYS.SDO_GEOMETRY, dist IN NUMBER, tol IN NUMBER, params IN VARCHAR2) return MDSYS.SDO_GEOMETRY DETERMINISTIC; 这里的dist为缓冲距离；tol为容差值；params代表2个可选参数，分别为unit=和arc_ tolerance=，这些可选参数可以帮助用户在地理坐标系的数据上直接进行投影距离的缓冲。 下面的操作是对一个经纬度点数据进行一个1000千米的缓冲后，再输出经纬度几何对象： SQL&gt; select sdo_geom.sdo_buffer(SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(0,0, NULL),NULL,NULL),1000,1,'arc_tolerance=0.1 unit=km') from&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-211113470733528970?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/211113470733528970/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=211113470733528970' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/211113470733528970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/211113470733528970'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-vs-oracle-spatial-15.html' title='ArcSDE vs. Oracle Spatial 15'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-977622002604545095</id><published>2010-06-08T17:28:00.000+08:00</published><updated>2010-06-30T00:29:12.619+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 13</title><content type='html'>I. 空间关系运算 以上两个章节是必不可少的基础，涉及到空间数据在数据库中的存储和通过索引加速空间数据的获取。从这句话也可以看出，后续的章节并不是必须的，也就是说某些基于空间数据的应用可能并不需要诸如空间关系判断、几何对象处理等功能。这并不是说这些功能就用不着了，而是这些功能并不一定需要在数据库端执行。比如基于ArcSDE，这些空间算法和功能在ArcGIS的产品线中无处不在，很多时候都不会把这些功能放到数据库上去。 · Oracle Spatial 在Oracle Spatial中，主要的空间关系操作在下表中列出：     空间操作  描述   SDO_FILTER  主过滤，判断哪些几何对象可能和给定的几何对象相交   SDO_JOIN  基于一定空间关系的表连接   SDO_NN  查询离某个几何对象最近的几何对象   SDO_NN_DISTANCE  查询离某个几何对象最近的几何对象与当前对象的距离   SDO_RELATE  判断两个几何对象是否满足某种空间关系   SDO_WITHIN_DISTANCE  判断两个几何对象间距离是否小于某给定值 其中SDO_RELATE操作比&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-977622002604545095?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/977622002604545095/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=977622002604545095' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/977622002604545095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/977622002604545095'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-vs-oracle-spatial-13.html' title='ArcSDE vs. Oracle Spatial 13'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-1687075824237542736</id><published>2010-06-08T17:25:00.000+08:00</published><updated>2010-06-30T00:29:11.613+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 12</title><content type='html'>· 空间索引的性能 1. 空间索引的用处 对于空间数据库进行空间查询的操作一般都有两个阶段，对于Oracle Spatial而言，一个空间查询分为2个步骤，一个称为主过滤（Primary Filter），另外一个称为次过滤（Secondary Filter）。主过滤通过矩形的MBR相交从海量的数据中首先过滤出可能符合空间查询的一小部分数据，然后再用次过滤中具体的空间关系算法来判断这个小的结果集中到底哪些是满足空间关系的。如图 12，在主过滤的过程中，空间索引会被使用到。   图 12 Oracle Spatial中空间查询的处理流程 对于ArcSDE来说，原理上也是类似，ArcSDE中有一个函数叫ST_ENVINTERSECTS，这就是通过四角坐标来从海量数据中过滤一个矩形范围内的一小部分数据。对于其它一般的空间操作，比如ST_WITHIN等，只要你的数据建立了空间索引，这个操作也会先通过空间索引找到一个小数据集（相当于ST_ENVINTERSECTS操作，或者说Oracle Spatial中的主过滤），然后再通过具体的“Within”的空间关系算法再查得准确的结果（相当于Oracle&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-1687075824237542736?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/1687075824237542736/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=1687075824237542736' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1687075824237542736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1687075824237542736'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-vs-oracle-spatial-12.html' title='ArcSDE vs. Oracle Spatial 12'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8526595674992887213</id><published>2010-06-07T10:33:00.000+08:00</published><updated>2010-06-30T00:29:11.157+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 11</title><content type='html'>1. 格网索引的创建和调整 ArcSDE提供了最多3级的空间索引，如何选择空间索引的层级、格网的网格大小设置多少合适等都关系到空间数据的性能。这里我们通过一个简单的Polygon图层入手，探讨一些格网空间索引的性能影响因素。 首先我们在ArcSDE中准备一个WGS84的面层，名为“TESTGRID”。在这个面层上我们添加2个要素，一个较小，一个较大，如图 10所示。为了提供一些参考信息，图中还将WGS84坐标范围按照30度的尺寸进行了分割，显示在这2个要素之下。   图 10 ArcSDE中有2个要素的面层 上述的数据如果我们创建3级索引，为了直观起见，我们可以把最小的网格尺寸定位30，也就是图 10中方格的大小。因此网格最大的第3级可以选择尺寸为270×270，那么第2级可以设置为90×90，第1级设置为30×30。我们如下创建空间索引： SQL&gt; CREATE INDEX A141_IX1 on TESTGRID(shape) INDEXTYPE is ST_SPATIAL_INDEX PARAMETERS ('ST_GRIDS=30,90,270 ST_SRID=2'); odc&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8526595674992887213?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8526595674992887213/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8526595674992887213' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8526595674992887213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8526595674992887213'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/06/arcsde-vs-oracle-spatial-11.html' title='ArcSDE vs. Oracle Spatial 11'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4277804780734434634</id><published>2010-05-28T16:12:00.000+08:00</published><updated>2010-06-30T00:29:18.716+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 8</title><content type='html'>I. 空间索引 对于空间数据中几何对象的索引显然不能套用数据库现有的索引类型，其不确定的数据结构和数据操作方法使现有的索引并不能适用，因此无论是Oracle Spatial还是ArcSDE都是采用域索引（Domain Index[1]）来实现，简单地说就是创建一个数据库中原来没有的新的索引类型。 · Oracle Spatial 1. 索引类型SPATIAL_INDEX Oracle Spatial中的空间索引极其重要，没建空间索引的空间表就像断了腿的兔子，不但跑不起来，甚至可能比乌龟还慢。 让我们从索引的创建入手来看一下Oracle Spatial的空间索引机制： SQL&gt; create index idx_test_index_geom on spatial.test_index(geom) indextype is mdsys.spatial_index; 索引已创建。 如果你的数据是用shp2sdo等工具导入的，那么直接就可以创建索引；如果是自己创建的空间表，那么必然会遇到ORA-13203错误，因为Oracle Spatial在创建空间索引时会读取USER_SDO_GEOM_&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4277804780734434634?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4277804780734434634/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4277804780734434634' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4277804780734434634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4277804780734434634'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/05/arcsde-vs-oracle-spatial-8.html' title='ArcSDE vs. Oracle Spatial 8'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-7168441991775589315</id><published>2010-05-14T17:21:00.000+08:00</published><updated>2010-06-30T00:29:15.773+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 7</title><content type='html'>常见几何对象的构造 介绍ESRI的ST_GEOMETRY的几何对象构造方法比Oracle Spatial就轻松多了，我们已经知道ST_GEOMETRY的各个子类型中的构造函数构造几何对象时都会首根据参数拼装成WKT格式的字符串，然后调用ST_SHAPELIB链接库转化到二进制的几何对象返回，那相对更通用的方法就是直接使用ST_GEOMETRY的构造函数，给一个WKT格式的字符串作为初始化参数就可以了： SQL&gt; select sde.st_geometry('POINT(1 1)',0) from dual; SDE.ST_GEOMETRY('POINT(11)',0)(ENTITY, NUMPTS, MINX, MINY, MAXX, MAXY, MINZ, MAXZ, MINM, MAXM, AREA, LEN, SRID, POINTS) ------------------------------------------------------------------------------------------------------------------------ S&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-7168441991775589315?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/7168441991775589315/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=7168441991775589315' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7168441991775589315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7168441991775589315'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/05/arcsde-vs-oracle-spatial-7.html' title='ArcSDE vs. Oracle Spatial 7'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4918414662594466031</id><published>2010-04-26T10:30:00.000+08:00</published><updated>2010-06-30T00:29:15.122+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 5</title><content type='html'>基于SDO_GEOMETRY的ST_GEOMETRY Oracle Spatial虽然使用了SDO_GEOMETRY类型作为几何对象的存储，不过它也提供了另外的一种类型ST_GEOMETRY，同时在此基础上还提供了一些符合OGC Simple Features Access规范的操作。 首先让我们来看一下这个ST_GEOMETRY的定义： CREATE OR REPLACE  TYPE ST_GEOMETRY AS OBJECT ( GEOM SDO_GEOMETRY, MEMBER FUNCTION GET_SDO_GEOM RETURN SDO_GEOMETRY DETERMINISTIC, … ) 可见，Oracle Spatial的ST_GEOMETRY事实上还是通过对SDO_GEOMETRY的包装实现的。因此，我们可以通过最简单的构造函数来构造一个ST_GEOMETRY对象： ST_GEOMETRY(geom SDO_GEOMETRY); 或者，也可以使用具体的ST_GEOMETRY类型来构造，比如用ST_POINT来构造一个点，你会发现内部Oracle Spatial还是根&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4918414662594466031?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4918414662594466031/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4918414662594466031' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4918414662594466031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4918414662594466031'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/04/arcsde-vs-oracle-spatial-5.html' title='ArcSDE vs. Oracle Spatial 5'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-7281214961383976639</id><published>2010-04-20T10:59:00.000+08:00</published><updated>2010-06-30T00:29:16.878+08:00</updated><title type='text'>ArcSDE vs. oracle Spatial 4</title><content type='html'>导入数据到Oracle Spatial Oracle Spatial并没有像ArcGIS那样有一套从桌面到数据库到服务器到开发包的全方位GIS产品体系，因此向Oracle中加载数据相比用ArcGIS要麻烦得多，同时也没有那么多的数据源格式的支持。Oracle本身则提供了一个工具shp2sdo[1]，可以帮助你导入Shapefile到Oracle Spatial中，这个工具的使用分三个步骤： 第一步，使用shp2sde工具生成脚本和数据： [oracle@test2 shp2sdo_linux]$ ./shp2sdo.exe shp2sdo - Shapefile(r) To Oracle Spatial Converter Version 2.15 21-May-2004 Copyright 1997,2004 Oracle Corporation For use with Oracle Spatial. Input shapefile (no extension): /home/wuyf/world/cities Shape file /home/wuyf/world/cities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-7281214961383976639?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/7281214961383976639/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=7281214961383976639' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7281214961383976639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7281214961383976639'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/04/arcsde-vs-oracle-spatial-4.html' title='ArcSDE vs. oracle Spatial 4'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5001052442085797239</id><published>2010-04-19T14:12:00.000+08:00</published><updated>2010-06-30T00:29:14.472+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 3</title><content type='html'>1. 常见几何对象的构造 对于SDO_GEOMETRY这种定义晦涩的类型，最好是搞几个例子来对照一下，好在《Oracle Spatial Developer’s Guide》里提供了几个简单的Example，还配上了很好看的插图，在这里一并引用一下：      矩形  SDO_GEOMETRY( 2003,-- 面，表 1 4326, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),-- 矩形，表 2 SDO_ORDINATE_ARRAY(1,1, 5,7) -- 左下角和右上角 )    有洞的多边形  SDO_GEOMETRY( 2003,-- 面，表 1 4326, NULL, SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- 从1开始多边形，从19开始多边形，表 2 SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4,--外多边形，逆时针 7,5, 7,10, 10,10, 10,5, 7,5)-- 内多边形，顺时针 )    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5001052442085797239?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5001052442085797239/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5001052442085797239' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5001052442085797239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5001052442085797239'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/04/arcsde-vs-oracle-spatial-3.html' title='ArcSDE vs. Oracle Spatial 3'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-2751777743118815269</id><published>2010-04-16T14:06:00.000+08:00</published><updated>2010-06-30T00:29:13.982+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 2</title><content type='html'>I. 几何对象 · Oracle Spatial 1. SDO_GEOMETRY Oracle Spatial在MDSYS模式下定义了一系列几何类型、函数来支持空间数据的存储和使用，最为人耳熟能详的就是SDO_GEOMETRY这种类型——当然，ArcSDE也可以使用这种类型进行存储。让我们首先来看一下SDO_GEOMETRY的定义： CREATE OR REPLACE  TYPE SDO_GEOMETRY AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_POINT SDO_POINT_TYPE, SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY, SDO_ORDINATES SDO_ORDINATE_ARRAY, MEMBER FUNCTION GET_GTYPE RETURN NUMBER DETERMINISTIC, MEMBER FUNCTION GET_DIMS RETURN NUMBER DETERMINISTIC, MEMBER FUNCTION GET_LRS_DIM RETURN NUMBER DE&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-2751777743118815269?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/2751777743118815269/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=2751777743118815269' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2751777743118815269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2751777743118815269'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/04/arcsde-vs-oracle-spatial-2.html' title='ArcSDE vs. Oracle Spatial 2'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8752832037115011952</id><published>2010-04-15T16:31:00.000+08:00</published><updated>2010-06-30T00:29:10.006+08:00</updated><title type='text'>ArcSDE vs. Oracle Spatial 1</title><content type='html'>Oracle Spatial的出现让很多人产生这样一个想法：“Oracle对自己的数据库产品肯定是最熟悉的，Oracle Spatial的性能也肯定是最好的，相比之下ArcSDE for Oracle这个后娘养的哪天还是踹掉算了”。这话听起来有一点糙，不过好像也挺在理。就在此摇摆不定之际，一旁的微软泪流满面：“作为对Windows最熟悉的厂商我要说一句，为什么还有人用Windows竟然都不选择SQL Server而非要用天杀的Oracle！” ——打住，以上情节纯属虚构，如有雷同，纯属巧合。 书归正传，自打Oracle Spatial的出现，从开始的点线面的简单支持到栅格（Raster）、拓扑（Topology）、网络（Network）的支持；从纯粹数据库的功能到OGC Web服务的支持都能看出Oracle对Spatial模块的进取心。然而，SDO_GEOMETRY这种有点晦涩的存储方式及其空间操作方法的风格也可以看出Oracle——或许也就是它的CEO埃里森的一贯作风——强势、特立独行。 当然，不管是Oracle亲生的还是ESRI后娘养的，名分都是浮云，能更好地支持我们的GIS应用才&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8752832037115011952?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8752832037115011952/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8752832037115011952' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8752832037115011952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8752832037115011952'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2010/04/arcsde-vs-oracle-spatial-1.html' title='ArcSDE vs. Oracle Spatial 1'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4714430506491651960</id><published>2009-11-02T16:45:00.000+08:00</published><updated>2010-06-30T00:28:52.681+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 v9.3.1 PDF 版本</title><content type='html'>地址：http://docs.google.com/fileview?id=0B8EMyhKZm53ZNmE3OTUzZjItODljNi00NDM3LWI2MGQtZTE1ZWNjMWRlMGY4&amp;hl=zh_CN  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4714430506491651960?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4714430506491651960/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4714430506491651960' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4714430506491651960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4714430506491651960'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/11/arcgis-server-java-adf-v931-pdf.html' title='ArcGIS Server Java ADF 案例教程 v9.3.1 PDF 版本'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-1857593053277807581</id><published>2009-10-18T22:26:00.000+08:00</published><updated>2010-06-30T00:29:27.383+08:00</updated><title type='text'>GIServer 介绍</title><content type='html'>GIServer起源于我在一个多月前，想重新捡起GeoServer做点东西。当时发现GeoServer的Style在使用上有点小问题；在通过bug tracker和GeoServer的开发人员沟通后，他们告诉我它本就是这样的——这让我不太能理解。同时，长久以来我都觉得GeoServer对OGC的那几个规范有着相当程度的痴迷——在某种程度上说，是对Web Service的崇拜。虽然我无意参与Web Service与REST的圣战，但是我也看到国内的一些GeoServer的使用者有时会问到这样一个问题：怎么使用ArcGIS Flex API调用GeoServer发布的服务？GeoServer只能告诉你，来用OpenLayers吧，我们才是黄金搭档。 因此，我开始实现一个类ArcGIS Server的GIS Server，并且首先针对REST接口进行实现，为的就是所有熟悉ArcGIS的JS/Flex/Silverlight API的人可以很容易上手来使用它。通过1个试验版本和3个alpha版本，目前map service和geometry service的功能都已经实现，你完全可以把它当成A&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-1857593053277807581?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/1857593053277807581/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=1857593053277807581' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1857593053277807581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1857593053277807581'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/10/giserver.html' title='GIServer 介绍'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-6869571841325767621</id><published>2009-09-09T10:02:00.000+08:00</published><updated>2010-06-30T00:28:49.652+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 43</title><content type='html'>一 Server Object Extensions Server Object Extensions（以下简称SOE）是Server Object的扩展，比如MapServer、GPServer等等。和Utility Objects不同，SOE只在Server Object被创建的时候被初始化，它的生命周期和Server Object是相同的。相比Utility Objects，SOE有以下的一些特点： Ø 开发人员不需要手动实例化SOE，SOE是在Server Object被创建的同时被实例化的 Ø ArcGIS Server的管理程序可以显示SOE的参数配置 Ø SOE的运行信息将被记录到ArcGIS Server的日志中去 Ø SOE的功能可以通过SOAP访问 更直观一点，让我们看一下下面这张截图，这是一个添加了一个自定义SOE的Map Service管理界面：   图 30 添加了SOE的Map Service 是不是可以把SOE理解成一个服务的自定义Capability？似乎ESRI就是这样理解的。那下面我们就通过自定义一个新的Capability来看看SOE的用法。 二 &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-6869571841325767621?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/6869571841325767621/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=6869571841325767621' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6869571841325767621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6869571841325767621'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/09/arcgis-server-java-adf-43.html' title='ArcGIS Server Java ADF 案例教程 43'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-2378570746251482295</id><published>2009-09-04T14:30:00.000+08:00</published><updated>2010-06-30T00:28:48.051+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 42</title><content type='html'>二 使用Utility Objects提高查询性能【案例】 这是我的同事使用Utility Objects解决某个用户的一个实际问题。这个用户通过调用AO进行空间查询，然后在此基础上进行分页，分页的时候遍历该页所有的IFeature，提取属性信息，构造成自己的结果返回——结果，遇到了严重的性能问题，在上万条记录中查询一般两三分钟才可以出结果，这在一个国家级项目中是难以忍受的。 经过添加日志分析，发现AO查询的速度非常快，问题就是出在遍历IFeature这个操作上，是不停地进行跨进程调用产生的。就在这个时候9.3.1正式发布了，Utility Objects有如救星般地降临了！ 由于在上一小节关于怎么定义Utility Object已经讲得比较清楚，这里就不在啰嗦怎么封装接口和实现类了。下面是封装起来的功能代码，主要就是遍历分页要素并提取有用的信息，当然，原先这部分代码是在Web层执行的。 IFeature feature = featureCursor.nextFeature(); int featureCount = 0; while (feature != null) { if (&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-2378570746251482295?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/2378570746251482295/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=2378570746251482295' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2378570746251482295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2378570746251482295'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/09/arcgis-server-java-adf-42.html' title='ArcGIS Server Java ADF 案例教程 42'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-30124748221225314</id><published>2009-09-04T14:28:00.000+08:00</published><updated>2010-06-30T00:28:47.001+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 41</title><content type='html'>第一章 扩展ArcGIS Server 这一章其实和ADF已经没有太大关系了，在ArcGIS的帮助里也是在ArcGIS Server开发章节里。考虑到使用ADF开发的一般对功能要求比较多一点，所以对于怎么扩展ArcGIS Server可能比较关心，反正ADF差不多也讲完了，这一章就算是一个结束吧。 从9.3.1开始，ArcGIS Server提供了Java开发者更多的可扩展性。通过扩展ArcGIS Server可以使某些自定义的功能更加完善和强大、使你的某些工作可以更加模块化并和ArcGIS Server很好地结合在一起。下面让我们来看看ArcGIS Server可以通过什么样的途径进行扩展。 一 Utility Objects Utility Objects主要是为了提升ArcGIS Server在Local方式连接下某些操作的性能而准备的。在此之前，让我们首先去了解一些ADF调用服务器端AO对象的过程和特点。   图 29 ADF调用服务器端对象的过程 如图 29所示，当用户发生请求的时候，ADF首先会和SOM交互（图中1）；SOM将根据服务器情况分配一个SO用以处理这个用户的请求&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-30124748221225314?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/30124748221225314/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=30124748221225314' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/30124748221225314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/30124748221225314'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/09/arcgis-server-java-adf-41.html' title='ArcGIS Server Java ADF 案例教程 41'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-3779049155422308770</id><published>2009-09-02T17:33:00.000+08:00</published><updated>2010-06-30T00:28:46.538+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 40</title><content type='html'>二 两种方式自定义Web Service 在IDE里创建一个Web Service工程是很容易的，只要找到【File】-【New】-【Web Service】菜单就可以了，点击这个菜单将会弹出下面的对话框：   这里的Web service type有两种选择：一种是Bottom up、另外一种是Top down。这两种方式分别对应了自下而上和自上而下两种新建Web Service的模式。如果你已经有了实现的功能类，现在想要把它封装成Web Service，那么你应当选择Bottom up模式；如果你首先定义了Web Service的描述文件（wsdl），现在想要实现这个wsdl的功能，那么你应当选择Top down模式。 三 实现Web Service的功能 不管通过Bottom up还是Top down方式，当你把Web Service的框架搭起来以后，剩下的工作就是如何去实现Web Service的功能了。下面让我们通过讲解一个网络分析Web Service的实现，来了解自定义Web Service的运作。 这个网络分析的Web Service需要的功能是预先定义好的，其中有比如&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-3779049155422308770?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/3779049155422308770/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=3779049155422308770' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3779049155422308770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3779049155422308770'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/09/arcgis-server-java-adf-40.html' title='ArcGIS Server Java ADF 案例教程 40'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-7228609703171955803</id><published>2009-09-02T17:31:00.000+08:00</published><updated>2010-06-30T00:28:44.934+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 39</title><content type='html'>第一章 有关Web Service 在IDE的菜单中，你会看到有个很长的【ArcGIS Web Services Project】，别高兴，这不是给你自定义Web Service的，运行完向导你会发现生成的是一个Java桌面程序——有着一如既往丑陋的界面和很不友好的GIS功能。原来我一直当它是废物，不过前段时间它还真的帮了我大忙。我们有个测试需要测ArcGIS Server对Web Service的支持，要求必须抓取到浏览器与服务器交互的可读的SOAP消息；但是你要知道，考虑到效率ArcGIS Server内部都是用二进制的SOAP进行交互；要抓到可读的SOAP消息，ArcGIS的Web Service包必须被部署到浏览器端——最后，就是靠这个丑陋的“ArcGIS Web Services Project”，做了很多修改封装成了Applet才达到了这个要求。 扯远了，说了这么多其实只为了说明这样一点：“ArcGIS Web Services Project”是一个使用ArcGIS的Web Service类库实现一些GIS功能的Java桌面程序，演示意义大于应用意义。下面我们首先来讨论一&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-7228609703171955803?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/7228609703171955803/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=7228609703171955803' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7228609703171955803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7228609703171955803'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/09/arcgis-server-java-adf-39.html' title='ArcGIS Server Java ADF 案例教程 39'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4366861078510686415</id><published>2009-09-01T08:58:00.000+08:00</published><updated>2010-06-30T00:28:43.454+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 38</title><content type='html'>三 调用AO实现缓冲功能【案例】 在这个小节中，让我们通过调用AO实现一个缓冲区分析的功能。 首先，我们需要配置一个地图服务资源，还是用前面使用过的世界地图服务吧，但是这次采用的是Local方式去连接，你可以直接在打开的JSP页面上右键选择【ArcGIS】-【Configure Map Service…】菜单打开服务配置窗口：  图 27 使用IDE插件配置 Local方式连接的服务 下面我们在一个Tool中通过这个AGSLocalMapResource来调用AO： public class BufferPointToolAction implements MapToolAction { public void execute(MapEvent event) throws Exception { WebContext webContext = event.getWebContext(); AGSLocalMapResource agsLocalMapResource = (AGSLocalMapResource)webContext.getResourceById("ags1"); I&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4366861078510686415?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4366861078510686415/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4366861078510686415' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4366861078510686415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4366861078510686415'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/09/arcgis-server-java-adf-38.html' title='ArcGIS Server Java ADF 案例教程 38'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-327356111626272848</id><published>2009-08-31T16:32:00.000+08:00</published><updated>2010-06-30T00:28:42.900+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 36</title><content type='html'>调用ArcObjects 到这里我们对ADF已经讲了不少内容了，让我们先稍微回忆一下。我们从ADF的结构入手，首先介绍了Tool、Command和服务器的交互、在此基础上介绍了可以帮助实现复杂业务逻辑的Task；然后，进行了更细节的功能讲解，比如怎么进行查询、怎么显示动态结果、怎么不通过ADF组件来发送AJAX请求并获得响应、怎么自定义Functionality封装功能等内容。 前面这些内容仅仅围绕着ADF封装的GIS功能，或许你会开始怀念AO强大的功能，所以这一章就让我们来了解一下怎样可以用AO来进行更加底层的GIS功能实现。 &amp;nbsp; 一 Internet和Local方式连接服务的区别 首先让我们去了解一下在ADF应用中，连接服务的两种方式：Internet和Local的区别。 Internet方式通过一个URL来连接服务，它通过HTTP协议去访问ArcGIS Server的Web Service，这些Web Service会通过DCOM访问Server Object从而实现GIS的功能，这些都是ArcGIS Server封装好的，在使用的时候只需要知道服务的URL就可以了。由于这种方式&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-327356111626272848?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/327356111626272848/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=327356111626272848' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/327356111626272848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/327356111626272848'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/08/arcgis-server-java-adf-36.html' title='ArcGIS Server Java ADF 案例教程 36'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8572530684335749710</id><published>2009-08-05T11:18:00.000+08:00</published><updated>2010-06-30T00:28:53.721+08:00</updated><title type='text'>ArcGIS Server 提升性能的主要要点</title><content type='html'>地图文档： 1.使用ESRI免费提供的mxdperfstat工具进行检查2.对简单应用使用msd3.不要使用动态投影 服务配置： 1.地图服务一般每个CPU核配2-4个实例2.GP服务一般每个CPU核配1个实例 地图切片输出格式： 1.主要由矢量数据构成的地图使用png2.主要由栅格数据构成的地图使用jpg ArcSDE： 1.栅格数据建议使用jpg而不是LZ772.数据不要注册版本 测试： 1.确保在测试前有个热身阶段2.缓慢增加用户压力  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8572530684335749710?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8572530684335749710/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8572530684335749710' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8572530684335749710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8572530684335749710'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/08/arcgis-server.html' title='ArcGIS Server 提升性能的主要要点'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8902404002736955320</id><published>2009-07-09T15:22:00.000+08:00</published><updated>2010-06-30T00:29:42.955+08:00</updated><title type='text'>为ArcGIS Server配置反向代理</title><content type='html'>一般来说，ArcGIS Server会位于Web服务器之后的本地网络，在生产环境中，这个网络一般是保密的、位于防火墙之后的，这也是ArcGIS Server不建议在本地网络中启用防火墙的原因之一。但是，出于心理上的慰藉或者稀奇古怪（抑或有不得已的成分）的部署方式，不启用防火墙（或者启用了防火墙但是要开放诸如8399等端口）有时让人无法接受；或者，还有ArcGIS Server还被部署在不同的网段中等各种情况——这种时候，反向代理就需要登场了。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;比如ArcGIS Server的访问方式是http://:8399/arcgis/services/...，在配置反向代理后，你应该就可以通过http:///arcgis/services/...来访问ArcGIS的服务了。同时，在配置代理的PROXY_HOST主机上，你可以只开放80端口；而所有的ArcGIS_HOST主机都位于代理主机之后，Web服务器只通过代理主机去使用ArcGIS服务，用户没有任何机会去直接访问ArcGIS Server。好，现在你想怎么部署ArcGIS Server就可以怎么部署了，只需要告诉代理主机你的ArcG&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8902404002736955320?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8902404002736955320/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8902404002736955320' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8902404002736955320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8902404002736955320'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/07/arcgis-server.html' title='为ArcGIS Server配置反向代理'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-6521697421639912967</id><published>2009-06-24T01:21:00.000+08:00</published><updated>2010-06-30T00:27:52.931+08:00</updated><title type='text'>ArcGIS RIA 开发实践 PDF版本下载</title><content type='html'>鉴于直接贴出来的文档看不到图片，格式也比较混乱，在此提供一个PDF的下载： ArcGIS RIA 开发实践 PDF下载  另外一个下载地址&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-6521697421639912967?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/6521697421639912967/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=6521697421639912967' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6521697421639912967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6521697421639912967'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/arcgis-ria-pdf.html' title='ArcGIS RIA 开发实践 PDF版本下载'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-6261558863137155531</id><published>2009-06-24T01:07:00.000+08:00</published><updated>2010-06-30T00:27:58.019+08:00</updated><title type='text'>ArcGIS RIA开发实践 3</title><content type='html'>I、 ArcGIS Flex API 高级 一 控制Map与Layer 1 Map中地图服务图层的控制 Map中图层的控制是很多人首先关心的问题，因为根据业务来切换图层的状态是经常遇到的一种需求。 首先让我们看一下对图层可见性的控制，Layer本身就有一个visible属性，这个属性指示的就是当前图层是否在Map中显示。不管是MapServiceLayer还是GraphicLayer，如果设置了visible为false，那么在这个图层是不会被显示的。 除了控制图层是否显示，我们还可以控制图层的透明度，这是由Layer的alpha属性来控制的。这样我们可以将多个图层叠加复合显示，这时候会给用户一种复合的多信息量的地图： 图 22 多图层透明复合效果 另外，图层的叠放顺序也是一个经常遇到的问题，在ArcGIS Flex API中，后加入的地图被放置在最上层，同时，最底层的索引（index）为0。 图 23 Map中Layer的存放顺序 Map中有一个layers属性存放了地图中所有Layer的集合，另外还有layerIds属性存放了对应的所有Layer的id的集合，每当添加一个Layer&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-6261558863137155531?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/6261558863137155531/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=6261558863137155531' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6261558863137155531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6261558863137155531'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/arcgis-ria-3.html' title='ArcGIS RIA开发实践 3'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8035773060212799907</id><published>2009-06-24T01:05:00.000+08:00</published><updated>2010-06-30T00:27:57.568+08:00</updated><title type='text'>ArcGIS RIA开发实践 2</title><content type='html'>ArcGIS RIA开发实践【Flex篇】 I、 ArcGIS Flex API 基础 一 Flex的历史和现状 Flex的前身是Flash，Flash是极为流行的互联网矢量动画解决方案，目前据统计97%的浏览器都安装有Flash Player插件用以播放swf动画，其中未安装的3%还有很多是因为某些场合的安全限制导致的，可以说Flash是极为普及的RIA平台。 但是由于Flash是一个动画制作软件，其中有很多比如时间轴、影片剪辑等程序员不容易理解的概念，因此Macromedia公司推出了Flex。Flex抛弃了许多动画设计术语，转而使用程序员喜欢的方式开发RIA应用，并且Flex能编译生成可以在Flash Player中运行的swf文件，这无疑吸引了大量程序员，并且实现了和Flash平台的无缝拼接，从而利用Flash平台多年积累的大量素材、美工和设计者。 Adobe公司在2005年收购了Macromedia公司，并在第一时间将Flex/Flash冠以Adobe的商标推向市场，可见其对RIA市场和Flex/Flash的重视。 目前，可以说Adobe Flex/Flash是最流行且最成熟&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8035773060212799907?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8035773060212799907/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8035773060212799907' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8035773060212799907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8035773060212799907'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/arcgis-ria-2.html' title='ArcGIS RIA开发实践 2'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8111571478566657149</id><published>2009-06-24T01:04:00.000+08:00</published><updated>2010-06-30T00:27:56.051+08:00</updated><title type='text'>ArcGIS RIA开发实践 1</title><content type='html'>ArcGIS RIA开发实践【背景篇】 I RIA介绍 一 RIA相比传统Web应用的优势 RIA作为一个互联网领域越来越火的术语，究其根本在于它相对传统Web应用的诸多优势。RIA作为“富互联网应用”的代名词（Rich Internet Application），从名字上就已经可以看出它最大的特点：Rich，这个Rich是多方面的，包括丰富的表现力、富有交互、内容丰富、基于富客户端引擎等等。同时，RIA是Internet的，它在功能上希望和传统的Web应用一样通用、标准，因此，这也是为什么眼下很多2D/3D效果俱佳、操作人性化的网络游戏不能称为RIA的原因。 传统Web应用的很多不足都来源于HTML的静态性，虽然由于JavaScript脚本的存在可以在浏览器中实现一些客户端交互和效果；同时，Web2.0浪潮推广的AJAX技术也使浏览器和服务器的通讯更及时、页面表现也更友好。但是，传统Web的根基使这些进步都是局限的，在声音、视频、Socket通讯、本地存储这些方面它都捉襟见肘。 RIA则在某种程度上颠覆了传统Web应用的理念和设计。为了能提供客户端更优秀的表现和交互能力，RIA一般会&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8111571478566657149?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8111571478566657149/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8111571478566657149' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8111571478566657149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8111571478566657149'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/arcgis-ria-1.html' title='ArcGIS RIA开发实践 1'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-1513359895241898048</id><published>2009-06-24T00:55:00.000+08:00</published><updated>2010-06-30T00:28:41.918+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 35</title><content type='html'>二&amp;nbsp;&amp;nbsp;&amp;nbsp; 自定义一个地图放大5倍的Functionality【案例】在这个小节，我们去实现一个GISFunctionality去封装前面实现过的使地图放大5倍的功能。首先，当然是新建一个Functionality类并添加到ADF应用中去。前面我们经常通过直接编辑代码的方式去定义类和配置文件，这主要是为了帮助你理解ADF应用的配置和各个元素的相互关系。现在估计你也有一定了解了，我们也就尽量省事些，多使用ArcGIS的eclipse插件去完成这些工作吧。让我们打开eclipse的菜单【ArcGIS】-【Class Templates】-【Functionality】，在新建的窗口上填上我们希望实现的Functionality的包名、类名、实例化 Managed Bean的名称、注册到的Resource等，完成以后ADF会自动新建一个实现GISFunctionality接口的类，并把这个类实例化后注册到 ADF应用的配置文件中去。  图 26&amp;nbsp;&amp;nbsp;&amp;nbsp; 通过ArcGIS的IDE插件添加自定义Functionality 下面我们需要对新生成的这个Functionality类进行编码以实现自己的功能&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-1513359895241898048?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/1513359895241898048/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=1513359895241898048' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1513359895241898048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1513359895241898048'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/arcgis-server-java-adf-35.html' title='ArcGIS Server Java ADF 案例教程 35'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-9002653809602525469</id><published>2009-06-24T00:54:00.001+08:00</published><updated>2010-06-30T00:28:40.383+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 33</title><content type='html'>自定义AJAX请求获得地图范围【案例】比如你现在想随时知道当前地图的边界范围，也就是说每次地图范围更新后，希望服务器可以输出一个包含边界范围的AJAX响应到浏览器，那么首先你需要在用户对地图进行操作的时候发送一个AJAX请求。这个请求你可以在每次地图被更新的时候去调用，比如一开始就通过addUpdateListener给 Map添加一个监听：function onBodyLoad(){&amp;nbsp;&amp;nbsp;&amp;nbsp; map = EsriControls.maps['map'];&amp;nbsp;&amp;nbsp;&amp;nbsp; map.addUpdateListener("onMapUpdate", onMapUpdate);}function onMapUpdate(){&amp;nbsp;&amp;nbsp;&amp;nbsp; var formId = map.formId;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url = EsriUtils.getServerUrl(formId);&amp;nbsp;&amp;nbsp;&amp;nbsp; var params = "getMapInfo=true&amp;" + EsriUtils.buildRequestParams(formId);&amp;nbsp;&amp;nbsp;&amp;nbsp; EsriUtils.sendAjaxRequest(url, params, tr&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-9002653809602525469?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/9002653809602525469/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=9002653809602525469' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/9002653809602525469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/9002653809602525469'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/arcgis-server-java-adf-33.html' title='ArcGIS Server Java ADF 案例教程 33'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4240703574713024523</id><published>2009-06-24T00:54:00.000+08:00</published><updated>2010-06-30T00:28:39.798+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 32</title><content type='html'>监听AJAX请求并响应当从页面使用JavaScript发送了一个AJAX请求到服务器，服务器就需要对这个请求进行处理，因此这一小节的内容主要就是在服务器端。首先，让我们来了解一些JSF的内容——有关PhaseListener 。所谓的Phase就是JSF请求的阶段，一个JSF请求的生命周期中存在不同的阶段，当用户从页面向服务器发送一个请求的时候，JSF请求的生命周期就开始了。以下就是著名的JSF请求生命周期中6个阶段：  图 23&amp;nbsp;&amp;nbsp; JSF请求的生命周期 PhaseListener是对JSF请求的阶段进行监听的接口，当某个类实现了这个接口并添加到JSF应用中以后，每当服务器接收到JSF请求，并处理这个请求到某个阶段的时候，这个监听类就会被触发。下面是实现的一个监听自定义AJAX请求的监听类：public class MapUpdatePhaseListener implements PhaseListener{&amp;nbsp;&amp;nbsp;&amp;nbsp; public void afterPhase(PhaseEvent event)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FacesContext facesContext = eve&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4240703574713024523?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4240703574713024523/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4240703574713024523' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4240703574713024523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4240703574713024523'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/arcgis-server-java-adf-32.html' title='ArcGIS Server Java ADF 案例教程 32'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-7184882118916222666</id><published>2009-06-24T00:53:00.000+08:00</published><updated>2010-06-30T00:28:37.798+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 31</title><content type='html'>自定义的请求和响应 前面用户的请求都是通过Task、Toolbar来执行的，在这一章里，我们将不使用这些ADF组件，来看看没有了它们的帮助，你应该怎么自己发送AJAX请求，或者在原先输出的AJAX响应中添加上一些额外的信息。 一 发送AJAX请求 首先让我们看一下怎么不依靠任何ADF组件的帮助来发送一个AJAX请求，比如，在页面上有一个纯HTML的表单按钮，我们希望点击这个按钮的时候可以发送一个AJAX请求到服务器，应该怎么做？ 那就让我们假设这样一个场景：用户点击一个HTML的“放大5倍”按钮，地图就可以放大5倍。要实现这样的功能，当然首先是需要添加一个按钮，这个按钮的onclick事件对应到一个JavaScript函数：  function mapZoom() { var formId = map.formId; var url = EsriUtils.getServerUrl(formId); var params = "mapZoom=true&amp;" + EsriUtils.buildRequestParams(formId); EsriUtils.sendAjaxRequest&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-7184882118916222666?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/7184882118916222666/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=7184882118916222666' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7184882118916222666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7184882118916222666'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/arcgis-server-java-adf-31.html' title='ArcGIS Server Java ADF 案例教程 31'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4324712074552457807</id><published>2009-06-24T00:52:00.001+08:00</published><updated>2010-06-30T00:28:34.711+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 28</title><content type='html'>在上一小节最后说马上要讲Graphic，为了和ADF本身的称呼统一，现在这里我们将其称为GraphicElement。由于Blogger被河蟹了，以前的文章我就先不修改了，下面我们来谈一下GraphicElement。 GraphicElement 要说GraphicElement就得先说WebGraphics，欲用GraphicElement，必先添加WebGraphics，在你的配置文件中你应该可以找到如下的定义：  graphics com.esri.adf.web.data.WebGraphics none  这个WebGraphics对象的作用就是在服务器端存放所有你需要动态表示的GraphicElement。当然，现在我们已经很熟悉应该怎么去调用WebGraphics对象了：首先肯定要得到WebContext对象，然后在它的attribute中找到WebGraphics对象。 在WebGraphics对象中添加GraphicElement以后，这些GraphicElement就可以自动在Map中渲染出来，它们和后台服务没有关系，WebGraphics中的对象会在后台服务的上&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4324712074552457807?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4324712074552457807/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4324712074552457807' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4324712074552457807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4324712074552457807'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/arcgis-server-java-adf-28.html' title='ArcGIS Server Java ADF 案例教程 28'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-912554306860532695</id><published>2009-06-24T00:52:00.000+08:00</published><updated>2010-06-30T00:28:33.263+08:00</updated><title type='text'>ArcGIS Server Java ADF 案例教程 29</title><content type='html'>GraphicElement的符号化GraphicElement的symbol属性是一个WebSymbol 对象，这个对象定义了使用什么符号来表示GraphicElement对象。下面让我们大概看一下有些什么WebSymbol可以为我使用： WebSimpleMarkerSymbol 简单点符号WebSimpleLineSymbol 简单线符号WebSimplePolygonSymbol 简单多边形符号WebPictureMarkerSymbol 图片点符号WebTrueTypeMarkerSymbol TrueType点符号 比如一个简单点符号可以这样定义：WebSimpleMarkerSymbol symbol = new WebSimpleMarkerSymbol();symbol.setMarkerType(WebSimpleMarkerSymbol.STAR);symbol.setAntialiasing(true);symbol.setTransparency(0.7);symbol.setColor("255,255,0");symbol.setOutlineColor(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-912554306860532695?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/912554306860532695/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=912554306860532695' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/912554306860532695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/912554306860532695'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/arcgis-server-java-adf-29.html' title='ArcGIS Server Java ADF 案例教程 29'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8451741655018930099</id><published>2009-06-24T00:39:00.000+08:00</published><updated>2010-06-30T00:30:05.705+08:00</updated><title type='text'>在Google blogger的日志备份5</title><content type='html'>02/11/2009 03:59 PM  ArcGIS Flex API 的动态投影 以前没关注过这个问题，经过同事提点REST API中有指定投影的请求参数，猜想Flex中也可以。方法如下：url="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer"/&gt;url="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Petroleum/KGS_OilGasFields_Kansas/MapServer"/&gt;也就是在加载图层的时候，指定Map的Extent（这个Extent通过wkid来指定其空间参考），得出的图则是该空间参考下服务器动态投影生成的图片。下面两图分别是wkid=26777和wkid=4326下同一地图服务的不同表现： 02/04/2009 05:08 PM  免费的矢量导航数据 做GIS很重要的就是数据，事实上这个玩意也很值钱。有时候你想做个演示或者要节省项目成本&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8451741655018930099?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8451741655018930099/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8451741655018930099' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8451741655018930099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8451741655018930099'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/google-blogger5.html' title='在Google blogger的日志备份5'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4322609602968790695</id><published>2009-06-24T00:38:00.000+08:00</published><updated>2010-06-30T00:30:04.958+08:00</updated><title type='text'>在Google blogger的日志备份4</title><content type='html'>12/11/2008 10:04 AM  使用 FlashDevelop 开发 ArcGIS Flex 应用 【环境】Windows XP SP3，FlashDevelop 3.0.0 Beta9，Flex SDK 3.2，ArcGIS Flex API 1.0如果你对基于Eclipse的Flex Builder的编译和操作不甚满意，常常为它的无端崩溃而心怀不满，更或者，你不倾向于使用收费的Flex Builder（标准版300多美刀），那么，或许你可以尝试一下这个主题的主角——一款开源的Flex IDE：FlashDevelop。FlashDevelop使用MIT许可分发，拥有和Visual Studio风格类似的界面和操作，还拥有插件机制来扩展功能——总而言之，它可以成为FlexBuilder之外开发Flex应用的又一选择。我们可以从 http://www.flashdevelop.org 获取FlashDevelop的安装文件和文档。当你安装Flex Builder的时候，或许你不用操心任何其它组件，包括Flex SDK和Flash Player Debug版本等等都内置在其中。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4322609602968790695?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4322609602968790695/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4322609602968790695' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4322609602968790695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4322609602968790695'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/google-blogger4.html' title='在Google blogger的日志备份4'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-2973806810707768231</id><published>2009-06-24T00:36:00.000+08:00</published><updated>2010-06-30T00:30:04.062+08:00</updated><title type='text'>在Google blogger的日志备份3</title><content type='html'>10/12/2008 09:46 PM  Open API 其实大家都希望开放自己的API以后，吸引开发人员在自己的平台上做点事情。吹得美妙无比，内心都险恶得要死巴不得天底下别的API都死绝了，大家都用我的吧。Open API是一个比云更ws的概念，它的口号就是：我的是我的，你的还是我的。小子，我这里有全套工具，来给我打工吧！好，你就瞎忙活去吧。你要用它的API在它那里实现了什么功能，恭喜你，你已经正式成为了它的免费兼职实习生；你要用它的API在你自己那里使用了什么功能，给它打了广告不说，啥时候你的流量大了，对不起，从今天开始限制访问量，非付费用户每天限制IP500个，不够？交钱啊。这叫什么，消费陷阱啊。所以啊，云啊雾啊开放啥的都是虚的，数据才是根本。有了数据你才有发言权，你才有资本去做云啊雾的，然后对大家招招手说：hey come on，给你露几个接口，用去吧。ok，到时候你也会说：Open API好，云实在是好。  09/18/2008 09:08 AM  Android开发简明教程-1.简介 【关于本教程】Android的API文档和APIDemo做的是很不错的,但是Tutori&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-2973806810707768231?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/2973806810707768231/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=2973806810707768231' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2973806810707768231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2973806810707768231'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/google-blogger3.html' title='在Google blogger的日志备份3'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-3715461917439620868</id><published>2009-06-23T23:55:00.000+08:00</published><updated>2010-06-30T00:29:59.306+08:00</updated><title type='text'>在Google blogger的日志备份1</title><content type='html'>08/01/2008 09:22 AM  配置ArcGIS Server 9.3 Java开发环境（NetBeans） 【概述】叙述如何在Window下配置ArcGIS Server 9.3的Java开发环境（NetBeans） 【环境】Windows XP SP2，ArcGIS Server 9.3，NetBeans 6.1  先决条件 ArcGIS Server的Java开发首先需要安装Java Web服务器， ArcGIS Server 9.3支持的服务器种类有：Apache TomcatIBM WebSphereJBoss 这里采用的是Tomcat 6.0.16。  下载并安装NetBeans ArcGIS Server 9.3支持的NetBeans版本为6.x，可以从NetBeans网站免费下载：http://download.netbeans.org/netbeans/6.1/final， NetBeans下载包的类型建议选择Web&amp;J2EE;（第一列）。  在开始安装NetBeans时，首先会让你选择是否安装随NetBeans附带的应用服务器——GlashFish或Tom&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-3715461917439620868?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/3715461917439620868/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=3715461917439620868' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3715461917439620868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3715461917439620868'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/06/google-blogger1.html' title='在Google blogger的日志备份1'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-2099684314300753553</id><published>2009-05-26T16:54:00.000+08:00</published><updated>2009-05-26T16:59:46.665+08:00</updated><title type='text'>不稳定的Blogger</title><content type='html'>如果2009.6.1之前不恢复的话，我就换个地方吧&lt;br /&gt;&lt;br /&gt;作坊暂定搬到：http://hi.baidu.com/wuyf0330&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-2099684314300753553?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/2099684314300753553/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=2099684314300753553' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2099684314300753553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2099684314300753553'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/05/blogger.html' title='不稳定的Blogger'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-2365164438851880438</id><published>2009-05-14T16:57:00.002+08:00</published><updated>2009-05-14T17:00:39.072+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 27</title><content type='html'>&lt;span style="font-weight: bold;"&gt;四 QueryResult&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;上面几个小节让我们知道了不同的查询功能应该怎么去实现，每个查询中都返回了QueryResult对象的集合。这个小节我们就来详细说说QueryResult对象。&lt;br /&gt;&lt;br /&gt;QueryResult对象是一个查询结果，当然，这是一个服务器端对象，然而在服务器上QueryResult并不仅仅是一个记录，而是一个可以和Map互动，可以高亮显示、移除、缩放到的一个对象。&lt;br /&gt;&lt;br /&gt;比如当我们做完查询以后，想在地图上显示所有的结果要素，那么，调用QueryResult的highlight方法就可以做到：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;webContext.getWebGraphics().clearGraphics();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;for (int i = 0; i &lt;&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        QueryResult queryResult = listQueryResult.get(i);&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;  &lt;br /&gt;    queryResult.highlight();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;webContext.refresh();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;上&lt;span style="font-size:100%;"&gt;面的代码遍历了查询结果中所有的QueryResult对象，调用每个对象的highlight方法使其在地图上高亮显示，让我们看一下执行的结果：&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SgvdSuOFQoI/AAAAAAAACao/zqwwjkFkPoA/s1600-h/2009-5-5+15-41-50.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 198px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SgvdSuOFQoI/AAAAAAAACao/zqwwjkFkPoA/s400/2009-5-5+15-41-50.png" alt="" id="BLOGGER_PHOTO_ID_5335601497264964226" border="0" /&gt;&lt;/a&gt;图 18 高亮查询结果&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;高亮的这些元素事实上是将这些查询结果以Graphic的形式添加到Map中的。ADF的Graphic通常用于表现临时的、动态生成的业务数据，下面一章我们会马上去看Graphic的来龙去脉。&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-2365164438851880438?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/2365164438851880438/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=2365164438851880438' title='6 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2365164438851880438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2365164438851880438'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/05/arcgis-server-java-adf-27.html' title='ArcGIS Server Java ADF 案例教程 27'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__ZvvWze6o0c/SgvdSuOFQoI/AAAAAAAACao/zqwwjkFkPoA/s72-c/2009-5-5+15-41-50.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-1275319370897450955</id><published>2009-05-14T16:56:00.000+08:00</published><updated>2009-05-14T16:57:22.489+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 26</title><content type='html'>&lt;span style="font-weight: bold;"&gt;三 Where条件查询&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;三个实现了QueryCriteria接口的类我们还剩PredefinedQueryCriteria没有介绍，这个类是用于进行where查询的。在进行查询的时候，通常需要设置一个比较复杂的过滤条件，这里就需要PredefinedQueryCriteria。&lt;br /&gt;&lt;br /&gt;下面我们尝试把前面使用TextCriteria查询的方法用PredefinedQueryCriteria来实现：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;WebQuery webQuery = (WebQuery) webContext.getAttribute("query");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;PredefinedQueryCriteria criteria = new PredefinedQueryCriteria();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;criteria.setWhereClause("CITY_NAME like '%"+this.keyWord+"%'");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;List&lt;/span&gt;&lt;/span&gt;&lt;queryresult&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; listQueryResult = webQuery.query(criteria, webQuery.getQueryLayers());&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PredefinedQueryCriteria的用法非常简单，无非是把你想要设置的where条件放到它的whereClause属性中去，这里就不赘述了。&lt;br /&gt;&lt;/queryresult&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-1275319370897450955?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/1275319370897450955/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=1275319370897450955' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1275319370897450955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1275319370897450955'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/05/arcgis-server-java-adf-26.html' title='ArcGIS Server Java ADF 案例教程 26'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5439655277816280570</id><published>2009-05-14T16:54:00.001+08:00</published><updated>2009-05-14T16:56:38.891+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 25</title><content type='html'>&lt;span style="font-weight: bold;"&gt;二 几何对象查询&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在上一章的QueryTask中也有对几何对象的查询，你可以回忆一下那个Task面板中“选择”那个Tool。这个Tool会在Map中绘制一个多边形，然后ADF根据这个多边形查询位于多边形内的所有要素。&lt;br /&gt;&lt;br /&gt;几何对象的查询主要使用IdentifyCriteria对象，下面的代码实现了这样一个根据多边形查询要素的功能：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;WebContext webContext = event.getWebContext();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;WebGeometry webGeometry = (WebPolygon) event.getWebGeometry().toMapGeometry(webContext.getWebMap());&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;WebQuery webQuery = (WebQuery) webContext.getAttribute("query");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;List&lt;/span&gt;&lt;/span&gt;&lt;weblayerinfo&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; layers = webQuery.getQueryLayers();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;List&lt;/span&gt;&lt;/span&gt;&lt;weblayerinfo&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; queryLayers = new ArrayList&lt;/span&gt;&lt;/span&gt;&lt;weblayerinfo&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;for (WebLayerInfo layer : layers)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;if (layer.getName().equals("World Cities"))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;queryLayers.add(layer);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;break;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;IdentifyCriteria identifyCriteria = new IdentifyCriteria();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;identifyCriteria.setWebGeometry(webGeometry);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;List&lt;/span&gt;&lt;/span&gt;&lt;queryresult&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; listQueryResult = webQuery.query(identifyCriteria, queryLayers);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在这个查询过程中，首先从MapEvent事件中获得从客户端传来的WebGeometry对象（这里是用户在客户端的Map中画的多边形），这个对象是基于客户端坐标的，因此需要转化成地图坐标。由于我们只想查“World Cities”这个图层上的要素，因此下面又构造了一个queryLayers，将我们想要查询的图层挑选了出来。在此之后，我们就可以使用IdentifyCriteria对象，将ADF转化成地图坐标的WebGeometry对象作为它的参数，进行查询得到结果。&lt;br /&gt;&lt;/queryresult&gt;&lt;/weblayerinfo&gt;&lt;/weblayerinfo&gt;&lt;/weblayerinfo&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5439655277816280570?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5439655277816280570/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5439655277816280570' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5439655277816280570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5439655277816280570'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/05/arcgis-server-java-adf-25.html' title='ArcGIS Server Java ADF 案例教程 25'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-3610592416563048475</id><published>2009-05-13T21:48:00.002+08:00</published><updated>2009-05-13T21:52:07.640+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Flex中实现行军箭头的效果</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SgrQLOBqrOI/AAAAAAAACag/PeZwYhQvtC8/s1600-h/2009-5-13+21-48-04.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 196px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SgrQLOBqrOI/AAAAAAAACag/PeZwYhQvtC8/s400/2009-5-13+21-48-04.png" alt="" id="BLOGGER_PHOTO_ID_5335305599735999714" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-3610592416563048475?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/3610592416563048475/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=3610592416563048475' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3610592416563048475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3610592416563048475'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/05/flex.html' title='Flex中实现行军箭头的效果'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__ZvvWze6o0c/SgrQLOBqrOI/AAAAAAAACag/PeZwYhQvtC8/s72-c/2009-5-13+21-48-04.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4591200893464687634</id><published>2009-05-08T21:26:00.002+08:00</published><updated>2009-05-08T21:35:28.556+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 24</title><content type='html'>&lt;span style="font-weight: bold;"&gt;第六章 查询及结果&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;对空间信息进行查询是GIS中很基本且很常用的功能，在这一章中，我们主要看在ADF中如何进行查询、查询出结果以后怎样返回客户端。另外，在这里也先预告下，在下一章我们还会讲查询到的这些结果怎样在Map中表现出来。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;一 文本查询&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在上一章QueryTask的query方法中我们已经用到了文本查询的功能，你可以回忆一下，在这个方法中我们根据Task面板中文本框的内容，对图层进行了查询，用到的就是keyWord这个字符串变量。下面我们来详细说一下文本查询的过程。&lt;br /&gt;&lt;br /&gt;在ADF中负责进行文本查询的是WebQuery对象，需要用到查询功能的ADF应用都需要在配置文件中加上了这个对象：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SgQ07pTa4wI/AAAAAAAACaI/If9vOOkB0SE/s1600-h/2009-5-8+21-33-51.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 78px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SgQ07pTa4wI/AAAAAAAACaI/If9vOOkB0SE/s400/2009-5-8+21-33-51.png" alt="" id="BLOGGER_PHOTO_ID_5333446058017743618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;当我们需要使用查询功能的时候，首先第一步就是获得这个WebQuery对象，当然，通常都是先获得WebContext对象，再查找它的attribute来获得WebQuery对象：&lt;br /&gt;WebQuery webQuery = (WebQuery) webContext.getAttribute("query");&lt;br /&gt;&lt;br /&gt;通过这个WebQuery对象我们就可以开始进行查询了，WebQuery最重要的方法就是query方法，让我们先看一下query方法的原型：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SgQ07-N0rWI/AAAAAAAACaQ/SbbzN6KEOkQ/s1600-h/2009-5-8+21-34-07.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 33px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SgQ07-N0rWI/AAAAAAAACaQ/SbbzN6KEOkQ/s400/2009-5-8+21-34-07.png" alt="" id="BLOGGER_PHOTO_ID_5333446063631412578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;这个query方法主要有两个参数：criteria参数表示查询条件，这是一个实现了QueryCriteria 接口的对象，实现这个接口的类有三种：IdentifyCriteria, PredefinedQueryCriteria, TextCriteria，分别对应不同的查询类型，在这里我们将要用到TextCriteria这个类；query方法的另外一个参数queryLayers表示需要进行查询的图层，一个服务中可能有多个图层，这个参数可以限制查询的范围。&lt;br /&gt;&lt;br /&gt;上面说到进行查询需要一个实现了QueryCriteria接口的对象作为查询条件，这里我们需要查询文本，所以需要使用TextCriteria，这是一个专为文本查询设计的类。下面的代码定义了一个TextCriteria对象，通过这个对象定义了一些查询条件和限制，最后通过WebQuery对象的query方法来得到查询结果：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SgQ077ITw_I/AAAAAAAACaY/w71cyDVI4aU/s1600-h/2009-5-8+21-34-20.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 136px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SgQ077ITw_I/AAAAAAAACaY/w71cyDVI4aU/s400/2009-5-8+21-34-20.png" alt="" id="BLOGGER_PHOTO_ID_5333446062802977778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;这是一个很简单的查询，事实上TextCriteria还可以设置很多限制和条件，比如限制查询字段、是否模糊查询、设置返回字段、设置LayerDefinition （包括字段别名、符号渲染方式）等等。最后，查询后会得到一个QueryResult的集合，关于这个QueryResult的特点和用法，我们在后面会有一个小节专门说明。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4591200893464687634?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4591200893464687634/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4591200893464687634' title='4 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4591200893464687634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4591200893464687634'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/05/arcgis-server-java-adf-24.html' title='ArcGIS Server Java ADF 案例教程 24'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__ZvvWze6o0c/SgQ07pTa4wI/AAAAAAAACaI/If9vOOkB0SE/s72-c/2009-5-8+21-33-51.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5411977330518374901</id><published>2009-05-07T17:25:00.005+08:00</published><updated>2009-05-07T21:42:57.191+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>刚做的H1N1猪流感分布图Demo</title><content type='html'>主要是HeatMap的实现，原来网上有人发了一个，不过我去看的时候已经因为没有得奖的原因把源码给撤了……还是自力更生吧。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3654292323829004716-a-1802744773732722657-s-sites.googlegroups.com/site/h1n1demo/Home/H1N1.swf?attredirects=0&amp;auth=ANoY7crKVIqz79iyIFbsnerTqIJBrrFBfKzrKn0e5G93nFlS9Tv_j7MkQ4uTaosk2ILcsK0zgVdJAG9sBEAn3yN_cohcW701qxWqYz5Vi9Aa1ILCB0VlOrvjvdLoOA0fALdfzABUt9Pbm5jNNH9pI9quajvXUaqBsumt-oOTFMbXpvtTk_RvNH1dr6c-KVzkqhbTpwGzok7Z"&gt;点击这里查看在线演示&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;这是大概的效果图：&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SgLlGzy9uxI/AAAAAAAACaA/jcgFAe7WL4s/s1600-h/2009-5-7+21-38-49.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 196px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SgLlGzy9uxI/AAAAAAAACaA/jcgFAe7WL4s/s400/2009-5-7+21-38-49.png" alt="" id="BLOGGER_PHOTO_ID_5333076813906033426" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5411977330518374901?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5411977330518374901/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5411977330518374901' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5411977330518374901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5411977330518374901'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/05/h1n1demo.html' title='刚做的H1N1猪流感分布图Demo'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__ZvvWze6o0c/SgLlGzy9uxI/AAAAAAAACaA/jcgFAe7WL4s/s72-c/2009-5-7+21-38-49.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-6665612804405465315</id><published>2009-05-04T15:54:00.002+08:00</published><updated>2009-05-04T15:57:17.353+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PostgreSQL/PostGIS'/><title type='text'>使用pgRouting进行路径分析</title><content type='html'>pgRouting是一个基于PostgreSQL/PostGIS的项目，目的是提供路径分析的功能，它是PostLBS的一个子项目，这个项目使用GPL许可发布。&lt;br /&gt;&lt;br /&gt;pgRouting的安装很简单，以Windows为例，下载编译包以后解压缩，将lib目录下文件复制到PostgreSQL的lib目录下，再在PostgreSQL数据库中执行share/contrib目录下的sql脚本，这些脚本分别对应不同的功能：“core”对应Dijkstra算法计算最短路径，使用函数为“shortest_path_*”；“dd”对应Driving Distance行驶距离计算，使用函数为“driving_distance”；“tps”对应采用遗传算法的Travelling Sales Person方法，使用函数为“tsp_*”。&lt;br /&gt;&lt;br /&gt;下面用日本神奈川的城市道路数据进行测试。&lt;br /&gt;&lt;br /&gt;计算最短路径我们使用shortest_path这个函数，这个函数需要提供5个参数，下面是shortest_path的函数原型：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;shortest_path(sql text, source_id integer, target_id integer, directed boolean, has_reverse_cost boolean)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这里的sql是一个sql语句，通过这个sql语句可以获得需要计算的数据集合；source和target分别是起始节点的id；directed表明是否限制方向。需要说明的是这个sql语句，在这个sql中需要查询到一些特殊的字段：id、source、target、cost等，而且这些字段的类型必须和pgRouting的要求相符。下面是我构造的一个查询：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;SELECT * FROM shortest_path('&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;SELECT objectid as id,&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;source::integer,&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;target::integer,&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;length::double precision as cost&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;FROM kanagawa',&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;84808, 13234, false, false);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在本机上测试，上述查询在19万行数据中执行了2秒得到结果318行（路径分为318段）：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/Sf6frVtt-tI/AAAAAAAACZw/Kr5w1bpJG5E/s1600-h/2009-5-4+15-44-33.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 213px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/Sf6frVtt-tI/AAAAAAAACZw/Kr5w1bpJG5E/s400/2009-5-4+15-44-33.png" alt="" id="BLOGGER_PHOTO_ID_5331874575765338834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;以下是服务器端的主要代码：&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;public ArrayList&lt;hashmap&gt;&lt;string, double=""&gt;&gt; getNodes(int source, int target)&lt;br /&gt; {&lt;br /&gt;  ArrayList&lt;hashmap&gt;&lt;string, double=""&gt;&gt; result = new ArrayList&lt;hashmap&gt;&lt;string, double=""&gt;&gt;();&lt;br /&gt;  &lt;br /&gt;  if ( this.getConn()==null )&lt;br /&gt;   return result;&lt;br /&gt;  &lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;   String sql = "SELECT * FROM shortest_path('SELECT objectid as id,source::integer,target::integer,length::double precision as cost FROM kanagawa', "+source+", "+target+", false, false) as a left join kanagawa as b on a.edge_id=b.objectid;";&lt;br /&gt;   &lt;br /&gt;   Statement st = this.getConn().createStatement();   &lt;br /&gt;   st.setFetchSize(0);&lt;br /&gt;   ResultSet rs = st.executeQuery(sql);&lt;br /&gt;   while (rs.next())&lt;br /&gt;   { &lt;br /&gt;    HashMap&lt;string, double=""&gt; map = new HashMap&lt;string, double=""&gt;();&lt;br /&gt;    map.put("x1", rs.getDouble("x1"));&lt;br /&gt;    map.put("y1", rs.getDouble("y1"));&lt;br /&gt;    map.put("x2", rs.getDouble("x2"));&lt;br /&gt;    map.put("y2", rs.getDouble("y2"));&lt;br /&gt;    result.add(map);&lt;br /&gt;   }&lt;br /&gt;   rs.close(); &lt;br /&gt;   st.close();&lt;br /&gt;  }&lt;br /&gt;  catch(Exception e)&lt;br /&gt;  {&lt;br /&gt;   System.err.print(e);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  return result;&lt;br /&gt; }&lt;/string,&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/hashmap&gt;&lt;/string,&gt;&lt;/hashmap&gt;&lt;/string,&gt;&lt;/hashmap&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-6665612804405465315?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/6665612804405465315/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=6665612804405465315' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6665612804405465315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6665612804405465315'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/05/pgrouting.html' title='使用pgRouting进行路径分析'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__ZvvWze6o0c/Sf6frVtt-tI/AAAAAAAACZw/Kr5w1bpJG5E/s72-c/2009-5-4+15-44-33.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5793352385372333492</id><published>2009-04-30T14:56:00.002+08:00</published><updated>2009-04-30T14:58:49.264+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 23</title><content type='html'>&lt;span style="font-weight: bold;"&gt;三 Task的渲染&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Task的功能类中还有一个属性，IDE默认生成的名字是taskInfo，它对应这个另外一个Java类（如上面QueryTaskTaskInfo类）的对象。这个类主要控制Task的渲染，我们可以回想一下，如果光在Task的功能类中定义了Command是一个void类型的query方法，Task面板怎么会生成一个标签为“查询”的按钮出来的呢？答案就在taskInfo中。&lt;br /&gt;&lt;br /&gt;打开上面生成的“QueryTaskTaskInfo.java”文件，我们可以看到以下的内容：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class QueryTaskTaskInfo extends SimpleTaskInfo &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; public TaskDescriptor getTaskDescriptor() &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  TaskDescriptor descriptor = new TaskDescriptor(QueryTask.class, "queryTask", "查询任务");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  return descriptor;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; public TaskParamDescriptorModel[] getParamDescriptors()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  TaskParamDescriptor[] descriptors = new TaskParamDescriptor[1];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  descriptors[0] = new TaskParamDescriptor(QueryTask.class, "keyWord", "关键词", "getKeyWord", "setKeyWord");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  return descriptors;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; public TaskActionDescriptorModel[] getActionDescriptors()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  TaskActionDescriptor[] descriptors = new TaskActionDescriptor[1];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  descriptors[0] = new TaskActionDescriptor(QueryTask.class, "query", "查询");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  return descriptors;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; public TaskToolDescriptorModel[] getToolDescriptors()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  TaskToolDescriptor[] descriptors = new TaskToolDescriptor[1];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  descriptors[0] = new TaskToolDescriptor(QueryTask.class, "select", "选择", "EsriMapPolygon");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  return descriptors;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;简单的说，TaskInfo类中包含4个主要的属性：TaskDescriptor对象、TaskParamDescriptor[]数组、TaskActionDescriptor[]数组、TaskToolDescriptor[]数组。很好理解，TaskDescriptor对应整个Task的外观，比如Task的标题等；TaskParamDescriptor[]描述所有Parameter的外观；TaskActionDescriptor[]描述所有Command的外观；TaskToolDescriptor[]描述所有Tool的外观。一个Task中肯定包含不定数目的Parameter、Command或Tool，因此他们的描述需要数组来存放。&lt;br /&gt;&lt;br /&gt;让我们通过TaskToolDescriptor来更详细地看一下，上面的代码设置“select”这个TaskTool表现为一个“选择”按钮，并在点击时通知Map执行“EsriMapPolygon”操作。现在我想让它渲染成一个自定义的图片按钮，并随鼠标移上或点击切换不同的图片，用下面的代码可以实现这样的功能：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;descriptors[0].setRendererType(TaskToolDescriptor.IMAGE_RENDERER_TYPE);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;descriptors[0].setDefaultImage("images/tasks/maptools/polygon.gif");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;descriptors[0].setHoverImage("images/tasks/maptools/polygonU.gif");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;descriptors[0].setSelectedImage("images/tasks/maptools/polygonD.gif");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;descriptors[0].setDisabledImage("images/tasks/maptools/polygonX.gif");&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;现在我还想调整一下这些按钮、文本框的布局，怎么办？TaskInfo还可以指定Task各个子元素的布局，让我们在刚刚的QueryTaskTaskInfo类中再添加以下的代码：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public TaskLayout[] getTaskLayout()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;     TabularLayout[] descriptors = new TabularLayout[1];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; descriptors[0] = new TabularLayout();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;     descriptors[0].addComponent(getParamDescriptors()[0], new TabularPosition(0, 0, 0, 0));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;     descriptors[0].addComponent(getActionDescriptors()[0], new TabularPosition(1, 0, 0, 0));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;     descriptors[0].addComponent(getToolDescriptors()[0], new TabularPosition(2, 0, 0, 0));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; return descriptors;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;经过上面的两次修改，我们会发现Task面板的Tool变成了使用图片渲染，并且布局方式更加我们的定义进行了变化，效果如图 17所示。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SflL1anc-oI/AAAAAAAACZk/YL0nGRsDF2g/s1600-h/2009-4-29+13-48-37.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 242px; height: 117px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SflL1anc-oI/AAAAAAAACZk/YL0nGRsDF2g/s400/2009-4-29+13-48-37.png" alt="" id="BLOGGER_PHOTO_ID_5330375015019641474" border="0" /&gt;&lt;/a&gt;图 17 更改Tool渲染方式和布局后的Task面板&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;顺便回头再看看页面中Task的定义，其中有taskInfo属性，它对应的就是这个Task的TaskInfo对象：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;taskInfo="#{queryTask.taskInfo}"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;最后稍微总结一下吧，Task的外观主要通过TaskInfo来定义，ADF会根据Task所对应的TaskInfo，通过XSL样式文件渲染成DHTML代码，并输出到浏览器。到现在为止，一个Task面板包含什么内容、对应后台什么对象、怎么控制它们的表现，你应该都清楚了吧？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5793352385372333492?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5793352385372333492/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5793352385372333492' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5793352385372333492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5793352385372333492'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-23.html' title='ArcGIS Server Java ADF 案例教程 23'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__ZvvWze6o0c/SflL1anc-oI/AAAAAAAACZk/YL0nGRsDF2g/s72-c/2009-4-29+13-48-37.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-9106949747407091662</id><published>2009-04-30T14:55:00.000+08:00</published><updated>2009-04-30T14:56:27.764+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 22</title><content type='html'>&lt;span style="font-weight: bold;"&gt;二 Task的执行&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Task的执行主要在对应的功能类（比如上面的QueryTask类）中实现，上面已经详述了Task中的Parameter、Command、Tool分别对应的功能类中的元素，下面就让我们看看怎么去使用它们。&lt;br /&gt;&lt;br /&gt;在上面定义的那个QueryTask中，我们设计点击“查询”按钮就能根据文本框中输入的关键词去查找相应的要素。下面是实现这样功能的一段代码：&lt;br /&gt;   &lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public void query(TaskEvent event)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        WebContext webContext = event.getWebContext();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        WebQuery webQuery = (WebQuery) webContext.getAttribute("query");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        TextCriteria textCriteria = new TextCriteria();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        textCriteria.setMaxRecordCount(100);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        textCriteria.setSearchText(this.keyWord);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        List&lt;/span&gt;&lt;/span&gt;&lt;queryresult&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; listQueryResult = webQuery.query(textCriteria, webQuery.getQueryLayers());&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        webContext.getWebGraphics().clearGraphics();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        for (int i = 0; i &lt;&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;            QueryResult queryResult = listQueryResult.get(i);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;            queryResult.highlight();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        webContext.refresh();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;我们可以看到，从TaskEvent中可以直接获得我们的WebContext对象；从WebContext开始可以执行一系列的操作，其中用到了keyWord这个属性，keyWord对应的就是用户在Task面板的文本框中输入的文字；最后查询到结果在地图上通过Graphic高亮出来，通过WebContext的refresh方法输出到浏览器。&lt;br /&gt;&lt;br /&gt;这里涉及到了Parameter和Command的使用；至于Tool，唯一的区别就是WebContext是从MapEvent中获得，因此这里就不详细写了。另外，这段代码中还涉及到如何进行查询、如何使用Graphic等，这些内容我们在后面会详细讲。&lt;br /&gt;&lt;/queryresult&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-9106949747407091662?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/9106949747407091662/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=9106949747407091662' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/9106949747407091662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/9106949747407091662'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-22.html' title='ArcGIS Server Java ADF 案例教程 22'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-2303150135659588411</id><published>2009-04-29T15:49:00.004+08:00</published><updated>2009-04-29T15:55:47.517+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 21</title><content type='html'>这一章我们主要研究一下Task同志的成份和出身。ADF中本身包含一些现成的Task，不过相比对开发人员来说没有很大的意义，这一章我们的重点还是在如何自定义Task。&lt;br /&gt;&lt;br /&gt;Task是实现业务逻辑的重要部分。简单来说，Task可以让输入一些参数（在页面上以文本框、组合框等形式出现）、通过Command和Tool的组合，帮助你完成特定的“任务”并返回结果，这就是所谓的Task。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;一 Task的请求&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;虽说这一节的标题是Task的请求，但在这里我们对ADF的Task怎么向服务器做请求并不作深入的探讨，这里我们主要是去了解一个Task在服务器端执行的时候需要客户端提供的信息有哪些。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SfgHJp0kofI/AAAAAAAACY8/ULB9SxsB9dE/s1600-h/2009-4-28+15-20-14.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 323px; height: 176px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SfgHJp0kofI/AAAAAAAACY8/ULB9SxsB9dE/s400/2009-4-28+15-20-14.png" alt="" id="BLOGGER_PHOTO_ID_5330018021419557362" border="0" /&gt;&lt;/a&gt;图 13 一个Task的请求面板&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;如图 12是一个简单的Task请求面板，在这个面板中会有一些Parameter（一般以文本框、组合框等形式出现）和一些Command或Tool（一般以按钮形式出现）。下面我们先来定义一个Task，其中包含一个Parameter、一个Command和一个Tool。&lt;br /&gt;&lt;br /&gt;在IDE中新建一个Task最简单的方法就是使用菜单【File】-【New】-【Task】，然后给你的Task起个名字，如图 14。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SfgHJvgN2TI/AAAAAAAACZE/3KsaQ-LUs94/s1600-h/2009-4-28+15-41-34.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 323px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SfgHJvgN2TI/AAAAAAAACZE/3KsaQ-LUs94/s400/2009-4-28+15-41-34.png" alt="" id="BLOGGER_PHOTO_ID_5330018022944790834" border="0" /&gt;&lt;/a&gt;图 14 新建一个Task&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;这个时候，IDE会弹出另外一个对话框供你对这个Task进行一些设置，比如Task的名称、里面包含的Parameter、Command（在这里叫Action）、Tool等。这里就根据你的需要进行填写了，我们先各添加一个，如图 15所示。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SfgHJzEBq-I/AAAAAAAACZM/680GO6OaH7Q/s1600-h/2009-4-28+16-09-02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 366px; height: 400px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SfgHJzEBq-I/AAAAAAAACZM/680GO6OaH7Q/s400/2009-4-28+16-09-02.png" alt="" id="BLOGGER_PHOTO_ID_5330018023900294114" border="0" /&gt;&lt;/a&gt;图 15 给Task添加一些元素&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;这时你会发现，在Java源文件目录下多了2个文件，一个是“QueryTask.java”，另一个是“QueryTaskTaskInfo.java”，同时在faces-config.xml文件中也多了一个名为queryTask的ManagedBean。&lt;br /&gt;&lt;br /&gt;打开“QueryTask.java”文件，我们可以找到和刚才定义的那些内容相对应的代码，下面的表简述了这样的一种对应关系：&lt;br /&gt;&lt;br /&gt; 类型 名称&lt;br /&gt;Parameter  String             keyWord&lt;br /&gt;Command   Void方法        query(TaskEvent event)&lt;br /&gt;Tool             Void方法        select(MapEvent event)&lt;br /&gt;&lt;br /&gt;在“QueryTask.java”中我们还可以找到QueryTaskTaskInfo对象，关于QueryTaskTaskInfo这个类的定义及其作用我们在后面再详细说。下面让我们先把这个Task添加到页面上去：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SfgHz1H3J9I/AAAAAAAACZc/01qjZizOyYw/s1600-h/2009-4-29+15-54-35.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 319px; height: 124px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SfgHz1H3J9I/AAAAAAAACZc/01qjZizOyYw/s400/2009-4-29+15-54-35.png" alt="" id="BLOGGER_PHOTO_ID_5330018746007758802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;这里的taskInfo属性就是这个Task的TaskInfo对象，我们可以先不用管，唯一一个以前没有出现过的属性就是windowingSupport，这个属性定义的是这个Task面板是否可以在页面上浮动并拖拽。让我们运行下这个页面看一下效果：&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SfgHmXaTT1I/AAAAAAAACZU/RfNzP2I7i1c/s1600-h/2009-4-28+16-51-24.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 237px; height: 102px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SfgHmXaTT1I/AAAAAAAACZU/RfNzP2I7i1c/s400/2009-4-28+16-51-24.png" alt="" id="BLOGGER_PHOTO_ID_5330018514693738322" border="0" /&gt;&lt;/a&gt;图 16 上面定义的Task面板的效果&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;稍微总结一下，Task中主要包含3个功能元素：Parameter、Command、Tool；Task对应的Java类有2个，其中在实现功能的Task类（比如上面的QueryTask类）中，Parameter对应类中的属性字段、Command对应类中的带TaskEvent 参数的void方法、Tool对应类中的带MapEvent 参数的void方法。这样，前台的Task请求就和后台具体的功能联系起来了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-2303150135659588411?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/2303150135659588411/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=2303150135659588411' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2303150135659588411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2303150135659588411'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-21.html' title='ArcGIS Server Java ADF 案例教程 21'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__ZvvWze6o0c/SfgHJp0kofI/AAAAAAAACY8/ULB9SxsB9dE/s72-c/2009-4-28+15-20-14.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-7127573985529502104</id><published>2009-04-28T13:47:00.003+08:00</published><updated>2009-04-28T13:52:12.533+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 20</title><content type='html'>&lt;span style="font-weight: bold;"&gt;七 自定义Button实现前面的Command和Tool【案例】&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在这一章前面的小节中，我们实现了两个案例分别演示Command和Tool的功能；在这个案例里，让我们用Button来完成相同的工作。&lt;br /&gt;首先，我们需要在一个我们自己定义的ManagedBean 来实现这些功能。注意，在这个ManagedBean中我们会使用WebContext对象（否则怎么调用地图功能），因此，我们这个类定义需要实现WebContextInitialize接口。当然，在IDE中有更简单的方法，比如在Eclipse中选择菜单【New】-【Context Attribute】就可以新建一个ManagedBean并添加到WebContext对象的attributes中去。&lt;br /&gt;好了，现在我们已经有了自己的ManagedBean类“MapEditor”；接下来我们先实现地图等比放大的功能。在这个类中，我们添加一个不带任何参数的方法zoomIn，在zoomIn实现地图放大一倍的功能。源代码如下：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;package wuyf;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import com.esri.adf.web.data.WebContext;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import com.esri.adf.web.data.WebContextInitialize;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class MapEditor implements WebContextInitialize&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; private WebContext webContext;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; public void destroy() {}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; public void init(WebContext context)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  this.webContext = context;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; public void zoomIn()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;      webContext.getWebMap().getCurrentExtent().expand(0.5);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;      webContext.refresh();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/span&gt;   &lt;br /&gt;在页面中用如下的标签进行定义：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SfaZMhR7zXI/AAAAAAAACYk/tPvR-EcPGCA/s1600-h/2009-4-28+13-48-32.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 142px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SfaZMhR7zXI/AAAAAAAACYk/tPvR-EcPGCA/s400/2009-4-28+13-48-32.png" alt="" id="BLOGGER_PHOTO_ID_5329615649410633074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;这个时候，你在页面上点击这个Button的时候，地图也会放大一倍了。&lt;br /&gt;下面我们接着去实现点击地图居中，和上面类似，只不过实现这个功能的方法需要带一个MapEvent参数：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public void centerAt(MapEvent event)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  WebPoint webPoint = (WebPoint)event.getWebGeometry().toMapGeometry(webContext.getWebMap());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  webContext.getWebMap().centerAt(webPoint, 1.0);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  webContext.refresh();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;在页面中定义的标签则如下：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SfaZMnweNDI/AAAAAAAACYs/l2h2k77OkxU/s1600-h/2009-4-28+13-49-56.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 390px; height: 144px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SfaZMnweNDI/AAAAAAAACYs/l2h2k77OkxU/s400/2009-4-28+13-49-56.png" alt="" id="BLOGGER_PHOTO_ID_5329615651149329458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;好了，试着点击这个按钮，再在地图上点击，是不是地图以点击处居中了？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-7127573985529502104?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/7127573985529502104/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=7127573985529502104' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7127573985529502104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7127573985529502104'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-20.html' title='ArcGIS Server Java ADF 案例教程 20'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__ZvvWze6o0c/SfaZMhR7zXI/AAAAAAAACYk/tPvR-EcPGCA/s72-c/2009-4-28+13-48-32.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5006822948102876473</id><published>2009-04-28T13:44:00.002+08:00</published><updated>2009-04-28T13:47:21.782+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 19</title><content type='html'>&lt;span style="font-weight: bold;"&gt;六 Button&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Button不属于Toolbar的子元素，而是和Toolbar有类似的地位；但同时，它的功能又集合了Command和Tool。Button的出现主要是为了方便用户，当用户不希望出现一个工具条来摆放与地图相关的功能，那么Button可以在页面的任意地方摆放一个与地图相关的按钮。&lt;br /&gt;&lt;br /&gt;在ADF工程里，让我们打开ADF自带的模板页面“edit.jsp”，在里面有很多Button。以下是定义了一个在客户端绘制一个矩形，服务器端执行“选择要素”操作的Button：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SfaYLJz21oI/AAAAAAAACYc/umZ6ypXPUqc/s1600-h/2009-4-28+13-46-04.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 366px; height: 161px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SfaYLJz21oI/AAAAAAAACYc/umZ6ypXPUqc/s400/2009-4-28+13-46-04.png" alt="" id="BLOGGER_PHOTO_ID_5329614526418966146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;我们可以看到，Button和Command以及Tool都很相像，有clientAction也有serverAction，所不同的是，Button需要指定一个mapId属性，因为Command和Tool都是存放在Toolbar中，Toolbar会有个统一的mapId来表示和哪个Map绑定；而Button则由于是独立的按钮，需要自己指定与之绑定的Map。&lt;br /&gt;&lt;br /&gt;clientAction属性是可选的，如果你不填clientAction，那么这个Button的行为就类似于Command；如果你设置了clientAction，那么这个Button的行为就类似与Tool。另外，这里的serverAction需要指向一个服务器端对象的方法，如果没有clientAction，那么这个serverAction指向的方法应该是一个无参数的方法；如果有clientAction，那么这个serverAction指向的方法应该是一个带MapEvent 参数的方法。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5006822948102876473?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5006822948102876473/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5006822948102876473' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5006822948102876473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5006822948102876473'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-19.html' title='ArcGIS Server Java ADF 案例教程 19'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__ZvvWze6o0c/SfaYLJz21oI/AAAAAAAACYc/umZ6ypXPUqc/s72-c/2009-4-28+13-46-04.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5388642763426551455</id><published>2009-04-28T13:41:00.003+08:00</published><updated>2009-04-28T13:44:31.731+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 18</title><content type='html'>&lt;span style="font-weight: bold;"&gt;五 自定义Tool实现点击地图居中【案例】&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在这一小节中，我们通过自定义一个Tool来激活这样的地图功能：每次点击地图，都以这个点击点为中心使地图居中。&lt;br /&gt;&lt;br /&gt;如下，我们新建了这样一个类CenterAtToolAction：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import com.esri.adf.web.data.WebContext;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import com.esri.adf.web.data.geometry.WebPoint;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import com.esri.adf.web.faces.event.MapEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import com.esri.adf.web.faces.event.MapToolAction;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class CenterAtToolAction implements MapToolAction&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    public void execute(MapEvent event) throws Exception&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        WebContext webContext = event.getWebContext();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        WebPoint webPoint = (WebPoint)event.getWebGeometry().toMapGeometry(webContext.getWebMap());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        webContext.getWebMap().centerAt(webPoint, 0.5);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        webContext.refresh();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这个类的关键是实现了MapToolAction的execute方法，当一个Tool被激活，并在地图上进行了操作以后，一个请求就会被发送到服务器，对应的MapToolAction的execute方法就会被执行。&lt;br /&gt;&lt;br /&gt;这里，我们通过MapEvent的获得WebContext和WebGeometry 对象。比如我们在浏览器中点击了一下，那么WebGeometry就是一个点对象，当然，这个点坐标是基于屏幕坐标的，我们需要调用它的toMapGeometry方法转化成地理坐标。&lt;br /&gt;&lt;br /&gt;当这些准备工作完成以后，我们就可以使用WebMap的centerAt方法使地图居中，随后刷新WebContext输出响应到浏览器。&lt;br /&gt;&lt;br /&gt;如图 11是点击居中前后的地图。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SfaXdlmE2fI/AAAAAAAACYU/8WLhpVvP67k/s1600-h/2009-4-21+11-44-54.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 318px; height: 400px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SfaXdlmE2fI/AAAAAAAACYU/8WLhpVvP67k/s400/2009-4-21+11-44-54.png" alt="" id="BLOGGER_PHOTO_ID_5329613743603374578" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5388642763426551455?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5388642763426551455/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5388642763426551455' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5388642763426551455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5388642763426551455'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-18.html' title='ArcGIS Server Java ADF 案例教程 18'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__ZvvWze6o0c/SfaXdlmE2fI/AAAAAAAACYU/8WLhpVvP67k/s72-c/2009-4-21+11-44-54.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-245116276389166880</id><published>2009-04-28T13:37:00.002+08:00</published><updated>2009-04-28T13:41:09.751+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 17</title><content type='html'>&lt;span style="font-weight: bold;"&gt;四 Tool&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tool是另外一种按钮，虽然它在外观上和Command可能没什么区别，但是当Tool被点击以后，地图状态就进行了改变。比如我当前默认对地图的操作是漫游，通过点击一个Tool，接下来在地图上的点击可能就变成了放大操作——与地图交互，这就是Tool的作用。&lt;br /&gt;&lt;br /&gt;以下代码定义了一个“使地图处于漫游状态”的Tool：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SfaW37ksggI/AAAAAAAACYM/NS7TZlxdvNo/s1600-h/2009-4-28+13-40-26.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 155px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SfaW37ksggI/AAAAAAAACYM/NS7TZlxdvNo/s400/2009-4-28+13-40-26.png" alt="" id="BLOGGER_PHOTO_ID_5329613096668135938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Tool定义时两个最重要的属性就是clientAction和serverAction。clientAction定义的是在浏览器端执行的操作，比如这里的“EsriMapContinuousPan”代表浏览器端执行的是连续漫游操作——当然，比如你需要在地图里画个多边形之类的操作也可以使用其它的定义，可用的操作大概如表 1所列：&lt;br /&gt;EsriEditingLine 编辑直线 EsriMapLine 画直线&lt;br /&gt;EsriEditingPoint 编辑点 EsriMapMouseWheel 滚轮滚动&lt;br /&gt;EsriEditingPolygon 编辑多边形 EsriMapOval 画椭圆&lt;br /&gt;EsriEditingPolyline 编辑多线 EsriMapPan 漫游&lt;br /&gt;EsriMapCircle 画圆 EsriMapPoint 画点&lt;br /&gt;EsriMapContinuousPan 连续漫游 EsriMapPolygon 画多边形&lt;br /&gt;EsriMapImage 添加图片 EsriMapPolyline 画多线&lt;br /&gt;EsriMapKeyNavigation 键盘导航 EsriMapRectangle 画矩形&lt;br /&gt;表 1  浏览器端支持的操作列表&lt;br /&gt;&lt;br /&gt;当用户在浏览器执行了操作以后，ADF会把这个操作相关的信息发送到服务器，然后Tool的serverAction属性中定义的这个类就起作用了。比如上面的这个Tool，服务器接到请求以后会通过PanToolAction的定义对请求过来的参数进行处理（比如向右漫游100个像素），经过一系列计算以后它更新服务器端的WebMap等对象的状态，所有工作完成以后再调用WebContext的refresh方法进行刷新，随后输出响应到浏览器。&lt;br /&gt;&lt;br /&gt;serverAction指向的类主要需要实现MapToolAction 接口，在下面的案例中，我们会实现一个自己的ToolAction类。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-245116276389166880?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/245116276389166880/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=245116276389166880' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/245116276389166880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/245116276389166880'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-17.html' title='ArcGIS Server Java ADF 案例教程 17'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__ZvvWze6o0c/SfaW37ksggI/AAAAAAAACYM/NS7TZlxdvNo/s72-c/2009-4-28+13-40-26.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-3775371201836846072</id><published>2009-04-24T14:53:00.003+08:00</published><updated>2009-04-24T14:58:26.754+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PostgreSQL/PostGIS'/><title type='text'>PostgreSQL+PostGIS的使用 5</title><content type='html'>&lt;span style="font-weight: bold;"&gt;五、 PostGIS示例&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;下面我们通过一个简单的Flex应用示例来看一下PostGIS的用法：&lt;br /&gt;&lt;br /&gt;假想现在发生了恐怖袭击，导致在一些城市有污染物出现，现在我们要根据污染物和当地风力、风向情况，计算污染扩散范围，针对这些区域及时进行警报和疏散。&lt;br /&gt;&lt;br /&gt;首先我们希望获得所有发生污染的城市的当前风速、风向等信息，在我们的PostGIS数据库中有一个空间表保存着这些信息，我们构造这样的SQL语句进行查询：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;select *,ST_AsGeoJson(shape) from sde.wind&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这里会获取所有风相关的信息，并且附加了以JSON格式返回的几何信息，这有助于我们在Flex中进行解析。如下图是关于风的查询结果：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SfFiP8rfycI/AAAAAAAACX8/Ro-ky9fIdiQ/s1600-h/2009-4-24+14-20-57.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 196px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SfFiP8rfycI/AAAAAAAACX8/Ro-ky9fIdiQ/s400/2009-4-24+14-20-57.png" alt="" id="BLOGGER_PHOTO_ID_5328147860282132930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;下面我们希望PostGIS帮助我们实现一些空间分析。我们以污染发生的城市为起点，当地风向为主方向，构造一个30度开角的范围；这个范围将是污染扩散的主要方向，扩散的范围主要和风的强度有关；在构造这个区域以后，为了保险起见，我们在对其进行一定范围的缓冲，最后得到每个污染源可能扩散的范围。我们构造的SQL语句如下：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;select *,ST_AsGeoJson(&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;  ST_Buffer(&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;   ST_PolygonFromText(&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;    'POLYGON(('&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;    ||ST_X(shape)||' '||ST_Y(shape)||','&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;    ||ST_X(shape)+velocity*cos((direction+15)*PI()/180)/20||' '||ST_Y(shape)+velocity*sin((direction+15)*PI()/180)/20||','&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;    ||ST_X(shape)+velocity*cos((direction-15)*PI()/180)/20||' '||ST_Y(shape)+velocity*sin((direction-15)*PI()/180)/20||','&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;    ||ST_X(shape)||' '||ST_Y(shape)||'))'&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;   )&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;   , velocity/50&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;  )&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt; ) &lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;from sde.wind&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;下面是PostGIS进行运算后返回的结果：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SfFiQRxnjXI/AAAAAAAACYE/Zwfw4v3FO0s/s1600-h/2009-4-24+14-21-12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 196px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SfFiQRxnjXI/AAAAAAAACYE/Zwfw4v3FO0s/s400/2009-4-24+14-21-12.png" alt="" id="BLOGGER_PHOTO_ID_5328147865944952178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;在这里，Flex应用与服务器的交互通过BlazeDS进行,下面是本示例在服务器端的Java代码：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;package wuyf;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import java.sql.Connection;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import java.sql.DriverManager;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import java.sql.ResultSet;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import java.sql.Statement;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import java.util.ArrayList;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import java.util.HashMap;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class Wind &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; private Connection conn = null;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; public Connection getConn() &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  if (conn==null)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   try&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    Class.forName("org.postgresql.Driver");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    String url = "jdbc:postgresql://localhost:5432/sde" ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    conn = DriverManager.getConnection(url, "sde" , "pwd" );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    conn.setAutoCommit(false);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   catch(Exception e)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    System.err.print(e);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  return conn;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; public ArrayList&lt;/span&gt;&lt;/span&gt;   &lt;hashmap&gt;&lt;string, string=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&gt; getWinds()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  ArrayList&lt;/span&gt;&lt;/span&gt;&lt;hashmap&gt;&lt;string, string=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&gt; result = new ArrayList&lt;/span&gt;&lt;/span&gt;&lt;hashmap&gt;&lt;string, string=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  if ( this.getConn()==null )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   return result;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  try&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   String sql = "select *,ST_AsGeoJson(shape) from sde.wind";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   Statement st = this.getConn().createStatement();   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   st.setFetchSize(0);   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   ResultSet rs = st.executeQuery(sql);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   while (rs.next())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    HashMap&lt;/span&gt;&lt;/span&gt;       &lt;string, string=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; map = new HashMap&lt;/span&gt;&lt;/span&gt;&lt;string, string=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    map.put("shape", rs.getString("ST_AsGeoJson"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    map.put("velocity", rs.getString("velocity"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    map.put("direction", rs.getString("direction"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    result.add(map);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   rs.close(); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   st.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  catch(Exception e)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   System.err.print(e);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  return result;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; public ArrayList&lt;/span&gt;&lt;/span&gt;  &lt;hashmap&gt;&lt;string, string=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&gt; getEffectZones()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  ArrayList&lt;/span&gt;&lt;/span&gt;&lt;hashmap&gt;&lt;string, string=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&gt; result = new ArrayList&lt;/span&gt;&lt;/span&gt;&lt;hashmap&gt;&lt;string, string=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  if ( this.getConn()==null )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   return result;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  try&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   String sql = "select *,ST_AsGeoJson(";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=   "ST_Buffer(";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=    "ST_PolygonFromText(";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=     "'POLYGON(('";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=     "||ST_X(shape)||' '||ST_Y(shape)||','";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=     "||ST_X(shape)+velocity*cos((direction+15)*PI()/180)/20||' '||ST_Y(shape)+velocity*sin((direction+15)*PI()/180)/20||','";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=     "||ST_X(shape)+velocity*cos((direction-15)*PI()/180)/20||' '||ST_Y(shape)+velocity*sin((direction-15)*PI()/180)/20||','";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=     "||ST_X(shape)||' '||ST_Y(shape)||'))'";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=    ")";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=    ", velocity/50";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=   ")";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+=  ") ";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   sql+="from sde.wind";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   Statement st = this.getConn().createStatement();   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   st.setFetchSize(0);   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   ResultSet rs = st.executeQuery(sql);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   while (rs.next())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    HashMap&lt;/span&gt;&lt;/span&gt;       &lt;string, string=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; map = new HashMap&lt;/span&gt;&lt;/span&gt;&lt;string, string=""&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    map.put("shape", rs.getString("ST_AsGeoJson"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    map.put("velocity", rs.getString("velocity"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    map.put("direction", rs.getString("direction"));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    result.add(map);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   rs.close(); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   st.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  catch(Exception e)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   System.err.print(e);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  return result;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/span&gt;  &lt;br /&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/hashmap&gt;&lt;/string,&gt;&lt;/hashmap&gt;&lt;/string,&gt;&lt;/hashmap&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/hashmap&gt;&lt;/string,&gt;&lt;/hashmap&gt;&lt;/string,&gt;&lt;/hashmap&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-3775371201836846072?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/3775371201836846072/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=3775371201836846072' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3775371201836846072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3775371201836846072'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/postgresqlpostgis-5.html' title='PostgreSQL+PostGIS的使用 5'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__ZvvWze6o0c/SfFiP8rfycI/AAAAAAAACX8/Ro-ky9fIdiQ/s72-c/2009-4-24+14-20-57.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-6893557639039119921</id><published>2009-04-24T14:49:00.001+08:00</published><updated>2009-04-24T14:52:27.883+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PostgreSQL/PostGIS'/><title type='text'>PostgreSQL+PostGIS的使用 4</title><content type='html'>&lt;span style="font-weight: bold;"&gt;2. PostGIS扩展函数&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;管理函数：&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;删除一个空间表（包括geometry_columns中的记录） DropGeometryTable([&lt;schema_name&gt;], &lt;table_name&gt;)&lt;br /&gt;更新空间表的空间参考 UpdateGeometrySRID([&lt;schema_name&gt;], &lt;table_name&gt;, &lt;column_name&gt;, &lt;srid&gt;)&lt;br /&gt;更新空间表的统计信息 update_geometry_stats([&lt;table_name&gt;, &lt;column_name&gt;])&lt;br /&gt;&lt;br /&gt;参考语义：&lt;br /&gt;Geos：GEOS库&lt;br /&gt;Jts：JTS库&lt;br /&gt;Proj：PROJ4库  postgis_version()&lt;br /&gt;&lt;br /&gt; postgis_lib_version()&lt;br /&gt; postgis_lib_build_date()&lt;br /&gt; postgis_script_build_date()&lt;br /&gt; postgis_scripts_installed()&lt;br /&gt; postgis_scripts_released()&lt;br /&gt; postgis_geos_version()&lt;br /&gt; postgis_jts_version()&lt;br /&gt; postgis_proj_version()&lt;br /&gt; postgis_uses_stats()&lt;br /&gt; postgis_full_version()&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;几何操作符：&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A范围=B范围 A = B&lt;br /&gt;A范围覆盖B范围或A范围在B范围左侧 A &amp;amp;&lt;&gt; B&lt;br /&gt;A范围在B范围左侧 A &lt;&lt;&gt;&gt; B&lt;br /&gt;A范围覆盖B范围或A范围在B范围下方 A &amp;amp;&lt;| B A范围覆盖B范围或A范围在B范围上方 A |&amp;amp;&gt; B&lt;br /&gt;A范围在B范围下方 A &lt;&lt;| B A范围在B范围上方 A |&gt;&gt; B&lt;br /&gt;A=B A ~= B&lt;br /&gt;A范围被B范围包含 A @ B&lt;br /&gt;A范围包含B范围 A ~ B&lt;br /&gt;A范围覆盖B范围 A &amp;amp;&amp;amp; B&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;几何量测函数：&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;量测面积 ST_Area(geometry)&lt;br /&gt;根据经纬度点计算在地球曲面上的距离，单位米，地球半径取值6370986米 ST_distance_sphere(point, point)&lt;br /&gt;类似上，使用指定的地球椭球参数 ST_distance_spheroid(point, point, spheroid)&lt;br /&gt;量测2D对象长度 ST_length2d(geometry)&lt;br /&gt;量测3D对象长度 ST_length3d(geometry)&lt;br /&gt;根据经纬度对象计算在地球曲面上的长度 ST_length_spheroid(geometry,spheroid)&lt;br /&gt; ST_length3d_spheroid(geometry,spheroid)&lt;br /&gt;量测两个对象间距离 ST_distance(geometry, geometry)&lt;br /&gt;量测两条线之间的最大距离 ST_max_distance(linestring,linestring)&lt;br /&gt;量测2D对象的周长 ST_perimeter(geometry)&lt;br /&gt; ST_perimeter2d(geometry)&lt;br /&gt;量测3D对象的周长 ST_perimeter3d(geometry)&lt;br /&gt;量测两点构成的方位角，单位弧度 ST_azimuth(geometry, geometry)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;几何对象输出：&lt;/span&gt;&lt;br /&gt;参考语义：&lt;br /&gt;NDR：Little Endian&lt;br /&gt;XDR：big-endian&lt;br /&gt;HEXEWKB：Canonical&lt;br /&gt;SVG：SVG 格式&lt;br /&gt;GML：GML 格式&lt;br /&gt;KML：KML 格式&lt;br /&gt;GeoJson：GeoJson 格式&lt;br /&gt;&lt;br /&gt;ST_AsBinary(geometry,{'NDR'|'XDR'})&lt;br /&gt; ST_AsEWKT(geometry)&lt;br /&gt; ST_AsEWKB(geometry, {'NDR'|'XDR'})&lt;br /&gt; ST_AsHEXEWKB(geometry, {'NDR'|'XDR'})&lt;br /&gt; ST_AsSVG(geometry, [rel], [precision])&lt;br /&gt; ST_AsGML([version], geometry, [precision])&lt;br /&gt; ST_AsKML([version], geometry, [precision])&lt;br /&gt; ST_AsGeoJson([version], geometry, [precision], [options])&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;几何对象创建：&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;参考语义：&lt;br /&gt;Dump：转储 ST_GeomFromEWKT(text)&lt;br /&gt;&lt;br /&gt; ST_GeomFromEWKB(bytea)&lt;br /&gt; ST_MakePoint(&lt;x&gt;, &lt;y&gt;, [&lt;z&gt;], [&lt;m&gt;])&lt;br /&gt; ST_MakePointM(&lt;x&gt;, &lt;y&gt;, &lt;m&gt;)&lt;br /&gt; ST_MakeBox2D(&lt;ll&gt;, &lt;ur&gt;)&lt;br /&gt; ST_MakeBox3D(&lt;llb&gt;, &lt;urt&gt;)&lt;br /&gt; ST_MakeLine(geometry set)&lt;br /&gt; ST_MakeLine(geometry, geometry)&lt;br /&gt; ST_LineFromMultiPoint(multipoint)&lt;br /&gt; ST_MakePolygon(linestring, [linestring[]])&lt;br /&gt; ST_BuildArea(geometry)&lt;br /&gt; ST_Polygonize(geometry set)&lt;br /&gt; ST_Collect(geometry set)&lt;br /&gt; ST_Collect(geometry, geometry)&lt;br /&gt; ST_Dump(geometry)&lt;br /&gt; ST_DumpRings(geometry)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;几何对象编辑：&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;给几何对象添加一个边界，会使查询速度加快 ST_AddBBOX(geometry)&lt;br /&gt;删除几何对象的边界 ST_DropBBOX(geometry)&lt;br /&gt;添加、删除、设置点 ST_AddPoint(linestring, point, [&lt;position&gt;])&lt;br /&gt; ST_RemovePoint(linestring, offset)&lt;br /&gt; ST_SetPoint(linestring, N, point)&lt;br /&gt;几何对象类型转换 ST_Force_collection(geometry)&lt;br /&gt; ST_Force_2d(geometry)&lt;br /&gt; ST_Force_3dz(geometry), ST_Force_3d(geometry),&lt;br /&gt; ST_Force_3dm(geometry)&lt;br /&gt; ST_Force_4d(geometry)&lt;br /&gt; ST_Multi(geometry)&lt;br /&gt;将几何对象转化到指定空间参考 ST_Transform(geometry,integer)&lt;br /&gt;对3D几何对象作仿射变化 ST_Affine(geometry, float8, float8, float8, float8, float8, float8, float8, float8, float8, float8, float8, float8)&lt;br /&gt;对2D几何对象作仿射变化 ST_Affine(geometry, float8, float8, float8, float8, float8, float8)&lt;br /&gt;对几何对象作偏移 ST_Translate(geometry, float8, float8, float8)&lt;br /&gt;对几何对象作缩放 ST_Scale(geometry, float8, float8, float8)&lt;br /&gt;对3D几何对象作旋转 ST_RotateZ(geometry, float8)&lt;br /&gt;ST_RotateX(geometry, float8)&lt;br /&gt;ST_RotateY(geometry, float8)&lt;br /&gt;对2D对象作偏移和缩放 ST_TransScale(geometry, float8, float8, float8, float8)&lt;br /&gt;反转 ST_Reverse(geometry)&lt;br /&gt;转化到右手定则 ST_ForceRHR(geometry)&lt;br /&gt;参考IsSimple函数&lt;br /&gt;使用Douglas-Peuker算法 ST_Simplify(geometry, tolerance)&lt;br /&gt; ST_SimplifyPreserveTopology(geometry, tolerance)&lt;br /&gt;讲几何对象顶点捕捉到网格 ST_SnapToGrid(geometry, originX, originY, sizeX, sizeY)&lt;br /&gt;ST_SnapToGrid(geometry, sizeX, sizeY), ST_SnapToGrid(geometry, size)&lt;br /&gt;第二个参数为点，指定原点坐标 ST_SnapToGrid(geometry, geometry, sizeX, sizeY, sizeZ, sizeM)&lt;br /&gt;分段 ST_Segmentize(geometry, maxlength)&lt;br /&gt;合并为线 ST_LineMerge(geometry)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;线性参考：&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;根据location（0-1）获得该位置的点 ST_line_interpolate_point(linestring, location)&lt;br /&gt;获取一段线 ST_line_substring(linestring, start, end)&lt;br /&gt;根据点获取location（0-1） ST_line_locate_point(LineString, Point)&lt;br /&gt;根据量测值获得几何对象 ST_locate_along_measure(geometry, float8)&lt;br /&gt;根据量测值区间获得几何对象集合 ST_locate_between_measures(geometry, float8, float8)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;杂项功能函数：&lt;/span&gt;&lt;br /&gt;几何对象的摘要 ST_Summary(geometry)&lt;br /&gt;几何对象的边界 ST_box2d(geometry)&lt;br /&gt; ST_box3d(geometry)&lt;br /&gt;多个几何对象的边界 ST_extent(geometry set)&lt;br /&gt;0=2d, 1=3dm, 2=3dz, 3=4d ST_zmflag(geometry)&lt;br /&gt;是否包含Bounding Box ST_HasBBOX(geometry)&lt;br /&gt;几何对象的维数：2、3、4 ST_ndims(geometry)&lt;br /&gt;子对象的个数 ST_nrings(geometry)&lt;br /&gt; ST_npoints(geometry)&lt;br /&gt;对象是否验证成功 ST_isvalid(geometry)&lt;br /&gt;扩大几何对象 ST_expand(geometry, float)&lt;br /&gt;计算一个空间表的边界范围 ST_estimated_extent([schema], table, geocolumn)&lt;br /&gt;获得空间参考 ST_find_srid(&lt;db schema=""&gt;, &lt;table&gt;, &lt;column&gt;)&lt;br /&gt;几何对象使用的内存大小，单位byte ST_mem_size(geometry)&lt;br /&gt;点是否在圆上 ST_point_inside_circle(&lt;geometry&gt;,&lt;circle_center_x&gt;,&lt;circle_center_y&gt;,&lt;radius&gt;)&lt;br /&gt;获取边界的X、Y、Z ST_XMin(box3d)&lt;br /&gt;ST_YMin(box3d)&lt;br /&gt;ST_ZMin(box3d)&lt;br /&gt; ST_XMax(box3d)&lt;br /&gt;ST_YMax(box3d)&lt;br /&gt;ST_ZMax(box3d)&lt;br /&gt;构造一个几何对象的数组 ST_Accum(geometry set)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;长事务支持：&lt;/span&gt;&lt;br /&gt;启用/关闭长事务支持，重复调用无副作用 EnableLongTransactions()&lt;br /&gt; DisableLongTransactions()&lt;br /&gt;检查对行的update和delete操作是否已授权 CheckAuth([&lt;schema&gt;], &lt;/schema&gt;&lt;/radius&gt;&lt;/circle_center_y&gt;&lt;/circle_center_x&gt;&lt;/geometry&gt;&lt;/column&gt;&lt;/table&gt;&lt;table&gt;, &lt;rowid_col&gt;)&lt;br /&gt;锁定行 LockRow([&lt;schema&gt;], &lt;/schema&gt;&lt;/rowid_col&gt;&lt;/table&gt;&lt;table&gt;, &lt;rowid&gt;, &lt;authid&gt;, [&lt;expires&gt;])&lt;br /&gt;解锁行 UnlockRows(&lt;authid&gt;)&lt;br /&gt;在当前事务中添加授权ID AddAuth(&lt;authid&gt;)&lt;br /&gt;&lt;br /&gt;其它还有SQL-MM和ArcSDE样式的函数支持，可以参考http://postgis.refractions.net/documentation/manual-1.3/ch06.html#id2750611，这里就不详细列了。&lt;br /&gt;&lt;/authid&gt;&lt;/authid&gt;&lt;/expires&gt;&lt;/authid&gt;&lt;/rowid&gt;&lt;/table&gt;&lt;/db&gt;&lt;/position&gt;&lt;/urt&gt;&lt;/llb&gt;&lt;/ur&gt;&lt;/ll&gt;&lt;/m&gt;&lt;/y&gt;&lt;/x&gt;&lt;/m&gt;&lt;/z&gt;&lt;/y&gt;&lt;/x&gt;&lt;/column_name&gt;&lt;/table_name&gt;&lt;/srid&gt;&lt;/column_name&gt;&lt;/table_name&gt;&lt;/schema_name&gt;&lt;/table_name&gt;&lt;/schema_name&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-6893557639039119921?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/6893557639039119921/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=6893557639039119921' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6893557639039119921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6893557639039119921'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/postgresqlpostgis-4.html' title='PostgreSQL+PostGIS的使用 4'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-9219588082140994947</id><published>2009-04-24T14:42:00.002+08:00</published><updated>2009-04-24T14:49:27.699+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PostgreSQL/PostGIS'/><title type='text'>PostgreSQL+PostGIS的使用 3</title><content type='html'>&lt;span style="font-weight: bold;"&gt;四、 PostGIS中的常用函数&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;以下内容包括比较多的尖括号，发布到blogger的时候会显示不正常，内容太多我也无暇一个个手动改代码，因此如有问题就去参考PostGIS官方文档。&lt;br /&gt;&lt;br /&gt;首先需要说明一下，这里许多函数是以ST_[X]yyy形式命名的，事实上很多函数也可以通过xyyy的形式访问，在PostGIS的函数库中我们可以看到这两种函数定义完全一样。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. OGC标准函数&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;管理函数：&lt;/span&gt;&lt;br /&gt;添加几何字段 AddGeometryColumn(&lt;schema_name&gt;, &lt;table_name&gt;, &lt;column_name&gt;, &lt;srid&gt;, &lt;type&gt;, &lt;dimension&gt;)&lt;br /&gt;删除几何字段 DropGeometryColumn(&lt;schema_name&gt;, &lt;table_name&gt;, &lt;column_name&gt;)&lt;br /&gt;检查数据库几何字段并在geometry_columns中归档 Probe_Geometry_Columns()&lt;br /&gt;给几何对象设置空间参考（在通过一个范围做空间查询时常用） ST_SetSRID(geometry, integer)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;几何对象关系函数&lt;/span&gt;：&lt;br /&gt;获取两个几何对象间的距离 ST_Distance(geometry, geometry)&lt;br /&gt;如果两个几何对象间距离在给定值范围内，则返回TRUE ST_DWithin(geometry, geometry, float)&lt;br /&gt;判断两个几何对象是否相等&lt;br /&gt;（比如LINESTRING(0 0, 2 2)和LINESTRING(0 0, 1 1, 2 2)是相同的几何对象） ST_Equals(geometry, geometry)&lt;br /&gt;判断两个几何对象是否分离 ST_Disjoint(geometry, geometry)&lt;br /&gt;判断两个几何对象是否相交 ST_Intersects(geometry, geometry)&lt;br /&gt;判断两个几何对象的边缘是否接触 ST_Touches(geometry, geometry)&lt;br /&gt;判断两个几何对象是否互相穿过 ST_Crosses(geometry, geometry)&lt;br /&gt;判断A是否被B包含 ST_Within(geometry A, geometry B)&lt;br /&gt;判断两个几何对象是否是重叠 ST_Overlaps(geometry, geometry)&lt;br /&gt;判断A是否包含B ST_Contains(geometry A, geometry B)&lt;br /&gt;判断A是否覆盖 B ST_Covers(geometry A, geometry B)&lt;br /&gt;判断A是否被B所覆盖 ST_CoveredBy(geometry A, geometry B)&lt;br /&gt;通过DE-9IM 矩阵判断两个几何对象的关系是否成立 ST_Relate(geometry, geometry, intersectionPatternMatrix)&lt;br /&gt;获得两个几何对象的关系（DE-9IM矩阵） ST_Relate(geometry, geometry)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;几何对象处理函数：&lt;/span&gt;&lt;br /&gt;获取几何对象的中心 ST_Centroid(geometry)&lt;br /&gt;面积量测 ST_Area(geometry)&lt;br /&gt;长度量测 ST_Length(geometry)&lt;br /&gt;返回曲面上的一个点 ST_PointOnSurface(geometry)&lt;br /&gt;获取边界 ST_Boundary(geometry)&lt;br /&gt;获取缓冲后的几何对象 ST_Buffer(geometry, double, [integer])&lt;br /&gt;获取多几何对象的外接对象 ST_ConvexHull(geometry)&lt;br /&gt;获取两个几何对象相交的部分 ST_Intersection(geometry, geometry)&lt;br /&gt;将经度小于0的值加360使所有经度值在0-360间 ST_Shift_Longitude(geometry)&lt;br /&gt;获取两个几何对象不相交的部分（A、B可互换） ST_SymDifference(geometry A, geometry B)&lt;br /&gt;从A去除和B相交的部分后返回 ST_Difference(geometry A, geometry B)&lt;br /&gt;返回两个几何对象的合并结果 ST_Union(geometry, geometry)&lt;br /&gt;返回一系列几何对象的合并结果 ST_Union(geometry set)&lt;br /&gt;用较少的内存和较长的时间完成合并操作，结果和ST_Union相同 ST_MemUnion(geometry set)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;几何对象存取函数：&lt;/span&gt;&lt;br /&gt;获取几何对象的WKT描述 ST_AsText(geometry)&lt;br /&gt;获取几何对象的WKB描述 ST_AsBinary(geometry)&lt;br /&gt;获取几何对象的空间参考ID ST_SRID(geometry)&lt;br /&gt;获取几何对象的维数 ST_Dimension(geometry)&lt;br /&gt;获取几何对象的边界范围 ST_Envelope(geometry)&lt;br /&gt;判断几何对象是否为空 ST_IsEmpty(geometry)&lt;br /&gt;判断几何对象是否不包含特殊点（比如自相交） ST_IsSimple(geometry)&lt;br /&gt;判断几何对象是否闭合 ST_IsClosed(geometry)&lt;br /&gt;判断曲线是否闭合并且不包含特殊点 ST_IsRing(geometry)&lt;br /&gt;获取多几何对象中的对象个数 ST_NumGeometries(geometry)&lt;br /&gt;获取多几何对象中第N个对象 ST_GeometryN(geometry,int)&lt;br /&gt;获取几何对象中的点个数 ST_NumPoints(geometry)&lt;br /&gt;获取几何对象的第N个点 ST_PointN(geometry,integer)&lt;br /&gt;获取多边形的外边缘 ST_ExteriorRing(geometry)&lt;br /&gt;获取多边形内边界个数 ST_NumInteriorRings(geometry)&lt;br /&gt;同上 ST_NumInteriorRing(geometry)&lt;br /&gt;获取多边形的第N个内边界 ST_InteriorRingN(geometry,integer)&lt;br /&gt;获取线的终点 ST_EndPoint(geometry)&lt;br /&gt;获取线的起始点 ST_StartPoint(geometry)&lt;br /&gt;获取几何对象的类型 GeometryType(geometry)&lt;br /&gt;类似上，但是不检查M值，即POINTM对象会被判断为point ST_GeometryType(geometry)&lt;br /&gt;获取点的X坐标 ST_X(geometry)&lt;br /&gt;获取点的Y坐标 ST_Y(geometry)&lt;br /&gt;获取点的Z坐标 ST_Z(geometry)&lt;br /&gt;获取点的M值 ST_M(geometry)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;几何对象构造函数&lt;/span&gt;：&lt;br /&gt;参考语义：&lt;br /&gt;Text：WKT&lt;br /&gt;WKB：WKB&lt;br /&gt;Geom:Geometry&lt;br /&gt;M:Multi&lt;br /&gt;Bd:BuildArea&lt;br /&gt;Coll:Collection ST_GeomFromText(text,[&lt;srid&gt;])&lt;br /&gt;&lt;br /&gt; ST_PointFromText(text,[&lt;srid&gt;])&lt;br /&gt; ST_LineFromText(text,[&lt;srid&gt;])&lt;br /&gt; ST_LinestringFromText(text,[&lt;srid&gt;])&lt;br /&gt; ST_PolyFromText(text,[&lt;srid&gt;])&lt;br /&gt; ST_PolygonFromText(text,[&lt;srid&gt;])&lt;br /&gt; ST_MPointFromText(text,[&lt;srid&gt;])&lt;br /&gt; ST_MLineFromText(text,[&lt;srid&gt;])&lt;br /&gt; ST_MPolyFromText(text,[&lt;srid&gt;])&lt;br /&gt; ST_GeomCollFromText(text,[&lt;srid&gt;])&lt;br /&gt; ST_GeomFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_GeometryFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_PointFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_LineFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_LinestringFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_PolyFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_PolygonFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_MPointFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_MLineFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_MPolyFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_GeomCollFromWKB(bytea,[&lt;srid&gt;])&lt;br /&gt; ST_BdPolyFromText(text WKT, integer SRID)&lt;br /&gt; ST_BdMPolyFromText(text WKT, integer SRID)&lt;br /&gt;&lt;schema_name&gt;&lt;table_name&gt;&lt;schema_name&gt;&lt;table_name&gt;&lt;column_name&gt;&lt;srid&gt;&lt;table_name&gt;&lt;column_name&gt;&lt;x&gt;&lt;y&gt;&lt;z&gt;&lt;m&gt;&lt;x&gt;&lt;y&gt;&lt;m&gt;&lt;ll&gt;&lt;ur&gt;&lt;llb&gt;&lt;urt&gt;&lt;position&gt;&lt;db schema=""&gt;&lt;table&gt;&lt;rowid&gt;&lt;authid&gt;&lt;expires&gt;&lt;authid&gt;&lt;authid&gt;&lt;br /&gt;&lt;/authid&gt;&lt;/authid&gt;&lt;/expires&gt;&lt;/authid&gt;&lt;/rowid&gt;&lt;/table&gt;&lt;/db&gt;&lt;/position&gt;&lt;/urt&gt;&lt;/llb&gt;&lt;/ur&gt;&lt;/ll&gt;&lt;/m&gt;&lt;/y&gt;&lt;/x&gt;&lt;/m&gt;&lt;/z&gt;&lt;/y&gt;&lt;/x&gt;&lt;/column_name&gt;&lt;/table_name&gt;&lt;/srid&gt;&lt;/column_name&gt;&lt;/table_name&gt;&lt;/schema_name&gt;&lt;/table_name&gt;&lt;/schema_name&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/srid&gt;&lt;/column_name&gt;&lt;/table_name&gt;&lt;/schema_name&gt;&lt;/dimension&gt;&lt;/type&gt;&lt;/srid&gt;&lt;/column_name&gt;&lt;/table_name&gt;&lt;/schema_name&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-9219588082140994947?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/9219588082140994947/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=9219588082140994947' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/9219588082140994947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/9219588082140994947'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/postgresqlpostgis-3.html' title='PostgreSQL+PostGIS的使用 3'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-2578504352247985948</id><published>2009-04-24T14:36:00.003+08:00</published><updated>2009-04-24T14:41:28.724+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PostgreSQL/PostGIS'/><title type='text'>PostgreSQL+PostGIS的使用 2</title><content type='html'>&lt;span style="font-weight: bold;"&gt;三、 PostGIS中空间信息处理的实现&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. spatial_ref_sys表&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在基于PostGIS模板创建的数据库的public模式下，有一个spatial_ref_sys表，它存放的是OGC规范的空间参考。我们取我们最熟悉的4326参考看一下：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SfFeUW70fOI/AAAAAAAACXs/eAtoqiNa0oI/s1600-h/2009-4-22+14-07-07.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 269px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SfFeUW70fOI/AAAAAAAACXs/eAtoqiNa0oI/s400/2009-4-22+14-07-07.png" alt="" id="BLOGGER_PHOTO_ID_5328143538002885858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;它的srid存放的就是空间参考的Well-Known ID，对这个空间参考的定义主要包括两个字段，srtext存放的是以字符串描述的空间参考，proj4text存放的则是以字符串描述的PROJ.4 投影定义（PostGIS使用PROJ.4实现投影）。&lt;br /&gt;&lt;br /&gt;4326空间参考的srtext内容：&lt;br /&gt;GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]&lt;br /&gt;&lt;br /&gt;4326空间参考的proj4text内容：&lt;br /&gt;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. geometry_columns表&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;geometry_columns表存放了当前数据库中所有几何字段的信息，比如我当前的库里面有两个空间表，在geometry_columns表中就可以找到这两个空间表中几何字段的定义：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SfFeUtq11AI/AAAAAAAACX0/5CkJuNbRiXU/s1600-h/2009-4-22+14-19-12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 216px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SfFeUtq11AI/AAAAAAAACX0/5CkJuNbRiXU/s400/2009-4-22+14-19-12.png" alt="" id="BLOGGER_PHOTO_ID_5328143544105686018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;其中f_table_schema字段表示的是空间表所在的模式，f_table_name字段表示的是空间表的表名，f_geometry_column字段表示的是该空间表中几何字段的名称，srid字段表示的是该空间表的空间参考。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. 在PostGIS中创建一个空间表&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在PostGIS中创建一个包含几何字段的空间表分为2步：第一步创建一个一般表，第二步给这个表添加几何字段。&lt;br /&gt;&lt;br /&gt;以下先在test模式下创建一个名为cities的一般表：&lt;br /&gt;create table test.cities (id int4, name varchar(20))&lt;br /&gt;&lt;br /&gt;再给cities添加一个名为shape的几何字段（二维点）：&lt;br /&gt;select AddGeometryColumn('test', 'cities', 'shape', 4326, 'POINT', 2)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. PostGIS对几何信息的检查&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PostGIS可以检查几何信息的正确性，这主要是通过IsValid函数实现的。&lt;br /&gt;以下语句分辨检查了2个几何对象的正确性，显然，(0, 0)点和(1,1)点可以构成一条线，但是(0, 0)点和(0, 0)点则不能构成，这个语句执行以后的得出的结果是TRUE,FALSE。&lt;br /&gt;&lt;br /&gt;select IsValid('LINESTRING(0 0, 1 1)'), IsValid('LINESTRING(0 0,0 0)')&lt;br /&gt;默认PostGIS并不会使用IsValid函数检查用户插入的新数据，因为这会消耗较多的CPU资源（特别是复杂的几何对象）。当你需要使用这个功能的时候，你可以使用以下语句为表新建一个约束：&lt;br /&gt;ALTER TABLE cities&lt;br /&gt;ADD CONSTRAINT geometry_valid&lt;br /&gt;CHECK (IsValid(shape))&lt;br /&gt;&lt;br /&gt;这时当我们往这个表试图插入一个错误的空间对象的时候，会得到一个错误：&lt;br /&gt;INSERT INTO test.cities ( shape, name )&lt;br /&gt;VALUES ( GeomFromText('LINESTRING(0 0,0 0)', 4326), '北京');&lt;br /&gt;&lt;br /&gt;ERROR: new row for relation "cities" violates check constraint "geometry_valid"&lt;br /&gt;SQL 状态: 23514&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. PostGIS中的空间索引&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;数据库对多维数据的存取有两种索引方案，R-Tree和GiST（Generalized Search Tree），在PostgreSQL中的GiST比R-Tree的健壮性更好，因此PostGIS对空间数据的索引一般采用GiST实现。&lt;br /&gt;&lt;br /&gt;以下的语句给sde模式中的cities表添加了一个空间索引shape_index_cities，在pgAdmin中也可以通过图形界面完成相同的功能。&lt;br /&gt;CREATE INDEX shape_index_cities&lt;br /&gt;ON sde.cities&lt;br /&gt;USING gist&lt;br /&gt;(shape);&lt;br /&gt;&lt;br /&gt;另外要注意的是，空间索引只有在进行基于边界范围的查询时才起作用，比如“&amp;amp;&amp;amp;”操作。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-2578504352247985948?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/2578504352247985948/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=2578504352247985948' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2578504352247985948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2578504352247985948'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/postgresqlpostgis-2.html' title='PostgreSQL+PostGIS的使用 2'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__ZvvWze6o0c/SfFeUW70fOI/AAAAAAAACXs/eAtoqiNa0oI/s72-c/2009-4-22+14-07-07.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-670406806005718675</id><published>2009-04-24T14:35:00.000+08:00</published><updated>2009-04-24T14:36:42.140+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PostgreSQL/PostGIS'/><title type='text'>PostgreSQL+PostGIS的使用 1</title><content type='html'>&lt;span style="font-weight: bold;"&gt;二、 PostGIS中的几何类型&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PostGIS支持所有OGC规范的“Simple Features”类型，同时在此基础上扩展了对3DZ、3DM、4D坐标的支持。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. OGC的WKB和WKT格式&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;OGC定义了两种描述几何对象的格式，分别是WKB（Well-Known Binary）和WKT（Well-Known Text）。&lt;br /&gt;&lt;br /&gt;在SQL语句中，用以下的方式可以使用WKT格式定义几何对象：&lt;br /&gt;POINT(0 0) ——点&lt;br /&gt;LINESTRING(0 0,1 1,1 2)  ——线&lt;br /&gt;POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)) ——面&lt;br /&gt;MULTIPOINT(0 0,1 2) ——多点&lt;br /&gt;MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))  ——多线&lt;br /&gt;MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1))) ——多面&lt;br /&gt;GEOMETRYCOLLECTION(POINT(2 3),LINESTRING((2 3,3 4))) ——几何集合&lt;br /&gt;&lt;br /&gt;以下语句可以使用WKT格式插入一个点要素到一个表中，其中用到的GeomFromText等函数在后面会有详细介绍：&lt;br /&gt;INSERT INTO table ( SHAPE, NAME )&lt;br /&gt; VALUES ( GeomFromText('POINT(116.39 39.9)', 4326), '北京');&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. EWKT、EWKB和Canonical格式&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;EWKT和EWKB相比OGC WKT和WKB格式主要的扩展有3DZ、3DM、4D坐标和内嵌空间参考支持。&lt;br /&gt;&lt;br /&gt;以下以EWKT语句定义了一些几何对象：&lt;br /&gt;POINT(0 0 0) ——3D点&lt;br /&gt;SRID=32632;POINT(0 0)  ——内嵌空间参考的点&lt;br /&gt;POINTM(0 0 0) ——带M值的点&lt;br /&gt;POINT(0 0 0 0)  ——带M值的3D点&lt;br /&gt;SRID=4326;MULTIPOINTM(0 0 0,1 2 1)  ——内嵌空间参考的带M值的多点&lt;br /&gt;&lt;br /&gt;以下语句可以使用EWKT格式插入一个点要素到一个表中：&lt;br /&gt;INSERT INTO table ( SHAPE, NAME )&lt;br /&gt; VALUES ( GeomFromEWKT('SRID=4326;POINTM(116.39 39.9 10)'), '北京' )&lt;br /&gt;&lt;br /&gt;Canonical格式是16进制编码的几何对象，直接用SQL语句查询出来的就是这种格式。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. SQL-MM格式&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL-MM格式定义了一些插值曲线，这些插值曲线和EWKT有点类似，也支持3DZ、3DM、4D坐标，但是不支持嵌入空间参考。&lt;br /&gt;&lt;br /&gt;以下以SQL-MM语句定义了一些插值几何对象：&lt;br /&gt;CIRCULARSTRING(0 0, 1 1, 1 0) ——插值圆弧&lt;br /&gt;COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1)) ——插值复合曲线&lt;br /&gt;CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)) ——曲线多边形&lt;br /&gt;MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4)) ——多曲线&lt;br /&gt;MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10, 10 10),(11 11, 11.5 11, 11 11.5, 11 11)))  ——多曲面&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-670406806005718675?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/670406806005718675/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=670406806005718675' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/670406806005718675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/670406806005718675'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/postgresqlpostgis-1.html' title='PostgreSQL+PostGIS的使用 1'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4214822943617040282</id><published>2009-04-24T14:33:00.000+08:00</published><updated>2009-04-24T14:35:20.864+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PostgreSQL/PostGIS'/><title type='text'>PostgreSQL+PostGIS的使用 0</title><content type='html'>&lt;span style="font-weight: bold;"&gt;一、 PostgreSQL与PostGIS的关系&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PostgreSQL是世界上技术最先进的开源数据库，其前身是1977年一个源于Berkeley名为Ingres的非关系型数据库，其项目领导人为Michael Stonebraker教授。1982年该教授商业化了Ingres；1985年，Michael Stonebraker教授回到Berkeley，开始对新的数据库设计进行研究，并于次年在美国防务高级研究项目局（DARPA）、陆军研究办公室（ARO）、国家科学基金（NSF）以及ESL, Inc等机构的赞助下启动了Postgres（Post-Ingres）项目。&lt;br /&gt;&lt;br /&gt;Postgres在1987年形成第一个Demo，1989年发布第一个版本，直到1993年的4.2版本，由于外部用户过多，做技术支持和维护源代码的时间影响到了对数据库的研究，因此Berkeley中止了该项目。在此期间，Postgres项目就已经被使用在了一些GIS系统中。&lt;br /&gt;&lt;br /&gt;Postgres项目并未就此消亡，在1994年两个Berkeley的研究生向Postgres中加入了SQL语言解释器，将之改名为Postgre95并发布到了互联网上。经过一些黑客的修改，1996年Postgres95再次更名为PostgreSQL，并采用BSD许可证发布了第一个开源版本。经过多年发展，PostgreSQL已经发展成为一个技术非常先进的开源数据库，其支持特性之多性能之强可与诸多高级商业数据库比肩。&lt;br /&gt;&lt;br /&gt;这里提供了一个世界上主流数据库的特性比较，有兴趣的可以从中管窥PostgreSQL在数据库领域中的成就。&lt;br /&gt;http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems&lt;br /&gt;&lt;br /&gt;PostGIS则是PostgreSQL的一个扩展，目的是使PostgreSQL支持空间数据的存储和使用，其本质类似于ArcSDE和Oracle Spatial Extension。PostGIS是采用GPL许可发布的，完整地实现了OGC的《Simple Features Specification for SQL》规范，并于2006年获得OGC认证。在此基础上，PostGIS还对规范进行了一些扩展，在后面的特性中我们可以慢慢了解到。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4214822943617040282?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4214822943617040282/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4214822943617040282' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4214822943617040282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4214822943617040282'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/postgresqlpostgis-0.html' title='PostgreSQL+PostGIS的使用 0'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8267372272631167302</id><published>2009-04-22T09:58:00.003+08:00</published><updated>2009-04-22T10:05:43.639+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SDE'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><category scheme='http://www.blogger.com/atom/ns#' term='PostgreSQL/PostGIS'/><title type='text'>SDE与PostGIS的集成</title><content type='html'>PostgreSQL：http://www.postgresql.org/&lt;br /&gt;PostGIS：http://postgis.refractions.net/&lt;br /&gt;PostGIS Manual：http://postgis.refractions.net/documentation/manual-1.3/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;安装PostgreSQL&lt;/span&gt;&lt;br /&gt;这里没有使用SDE自带的PostgreSQL，而是独立的PostgreSQL 8.3.6.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;安装PostGIS扩展&lt;/span&gt;&lt;br /&gt;可以通过PostgreSQL的Application Stack Builder安装，或者下载独立安装包。这里下载了PostGIS 1.3.5安装包进行安装。&lt;br /&gt;&lt;br /&gt;这个版本在安装PostGIS的时候会提示错误，原因是PostgreSQL锁住了这个文件，因此先停掉PostgreSQL，但安装完成后必然造成初始化PostGIS数据库失败，可以在PostgreSQL启动后再运行一次PostGIS安装程序，再见到这个错误的时候忽略。&lt;br /&gt;&lt;br /&gt;这时通过pgAdmin连接到数据库，可以看到PostGIS创建了相关的数据库。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;安装ArcSDE for PostgreSQL&lt;/span&gt;&lt;br /&gt;在安装ArcSDE for PostgreSQL之前，首先新建一个基于PostGIS模板的数据库用于ArcSDE。注意，使用sde角色需要有管理员权限并可创建数据库对象。&lt;br /&gt;&lt;br /&gt;然后安装ArcSDE相关程序文件，接着运行Post Installation。&lt;br /&gt;&lt;br /&gt;我们希望SDE在保存数据的时候使用PG_GEOMETRY格式保存空间数据，而不是默认的ST_GEOMETRY，因为使用PG_GEOMETRY格式可以使用PostGIS的功能。这里需要自定义“dbtune.sde”文件 。将这个文件备份后，修改以下这段：&lt;br /&gt;GEOMETRY_STORAGE       "ST_GEOMETRY"&lt;br /&gt;为：&lt;br /&gt;GEOMETRY_STORAGE       "PG_GEOMETRY"&lt;br /&gt;然后，选择这个修改过的“dbtune.sde”文件。&lt;br /&gt;&lt;br /&gt;以下与其它ArcSDE Post Installation类似。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;测试SDE图层使用PostGIS功能&lt;/span&gt;&lt;br /&gt;在ArcCatalog中新建到ArcSDE的连接：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/Se56w-wY9LI/AAAAAAAACXM/BdYx-lyK2Ys/s1600-h/2009-4-22+9-42-30.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 370px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/Se56w-wY9LI/AAAAAAAACXM/BdYx-lyK2Ys/s400/2009-4-22+9-42-30.png" alt="" id="BLOGGER_PHOTO_ID_5327330391124145330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;然后使用ArcCatalog导入若干Feature Class到SDE，这里使用了Sample的World中的cities等图层进行测试：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/Se56w4U5k6I/AAAAAAAACXU/lCCTmd2Z3fY/s1600-h/2009-4-22+9-44-46.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 232px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/Se56w4U5k6I/AAAAAAAACXU/lCCTmd2Z3fY/s400/2009-4-22+9-44-46.png" alt="" id="BLOGGER_PHOTO_ID_5327330389398229922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;打开pgAdmin，刷新sde数据库中的sde模式，查询cities表：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/Se56xBF-tCI/AAAAAAAACXc/l0IODeZTk_c/s1600-h/2009-4-22+9-46-59.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/Se56xBF-tCI/AAAAAAAACXc/l0IODeZTk_c/s400/2009-4-22+9-46-59.png" alt="" id="BLOGGER_PHOTO_ID_5327330391751570466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;下面测试一下不通过ArcSDE直接对这个表进行PostGIS空间查询。打开SQL命令窗口，测试使用如下SQL：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;SELECT * &lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;FROM cities &lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;WHERE ST_Distance(shape, GeomFromText('POINT(116.39 39.9)', 4326))&amp;lt;10 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;以上空间查询SQL代表查找在4326空间参考下，与点(116.39, 39.9)【北京附近】距离10以内的所有城市，查询结果如下，总共29条记录：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/Se56xMben1I/AAAAAAAACXk/8G__8DL5DyY/s1600-h/2009-4-22+9-55-19.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 118px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/Se56xMben1I/AAAAAAAACXk/8G__8DL5DyY/s400/2009-4-22+9-55-19.png" alt="" id="BLOGGER_PHOTO_ID_5327330394794532690" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8267372272631167302?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8267372272631167302/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8267372272631167302' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8267372272631167302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8267372272631167302'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/sdepostgis.html' title='SDE与PostGIS的集成'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__ZvvWze6o0c/Se56w-wY9LI/AAAAAAAACXM/BdYx-lyK2Ys/s72-c/2009-4-22+9-42-30.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-2458847562891760083</id><published>2009-04-21T15:13:00.003+08:00</published><updated>2009-04-21T16:05:35.696+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 16</title><content type='html'>&lt;span style="font-weight: bold;"&gt;三 WebContext的refresh方法&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;提示：本小节内容是ADF内部实现机制，对ADF的使用没有影响，如没有兴趣可以跳过。&lt;br /&gt;&lt;br /&gt;当调用WebContext的refresh方法的时候， ADF会同步WebContext中所有相关属性。比如当我改变了WebMap的视图范围，然后再调用WebContext的refresh方法，那么ADF会通知WebContext中的WebOverview等对象去同步相关信息，比如同步改变视图范围等。以上过程ADF在后台是通过Observer机制实现的。当ADF调用WebContext的refresh方法时，ADF会通知所有注册到WebContext的WebContextObserver 对象，调用其update方法。实现WebContextObserver这个接口的大概有如下这些类：AWSTocFunctionality, ExtentHistory, MapToolsTask, PrintTask, RoutingTask, SearchAttributesTask, WebMap, WebOverview, WebScaleBar。&lt;br /&gt;&lt;br /&gt;以上对WebContext的刷新都是在服务器端。但是，当一个Command被点击以后，服务器端的更新又是怎么被输出到浏览器端的呢？下面就让我们从浏览器端开始，详细地了解一下Command的工作原理。&lt;br /&gt;&lt;br /&gt;以下是上一节的案例中用a:command标签在JSF页面中定义了一个Command，在下面我们看一下这段标签在浏览器中相应的输出：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/Se1ykW5UyPI/AAAAAAAACXE/BT5vsJgOwtI/s1600-h/2009-4-21+15-15-04.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 132px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/Se1ykW5UyPI/AAAAAAAACXE/BT5vsJgOwtI/s400/2009-4-21+15-15-04.png" alt="" id="BLOGGER_PHOTO_ID_5327039903196039410" border="0" /&gt;&lt;/a&gt;&lt;a:command id="zoomIn" defaultimage="images/tasks/maptools/zoomin.png" hoverimage="images/tasks/maptools/zoominU.png" selectedimage="images/tasks/maptools/zoominD.png" clientpostback="true"&gt;&lt;f:actionlistener type="wuyf.ZoomInListener"&gt;&lt;/f:actionlistener&gt;&lt;br /&gt;以下是上面的标签在浏览器中的输出：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var zoomIn = new EsriMapServerAction("zoomIn", "");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;zoomIn.clientPostBack = true;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;zoomIn.defaultImage = "/AgsDemo/images/tasks/maptools/zoomin.png";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;zoomIn.hoverImage = "/AgsDemo/images/tasks/maptools/zoominU.png";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;zoomIn.selectedImage = "/AgsDemo/images/tasks/maptools/zoominD.png";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;zoomIn.isDisabled = false;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;zoomIn.showLoading = true;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;toolbar.addToolItem(zoomIn);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;可见，一个Command对应输出的是EsriMapServerAction这个JavaScript对象，这个对象在“/WebContent/js/esri_map.js”中定义。打开EsriMapServerAction的定义你会发现，当点击这个Command的时候，ADF会提交当前页面；当然，由于我们设置了clientPostBack属性为TRUE，因此交互通过AJAX方式进行，其回调函数为EsriControls的processPostBack函数——EsriControls在“/WebContent/js/esri_core.js”中定义，它包含了所有的ADF客户端组件。&lt;br /&gt;&lt;br /&gt;提示：以上这段这里说的很简单，其实包含很多的内容，有兴趣的话可以在这几个JavaScript脚本中仔细研究相关对象和调用关系。&lt;br /&gt;&lt;br /&gt;ADF在服务器端会有一个PostBackPhaseListener 去监听所有的AJAX请求，有兴趣的话你可以解开“/WebContent/WEB-INF/lib/arcgis_webcontrols.jar”这个库文件，在其中的“META-INF”目录下有一个“faces-config.xml”中定义了这个PhaseListener。&lt;br /&gt;&lt;br /&gt;AJAX请求的参数中会有一个“doPostBack”值，当一个AJAX请求发到服务器的时候，PostBackPhaseListener会监听到这个请求并找到“doPostBack”这个值从而执行后续的操作。当这些操作完成以后，PostBackPhaseListener通过AJAXUtil 的writeResponse方法输出AJAX响应到请求的浏览器。&lt;br /&gt;&lt;/a:command&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-2458847562891760083?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/2458847562891760083/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=2458847562891760083' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2458847562891760083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/2458847562891760083'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-16.html' title='ArcGIS Server Java ADF 案例教程 16'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__ZvvWze6o0c/Se1ykW5UyPI/AAAAAAAACXE/BT5vsJgOwtI/s72-c/2009-4-21+15-15-04.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-6445499288196044546</id><published>2009-04-20T16:18:00.002+08:00</published><updated>2009-04-20T16:21:01.367+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 15</title><content type='html'>&lt;span style="font-weight: bold;"&gt;二 【案例】自定义Command使地图等比放大&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在这一小节，我们通过自定义Command定制一个按钮，这个按钮每点击一次，地图会放大1倍。通过这个简单案例，让我们来熟悉一下Command的用法。&lt;br /&gt;&lt;br /&gt;实现这个功能的主要环节是实现自己的监听器类，以下是这个类的定义：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import com.esri.adf.web.data.WebContext;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import com.esri.adf.web.util.WebUtil;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import javax.faces.event.AbortProcessingException;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import javax.faces.event.ActionEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import javax.faces.event.ActionListener;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class ZoomInListener implements ActionListener&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    public static double ZOOM_FACTOR = 0.5;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    public void processAction(ActionEvent event) throws AbortProcessingException&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        WebContext webContext = WebUtil.getWebContext(event.getComponent());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        webContext.getWebMap().getCurrentExtent().expand(ZOOM_FACTOR);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        webContext.refresh();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;当然，在JSF页面中的用法和上面类似，也很简单：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SewwREsey6I/AAAAAAAACW8/x02bPaYBzMs/s1600-h/2009-4-20+16-19-52.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 133px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SewwREsey6I/AAAAAAAACW8/x02bPaYBzMs/s400/2009-4-20+16-19-52.png" alt="" id="BLOGGER_PHOTO_ID_5326685529148672930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;这个ZoomInListener监听器类主要需要实现了ActionListener的processAction方法，当用户点击这个id为“zoomIn”的Command的时候，这个监听器会被触发，然后其processAction方法就会被执行。&lt;br /&gt;&lt;br /&gt;在这个processAction方法中，我们首先获得WebContext对象，通过WebContext我们就可以获得WebMap对象，进而对它的currentExtent属性进行操作（地图范围缩小1倍），再刷新WebContext对象。这个过程很简单，中间有两个环节这里稍作解释。&lt;br /&gt;&lt;br /&gt;一个环节是如何获得WebContext对象。processAction是JSF的ActionListener接口的一个方法，这个方法的参数是ActionEvent ，因此它的属性与ADF基本没有关系，所以，获得WebContext就需要用到ADF的WebUtil工具类，ESRI的工程师为了可以在各种环境下获得WebContext这个ADF中非常重要的环境，制造了WebUtil这个工具类及其getWebContext方法，通过这个方法我们可以很方便地获得WebContext对象。&lt;br /&gt;&lt;br /&gt;另外一个环节就是WebContext对象的refresh方法，我们在对服务器端的WebMap对象进行一些操作以后，调用了WebContext的refresh方法以后，浏览器中的地图就会刷新成新的视图，其相关的TOC、Overview等组件也会跟着刷新，这很奇妙吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-6445499288196044546?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/6445499288196044546/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=6445499288196044546' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6445499288196044546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/6445499288196044546'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-15.html' title='ArcGIS Server Java ADF 案例教程 15'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__ZvvWze6o0c/SewwREsey6I/AAAAAAAACW8/x02bPaYBzMs/s72-c/2009-4-20+16-19-52.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4455289924279862766</id><published>2009-04-20T16:11:00.004+08:00</published><updated>2009-04-27T16:52:59.084+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 14</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Command、Tool和Button&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这一章我们将讨论的主要对象是Toolbar的孩子们和亲戚，涉及到两个孩子：Command和Tool，还有一个亲戚：Button。它们是基于ADF对WebGIS功能进行扩展的第一步，它可以让你在地图工具条中加入若干自定义的按钮来执行特定的功能。&lt;br /&gt;&lt;br /&gt;在第三章中我们把Toolbar列为ADF常用组件之一，但是它和Map、TOC、Overview等其它组件是有区别的，我们打开“context-attributes.xml”配置文件可以发现，Map、TOC、Overview等组件都有相应的JavaBean定义，但是Toolbar没有——因为它不需要在服务器端绑定一个“WebToolbar”对象来记录Toolbar的状态信息。&lt;br /&gt;&lt;br /&gt;下面让我们分别来看看这些组件的用法吧。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;一 Command&lt;/span&gt;&lt;br /&gt;Command在Toolbar中表现为一个按钮，当用户点击这个按钮以后，ADF将会立即执行一些操作。点击Command相当于直接给ADF一个命令，它并不改变当前地图的状态，比如当前地图正在进行漫游，点击Command以后再对地图进行操作时它还是漫游状态。&lt;br /&gt;&lt;br /&gt;最典型的Command比如“地图全图”功能，当用户点击以后，当前地图会缩放到全图显示。下面的代码定义了这样一个Command。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SewvnCOIu1I/AAAAAAAACWk/Gi1Vapljc2s/s1600-h/2009-4-20+16-14-52.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 112px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SewvnCOIu1I/AAAAAAAACWk/Gi1Vapljc2s/s400/2009-4-20+16-14-52.png" alt="" id="BLOGGER_PHOTO_ID_5326684806930021202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;从这段代码我们可以看到，Command的最关键的用法在于定义其子元素“f:actionListener”，它的“type”属性指向一个实现了某些功能的监听器类（注意，并不是对象）。这里的“ZoomFullExtentListener”是ADF自带的监听器；当然，这个类也可以是任何实现了ActionListener 接口的类，我们在后面的案例会实现我们自己的监听器类。&lt;br /&gt;&lt;br /&gt;下面我们再来看两个稍微有点不同的Command定义。这两个Command的功能是提供两个按钮“后退”、“前进”，当点击“后退”时地图会返回到上一视图范围；当点击“前进”时地图会前进到后一视图范围。下面的代码定义了这样两个Command。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SewvnETORMI/AAAAAAAACWs/YtIxpVQtsCY/s1600-h/2009-4-20+16-15-27.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 301px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SewvnETORMI/AAAAAAAACWs/YtIxpVQtsCY/s400/2009-4-20+16-15-27.png" alt="" id="BLOGGER_PHOTO_ID_5326684807488226498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;这里并没有使用监听器，而是使用了Command的action属性。这个属性将绑定一个服务器端对象的方法，当点击这个Command的时候，ADF会去调用这个服务器端方法。“后退”、“前进”的功能主要使用了ADF中的ExtentHistory 对象，它可以维护地图的视图范围历史记录。下面它是在“context-attributes.xml”中的定义：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/Sewvnd6KB8I/AAAAAAAACW0/tbcXDsd3Brk/s1600-h/2009-4-20+16-15-50.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 62px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/Sewvnd6KB8I/AAAAAAAACW0/tbcXDsd3Brk/s400/2009-4-20+16-15-50.png" alt="" id="BLOGGER_PHOTO_ID_5326684814362412994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;当我们点击“后退”按钮的时候，ADF会调用这个服务器端“history”对象的doPrevious方法，因此地图会切换到上一视图；点击“前进”也是类似。另外，这两个Command的disabled属性分别绑定到“history”对象的canUndo和canRedo属性，这也很好理解，当地图已经是最新的视图的时候，用户当然应该不可以点击“前进”这个按钮，此时“history”的canRedo属性值为TRUE，因此“前进”这个按钮会呈现不可用的状态。&lt;br /&gt;&lt;br /&gt;稍微总结一下，上面主要介绍了Command的两种定义用法，一种定义监听器类作为Command的子元素；另外一种绑定服务器端方法到Command的action属性。对于自定义Command来说，一般使用监听器会比较容易一些。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4455289924279862766?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4455289924279862766/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4455289924279862766' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4455289924279862766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4455289924279862766'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-14.html' title='ArcGIS Server Java ADF 案例教程 14'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__ZvvWze6o0c/SewvnCOIu1I/AAAAAAAACWk/Gi1Vapljc2s/s72-c/2009-4-20+16-14-52.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5129473729245428617</id><published>2009-04-17T23:29:00.006+08:00</published><updated>2009-04-18T00:03:43.458+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>基于PHP的Flex Socket安全策略设置</title><content type='html'>Flex打开Socket连接前会按几个步骤检查安全策略配置，如不成功将报安全沙箱错误。最先检查的就是目标主机的843端口是否提供了安全策略配置，因此在843端口监听Socket请求并输出安全策略配置是最直接的解决Flex Socket连接沙箱错误的办法。&lt;br /&gt;&lt;br /&gt;如下PHP代码在服务器端被执行以后将会完成上述工作：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SeioSJnT7oI/AAAAAAAACWc/T8u7n-dSpyU/s1600-h/2009-4-18+0-02-20.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 130px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SeioSJnT7oI/AAAAAAAACWc/T8u7n-dSpyU/s400/2009-4-18+0-02-20.png" alt="" id="BLOGGER_PHOTO_ID_5325691589137526402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;在Window中，在控制台中执行“telnet localhost 843”命令后如果可以输出安全策略文件，表明设置成功。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5129473729245428617?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5129473729245428617/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5129473729245428617' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5129473729245428617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5129473729245428617'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/flex.html' title='基于PHP的Flex Socket安全策略设置'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__ZvvWze6o0c/SeioSJnT7oI/AAAAAAAACWc/T8u7n-dSpyU/s72-c/2009-4-18+0-02-20.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8276631625201783966</id><published>2009-04-17T15:59:00.005+08:00</published><updated>2009-04-17T18:35:23.786+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='其它'/><title type='text'>B/S架构中的数据推送技术</title><content type='html'>B/S架构中服务器向浏览器推送数据在很多场合都有需求，比如实时的监控报警、实时的调度，等等。凡是对实时性要求越高的场景，越是需要服务器及时、准确地向浏览器推送数据。这里我们就讨论一下在B/S架构下，可以实现从服务器向浏览器推送数据的几种技术及其相应的特点。&lt;br /&gt;&lt;br /&gt;基于HTTP协议&lt;br /&gt;&lt;br /&gt;1. HTTP协议的特点&lt;br /&gt;&lt;br /&gt;纯的HTTP协议在本质上是无状态、无连接的，它基于请求/响应的工作模式，使得浏览器在每次发生请求的时候和服务器建立连接，当接收到响应的时候断开连接；在这种情况下，要让服务器主动向浏览器发送数据是不可能的。&lt;br /&gt;&lt;br /&gt;技术总是为需求服务的，在很多浏览器需要及时获取服务器数据更新的需要下，技术人员们变通地发明了一些基于HTTP协议的“伪”长连接技术，实现了服务器数据向浏览器的“准”推送。&lt;br /&gt;&lt;br /&gt;2. 定时刷新&lt;br /&gt;&lt;br /&gt;定时刷新是最粗糙的实现快速感知服务器数据变化的方法，原理就是不停地刷新页面从而显示最新的服务器端数据。定时刷新从技术上大体有两种实现方法：一是通过HTML的META标签设置页面刷新间隔，比如以下的标签会在浏览器中每隔10秒刷新当前页面：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;meta equiv="refresh" content="10" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这种方式会看到页面有明显的刷新，用户体验会比较差；与此相对应的另外一种方式就是AJAX，在JavaScript脚本中添加一个定时器，每隔一定时间向服务器发送一个AJAX请求，得到响应以后去更新页面的内容。以下JavaScript代码会每隔10秒发送一个AJAX请求去更新当前页面的部分内容：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;setInterval(function(){sendAJAXRequest()},10000);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;如图 1是定时刷新的模型图：&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SehZEFiSSWI/AAAAAAAACV0/M4h87SVTxns/s1600-h/2009-4-17+16-02-17.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 199px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SehZEFiSSWI/AAAAAAAACV0/M4h87SVTxns/s400/2009-4-17+16-02-17.png" alt="" id="BLOGGER_PHOTO_ID_5325604486105942370" border="0" /&gt;&lt;/a&gt;图 1  定时刷新的模型图&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;定时刷新这种模式相当于一个下级每隔一段时间打电话给上级，请示当前指示。当然，如果在这个时间段内发生了一些情况，他们之间是没办法沟通的，所以信息并不是“实时”的；另外，刷新间隔到底设置多少合适也是个问题，服务器的负担也比较大。&lt;br /&gt;&lt;br /&gt;3. 轮询&lt;br /&gt;轮询也是通过AJAX进行的，它与AJAX定时刷新的区别仅在于接收到AJAX响应以后的工作。定时刷新完全是浏览器主动的，在浏览器和服务器之间存在一定的断开间隔；而轮询这种方式会在AJAX响应中再次发送AJAX请求，也就是说当响应结束，浏览器和服务器之间一旦断开连接的时候，浏览器会再次发送请求建立连接。&lt;br /&gt;&lt;br /&gt;如图 2是轮询的模型图：&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SehZEbVzj0I/AAAAAAAACV8/Dkp_rbzmsKM/s1600-h/2009-4-17+16-02-34.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 196px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SehZEbVzj0I/AAAAAAAACV8/Dkp_rbzmsKM/s400/2009-4-17+16-02-34.png" alt="" id="BLOGGER_PHOTO_ID_5325604491959177026" border="0" /&gt;&lt;/a&gt;图 2  轮询的模型图&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;轮询这种模式相当于一个下级不停给上级打电话请示，上级指示下达以后挂了电话，下级可能去执行指示或者不执行，但是随即下级将再次给上级打电话继续请示。这种模式可以保证数据更新比较实时，但是服务器负担也是一个问题。&lt;br /&gt;&lt;br /&gt;顺便提一下，轮询这种模式一般会在浏览器的XMLHttpRequest的readyState为4（响应数据传输结束）的时候调用回调函数，此时连接已经关闭；但是在Firefox中支持Streaming AJAX模式，也就是XMLHttpRequest的readyState为3（响应数据仍在传输）的时候调用回调函数，此时连接尚未关闭。&lt;br /&gt;&lt;br /&gt;4. 基于iframe的流模式&lt;br /&gt;&lt;br /&gt;iframe可以在当前页面中嵌入一个文档页面，如果把这个页面设为隐藏，并将其src属性设置为一个特殊的请求，数据将会源源不断地从服务器发送到浏览器。&lt;br /&gt;&lt;br /&gt;比如以下的JSP页面，它将每隔10秒更新一个数输出到浏览器，不出意外它将会永远执行下去，浏览器和服务器之间的连接也永远不会关闭：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;%   int i = 1;      try {       while (true) {    out.print("&lt;/span&gt;&lt;/span&gt;&lt;p style="color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:85%;"&gt;"+(i++)+"&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   out.flush();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    Thread.sleep(10000);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   } catch (InterruptedException e) {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;} catch (Exception e) {}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;但是这样做有个很显然的不足，由于响应始终没有结束，因此浏览器里面的加载进度条会始终显示加载没有完成。当然，这也并不是没有办法解决，比如http://www.zeitoun.net/articles/comet_and_php/start就提供了IE、Opera、WebKit核心（Chrome/Safari）、Gecko核心（Firefox）等浏览器的解决方案。&lt;br /&gt;&lt;br /&gt;如图 3是基于iframe流模式的模型图：&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SehZShdUWII/AAAAAAAACWE/hrHgpNb5-To/s1600-h/2009-4-17+16-02-55.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 196px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SehZShdUWII/AAAAAAAACWE/hrHgpNb5-To/s400/2009-4-17+16-02-55.png" alt="" id="BLOGGER_PHOTO_ID_5325604734119467138" border="0" /&gt;&lt;/a&gt;图 3  基于iframe流模式的模型图&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;基于iframe的流模式相当于一个下级给上级打电话，上级不停发出指示，下级一边接收指示、一边执行。这种模式有着比较好的实时性，比如Gmail就是采用这种模式。&lt;br /&gt;&lt;br /&gt;5. 开源框架Pushlets&lt;br /&gt;Pushlets是一个实现了AJAX轮询和iframe流模式的开源框架（Java+JavaScript），对此有兴趣的可以参考：http://www.pushlets.com/，Pushlets采用LGPL许可。&lt;br /&gt;&lt;br /&gt;基于消息&lt;br /&gt;&lt;br /&gt;1. 基于消息的架构&lt;br /&gt;&lt;br /&gt;使用消息可以实现松散耦合的分布式数据通讯。通过消息从服务器向浏览器推送数据一般需要一个消息中间件（Message Oriented Middleware，MOM），服务器将数据推送给消息中间件，消息中间件再将数据以消息的方式推送给浏览器。基于消息的架构有个特别大的优点，那就是不但可以实现服务器向单浏览器、服务器向多浏览器推送数据；还支持浏览器到浏览器之间的数据推送。这将会在预警、调度等场合有非常大的用武之地。&lt;br /&gt;&lt;br /&gt;图 4和图 5分别是基于订阅/发布模式和点到点模式的消息传递示意。在B/S架构中，服务器可以发布消息，所有订阅该主题的浏览器都会接受到该消息，这就实现了从服务器向多浏览器的数据推送；浏览器或者服务器也可以向特定的对象发送消息，消息将在一个消息队列中被发送，对方浏览器就可以收到该消息，这就实现了服务器向某特定浏览器或者浏览器之间的数据推送。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SehZSiVxuBI/AAAAAAAACWM/ENsvRJmqwk0/s1600-h/2009-4-17+16-03-13.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 274px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SehZSiVxuBI/AAAAAAAACWM/ENsvRJmqwk0/s400/2009-4-17+16-03-13.png" alt="" id="BLOGGER_PHOTO_ID_5325604734356273170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;2. Java消息服务（JMS）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;JMS是一组公开的Java API，它定义了与消息相关的接口和语义，目前JMS已经成为J2EE中的重要组成部分。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SehZSg02mDI/AAAAAAAACWU/XkzH1ysTk2E/s1600-h/2009-4-17+16-03-26.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 204px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SehZSg02mDI/AAAAAAAACWU/XkzH1ysTk2E/s400/2009-4-17+16-03-26.png" alt="" id="BLOGGER_PHOTO_ID_5325604733949745202" border="0" /&gt;&lt;/a&gt;图 6  JMS工作原理&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;如图 6是JMS工作原理。当有客户端连接到JMS服务器的时候，JMS的连接工厂会根据连接类型来创建一个虚拟连接，这个连接会具体负责消息的传递；在这个连接建立完成后，会产生一个会话，会话中保存了消息生产者或消息消费者的信息；消息的消费者会对感兴趣的消息目的地（队列或主题）建立一个监听，消息的生产者则负责把消息发送到这个目的地上。&lt;br /&gt;&lt;br /&gt;另外JMS还有一些值得一提的特点，比如支持事务性会话、可以设置消息的持久性、设置消息的优先级、允许消息过期、可以构建长期订阅等。这些特性在各种企业级应用环境下都有可能提高应用的功能或性能。&lt;br /&gt;&lt;br /&gt;实现JMS的商业中间件有IBM MQSeries、BEA WebLogic JMS等；开源中间件有OpenJMS、Apache ActiveMQ等。&lt;br /&gt;&lt;br /&gt;3. ActiveMQ&lt;br /&gt;&lt;br /&gt;ActiveMQ是Apache基金会的著名开源项目，目前Release版本5.2完整支持JMS1.1和J2EE 1.4规范。ActiveMQ采用Apache 2.0许可发布。ActiveMQ的优势在于其支持集群部署、支持多种应用层协议和诸多客户端开发语言等特点。&lt;br /&gt;&lt;br /&gt;ActiveMQ主要支持以下协议：&lt;br /&gt; OpenWire&lt;br /&gt; REST&lt;br /&gt; Stomp&lt;br /&gt; WS Notification&lt;br /&gt; XMPP&lt;br /&gt; AMQP&lt;br /&gt;&lt;br /&gt;下面这里将使用ActiveMQ和Stomp协议来演示各种方式的数据的推送。&lt;br /&gt;&lt;br /&gt;4. Stomp协议&lt;br /&gt;&lt;br /&gt;Stomp是一种简单、实现容易的协议，因此支持非常广泛，这里采用Stomp协议的主要原因也是因为其支持的客户端开发语言最多，在各种环境下都有用武之地。这些开发语言主要包括：&lt;br /&gt; ActionScript 3&lt;br /&gt; C&lt;br /&gt; C++&lt;br /&gt; .Net&lt;br /&gt; Delphi&lt;br /&gt; Perl&lt;br /&gt; PHP&lt;br /&gt; Python&lt;br /&gt; Ruby&lt;br /&gt;&lt;br /&gt;下面主要用到了ActionScript和.Net语言。&lt;br /&gt;&lt;br /&gt;5. 发布/订阅模式的实现&lt;br /&gt;&lt;br /&gt;发布/订阅模式适用于广播性质的数据推送。比如在实时监控系统中，当我们的指令中心需要向所有监控目标发送信息的时候，这种模式就比较适合。为了简单起见，这里的服务器端和浏览器端都使用了ActionScript实现。&lt;br /&gt;&lt;br /&gt;在浏览器端，我们需要订阅服务器主题。比如所有的接收指令的目标都需要监听“Alarm”频道，那么在浏览器中的代码应该如下：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;private function sub():void    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{     &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var ch:ConnectHeaders = new ConnectHeaders();     &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;stomp.connect("localhost", 61613, ch); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    stomp.subscribe( "/topic/Alarm" ); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;   }        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;private function onStompMessage(event:MessageEvent):void&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {     &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var byteArray:ByteArray = event.message.body;     &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var str:String = byteArray.toString();    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}      &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SehZDSjIJBI/AAAAAAAACVc/KYIk2ZzThSw/s1600-h/2009-4-17+11-38-33.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SehZDSjIJBI/AAAAAAAACVc/KYIk2ZzThSw/s400/2009-4-17+11-38-33.png" alt="" id="BLOGGER_PHOTO_ID_5325604472419263506" border="0" /&gt;&lt;/a&gt;&lt;stomp:stomp id="stomp" message="onStompMessage(event);"&gt;图 7  发布/订阅模式的数据推送&lt;/stomp:stomp&gt;&lt;br /&gt;&lt;stomp:stomp id="stomp" message="onStompMessage(event);"&gt;&lt;/stomp:stomp&gt;&lt;/div&gt;&lt;stomp:stomp id="stomp" message="onStompMessage(event);"&gt;&lt;br /&gt;6. 点对点模式的实现&lt;br /&gt;&lt;br /&gt;点对点模式适合类似调度的功能场景。比如在监控系统中，当某个指令需要下达给具体某个目标的时候，就需要点对点模式的数据推送。&lt;br /&gt;&lt;br /&gt;实现点对点模式的数据推送需要知道数据发送的目的地，以下代码演示了如何从指令中心“党中央”发送指令到“毒蛇”的过程：&lt;br /&gt; &lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;private function sendMsg():void&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  var destination:String = "/queue/毒蛇";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  stomp.sendTextMessage(destination, “注意隐蔽”);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;当然，“毒蛇”需要监听所有发送给他的消息：&lt;br /&gt; &lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;private function login():void&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  var ch:ConnectHeaders = new ConnectHeaders();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  stomp.connect("localhost", 61613, ch);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  stomp.subscribe( "/queue/毒蛇" );&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/stomp:stomp&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SehZDvqMABI/AAAAAAAACVk/yH6LWvwapqc/s1600-h/2009-4-17+11-56-18.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 170px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SehZDvqMABI/AAAAAAAACVk/yH6LWvwapqc/s400/2009-4-17+11-56-18.png" alt="" id="BLOGGER_PHOTO_ID_5325604480233504786" border="0" /&gt;&lt;/a&gt;&lt;stomp:stomp id="stomp" message="onStompMessage(event);"&gt;图 8  点对点模式的数据推送&lt;/stomp:stomp&gt;&lt;br /&gt;&lt;stomp:stomp id="stomp" message="onStompMessage(event);"&gt;&lt;/stomp:stomp&gt;&lt;/div&gt;&lt;stomp:stomp id="stomp" message="onStompMessage(event);"&gt;&lt;br /&gt;7. 实时监控Demo&lt;br /&gt;&lt;br /&gt;这里通过消息模式实现了一个实时监控的演示。服务器端是使用.Net Stomp API写的控制台程序，Demo测试使用1000个监控目标，数据发送间隔0.5秒，数据推送到“realmonitor”频道。浏览器端使用Flex，监听“realmonitor”频道。&lt;br /&gt;&lt;br /&gt;在服务器端，这个Demo中设置每100个目标信息拼装成一条消息，也就是说每0.5秒会发送10条消息。如果每条消息的信息（坐标和一些属性信息）大约50字节的话，每条消息大概5KB；每秒发送两次，总共大概100KB数据量会被推送。&lt;br /&gt;&lt;br /&gt;&lt;/stomp:stomp&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SehZDyM2ocI/AAAAAAAACVs/dFAj1Fq-f6Q/s1600-h/2009-4-17+15-22-27.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 200px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SehZDyM2ocI/AAAAAAAACVs/dFAj1Fq-f6Q/s400/2009-4-17+15-22-27.png" alt="" id="BLOGGER_PHOTO_ID_5325604480915775938" border="0" /&gt;&lt;/a&gt;&lt;stomp:stomp id="stomp" message="onStompMessage(event);"&gt;图 9  Flex中实时监控效果&lt;/stomp:stomp&gt;&lt;br /&gt;&lt;stomp:stomp id="stomp" message="onStompMessage(event);"&gt;&lt;/stomp:stomp&gt;&lt;/div&gt;&lt;stomp:stomp id="stomp" message="onStompMessage(event);"&gt;&lt;br /&gt;如图 9是在Flex中实现的实时监控效果。&lt;br /&gt;&lt;/stomp:stomp&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8276631625201783966?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8276631625201783966/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8276631625201783966' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8276631625201783966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8276631625201783966'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/bs.html' title='B/S架构中的数据推送技术'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__ZvvWze6o0c/SehZEFiSSWI/AAAAAAAACV0/M4h87SVTxns/s72-c/2009-4-17+16-02-17.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-1037556035644362394</id><published>2009-04-15T15:26:00.003+08:00</published><updated>2009-04-15T15:35:52.896+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 13</title><content type='html'>&lt;span style="font-weight: bold;"&gt;【案例】给地图加上弹出气泡&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在这一小节里，我们将会在地图上加一个气泡，很多时候你需要弹出一些简短的信息到地图上，气泡就是为了满足这样的要求的。&lt;br /&gt;&lt;br /&gt;首先让我们回忆下这一章的主要内容，前面讲了ADF一些常用的地图组件，然后从Map组件入手详细分析了它在服务器端和浏览器端的具体实现。现在我们的气泡功能主要是对浏览器端的Map进行功能扩展，那么首先应该想到的就是EsriMap这个JavaScript类，我们在EsriMap中弹出一个div，再放上我需要的信息不就可以了么？&lt;br /&gt;&lt;br /&gt;等等，在页面上弹出一个div是很简单，但是用户还会操作地图，比如拖动一下啊什么的，那这个div怎么跟地图一起移动呢？再回想下图 9，你应该可以得到答案吧？对了，把这个div放到imageGrid中去。&lt;br /&gt;&lt;br /&gt;下面让我们来具体实现这个功能，先看一下效果吧，如图 10。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SeWOC79lUKI/AAAAAAAACVU/0aEoCs7VUMw/s1600-h/2009-4-15+10-48-57.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 212px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SeWOC79lUKI/AAAAAAAACVU/0aEoCs7VUMw/s400/2009-4-15+10-48-57.png" alt="" id="BLOGGER_PHOTO_ID_5324818315542352034" border="0" /&gt;&lt;/a&gt;图 10 地图弹出气泡效果&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;在这个简单的页面上，我们放置了两个按钮。当点击“显示气泡”按钮的时候，地图上会弹出一个提示框，提示框中有我们想要显示给用户的信息；当点击“隐藏气泡”按钮的时候，这个提示框会隐藏掉；另外，当我们拖动地图的时候，这个气泡也会跟着地图一起移动。&lt;br /&gt;&lt;br /&gt;在这里主要封装了两个JavaScript函数，分别绑定到“显示气泡”和“隐藏气泡”按钮的onclick事件上。&lt;br /&gt;我们先来看一下“显示气泡”按钮的事件，它将会触发showPopUp函数，这个函数执行的操作如下：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;function showPopUp()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; var popUpId = 'divPopUp';&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; var popUp = document.getElementById(popUpId);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; if( popUp==null )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  popUp = document.createElement('div');&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  popUp.id = popUpId;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  popUp.innerHTML = "这是我要弹出的信息";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  var map = EsriControls.maps['map'];&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  map.imageGrid.appendChild(popUp);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; var style = 'display:block;position:absolute;z-index:2;';&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; style += 'left:100; top:100;';&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; style += 'background-image:url(images/wuyf/popup.png);width:400px; height:200px;';&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; style += 'background-repeat:no-repeat;';&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; style += 'padding:10px;';&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; EsriUtils.setElementStyle(popUp, style);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;首先，我们试图通过getElementById()方法去获得气泡div是否已经存在；如果不存在，则新建这个div并添加到地图上。我们看到，把气泡div（id为divPopUp）添加到地图上的过程实际上就是把这个div添加到EsriMap的imageGrid中去，这主要是通过appendChild(popUp)这个方法实现的。&lt;br /&gt;&lt;br /&gt;仅仅把这个div添加到imageGrid以后并不能看到这个它，在下面还有一些其它的设置，否则我们的气泡div会被地图遮挡住。这里主要的概念是CSS中的z-index属性，使用这个属性来控制imageGrid中各个子元素的叠置顺序，imageGrid中地图图片的z-index值为1，因此我们需要给气泡div设置一个比1大的数值才可以。另外，在气泡div的样式中我们还必须通过“display:block;”来设置这个div可见，再通过“position:absolute;”来设置这个div的定位模式，这些都是必须的。&lt;br /&gt;&lt;br /&gt;顺便提一句，这里使用的是EsriUtils的setElementStyle()方法来给气泡div来设置CSS属性；你直接用obj.style.attributes=value;的方法来设置也是一样的。&lt;br /&gt;&lt;br /&gt;再来看一下“隐藏气泡”按钮的事件，这就简单多了：&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;function hidePopUp()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; var popUpId = 'divPopUp';&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; var popUp = document.getElementById(popUpId);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; if( popUp!=null )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;  EsriUtils.setElementStyle(popUp, "display:none;");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这里事实上只做了一件事情，就是把气泡div的display样式设置成“none”，浏览器就不会去渲染这个气泡了。&lt;br /&gt;&lt;br /&gt;通过这个小案例，你是不是对ADF中的Map组件，特别是JavaScript脚本库中的EsriMap有了更加深入的理解了？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-1037556035644362394?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/1037556035644362394/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=1037556035644362394' title='8 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1037556035644362394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1037556035644362394'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-13.html' title='ArcGIS Server Java ADF 案例教程 13'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__ZvvWze6o0c/SeWOC79lUKI/AAAAAAAACVU/0aEoCs7VUMw/s72-c/2009-4-15+10-48-57.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-7087909333879143935</id><published>2009-04-08T17:23:00.004+08:00</published><updated>2009-04-08T17:33:30.032+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 12</title><content type='html'>&lt;span style="font-weight: bold;"&gt;EsriMap详解&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;提示：本小节所涉及内容主要由ADF自己完成，分析只是为了更好地了解原理，为将来有可能做的扩展进行准备。&lt;br /&gt;&lt;br /&gt;EsriMap在“/WebContent/js/esri_map.js”中定义，让我们从Map组件输出的JavaScript代码开始去了解ADF在浏览器中所做的工作。&lt;br /&gt;&lt;br /&gt;下面的代码是一个简单地图输出的JavaScript代码（为了便于阅读，我对某些代码作了等价的修改），其中“AgsTest”是我的项目名称：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu8_cBSHI/AAAAAAAACVM/0yLJZviLm0Y/s1600-h/2009-4-8+17-27-48.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 199px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu8_cBSHI/AAAAAAAACVM/0yLJZviLm0Y/s400/2009-4-8+17-27-48.png" alt="" id="BLOGGER_PHOTO_ID_5322250853745248370" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu84lZcAI/AAAAAAAACVE/yXrUXv1QZEY/s1600-h/2009-4-8+17-28-34.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 399px; height: 400px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu84lZcAI/AAAAAAAACVE/yXrUXv1QZEY/s400/2009-4-8+17-28-34.png" alt="" id="BLOGGER_PHOTO_ID_5322250851905531906" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu2RQXAII/AAAAAAAACU8/b8Afhy_osOM/s1600-h/2009-4-8+17-28-53.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 263px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu2RQXAII/AAAAAAAACU8/b8Afhy_osOM/s400/2009-4-8+17-28-53.png" alt="" id="BLOGGER_PHOTO_ID_5322250738269094018" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu2Vm7-gI/AAAAAAAACU0/0IAJ98Kfnyk/s1600-h/2009-4-8+17-29-07.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 291px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu2Vm7-gI/AAAAAAAACU0/0IAJ98Kfnyk/s400/2009-4-8+17-29-07.png" alt="" id="BLOGGER_PHOTO_ID_5322250739437533698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;现在让我们开始看浏览器一步一步执行的JavaScript代码。除了引入一些ADF的JavaScript脚本，首先将会执行的是位于最上面的一些变量声明和位于最下面的esriInitItems.push("esriMapInitmap()")代码，这里会将esriMapInitmap()这个函数添加到esriInitItems这个初始化数组里面去；然后，在页面加载完成后会触发window.onload事件，以致调用esriInitApp(e)函数；这时，由于esriMapInitmap()已经被添加到esriInitItems中，因此这个函数将被调用。下面让我们仔细看看在esriMapInitmap()中发生了些什么。&lt;br /&gt;&lt;br /&gt;首先第一件事情就是实例化一个EsriMap对象，这一步其实有很多内涵，马上就会详细解释；其次，ADF会针对地图中最重要的数据源进行配置，我们在上面的代码可以看到，由于我们使用的是动态Map Service，因此ADF会新建一个EsriMapSourceDynamic（继承自EsriMapSource）对象，并通过EsriMap的addMapSource()方法添加到地图中；然后，addImage()方法会添加这个EsriMapSource对象的图片地址，可以看到，这个图片地址是一个相对路径，以下这个地址表明EsriMapSource中使用的图片格式是MIME 数据，jsessionid参数指示了当前会话的id：&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;/AgsTest/mimedata;jsessionid=5E13F6727CAA0433934A85EFA1AB8D49?wname=esriWebSession&amp;amp;id=map28171097&amp;amp;uniqueId=24691856-0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;下面回过头去详细看一下在实例化EsriMap的时候所发生的事情，这一切相关的操作都封装在了“esri_map.js”这个文件中了，我们可以打开这个文件来看一下EsriMap实例化的详细内容。&lt;br /&gt;&lt;br /&gt;首先，EsriMap是继承自EsriControl，关于EsriControl及其相关的内容，有兴趣可以在ADF JavaScript库中继续深入研究。事实上我们对EsriMap感兴趣的应该主要是两点：其一，地图图片在EsriMap中的放置关系；其二，对地图做操作时候EsriMap与ArcGIS Server的通讯。&lt;br /&gt;&lt;br /&gt;我们先来看下EsriMap中地图图片的放置关系。EsriMap最外层的div是container，默认id是“EsriMapCell_map”（在“map.xsl”中定义），它是放置地图的容器，一般不作操作；在container中还有几个层次的div：divObject、controlDiv、imageGrid，它们和container的关系如图 9所示。地图图片会放在imageGrid中。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu2LxUE7I/AAAAAAAACUs/lzZRWfn6lPg/s1600-h/2009-4-8+17-30-14.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 163px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu2LxUE7I/AAAAAAAACUs/lzZRWfn6lPg/s400/2009-4-8+17-30-14.png" alt="" id="BLOGGER_PHOTO_ID_5322250736796701618" border="0" /&gt;&lt;/a&gt;图 9  EsriMap中放置图片的div&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;下面我们以动态地图为例，看一下当拖动地图时EsriMap是如何与ArcGIS Server通讯并更新图片的。我们首先找到EsriMap中有以下这段代码：&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-size:85%;" &gt;EsriControls.addPostBackTagHandler("map", EsriControls.maps[self.id].updateAsync);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;EsriControls在“/WebContent/js/esri_core.js”中定义，它负责管理当前页面上所有的ADF的DHTML组件。以上的代码给EsriMap对象添加了一个回调函数updateAsync，它将会在页面收到AJAX响应并且响应中有“map”标签的时候被调用。&lt;br /&gt;&lt;br /&gt;当我们拖动地图的时候，客户端的JavaScript会将需要的地图范围发给服务器（有兴趣可以参考EsriMapPan和EsriMapContinuousPan函数），服务器处理完成后会返回如下的响应：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/Sdxu2KyPCTI/AAAAAAAACUk/4JURJMkZ6QY/s1600-h/2009-4-8+17-30-30.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 137px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/Sdxu2KyPCTI/AAAAAAAACUk/4JURJMkZ6QY/s400/2009-4-8+17-30-30.png" alt="" id="BLOGGER_PHOTO_ID_5322250736532130098" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/Sdxu1yenFhI/AAAAAAAACUc/JxjMvByIys4/s1600-h/2009-4-8+17-30-39.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 322px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/Sdxu1yenFhI/AAAAAAAACUc/JxjMvByIys4/s400/2009-4-8+17-30-39.png" alt="" id="BLOGGER_PHOTO_ID_5322250730007369234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;这时，updateAsync函数就会被调用，它会更新页面上EsriMap相关的一系列div和其它对象的属性值，从而更新地图视图。具体更新的细节，有兴趣可以详细研究下updateAsync函数，这里就不赘述了。&lt;br /&gt;&lt;br /&gt;从这个Map组件的服务器端对象和客户端对象，我们已经基本了解了Map的工作原理。ADF的其余几个常用组件：TOC、Toolbar、Overview等也是万变不离其宗，虽各有特点，但大体思路和原理也大概如此，有兴趣的话你还可以做更深入的研究。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-7087909333879143935?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/7087909333879143935/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=7087909333879143935' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7087909333879143935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7087909333879143935'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-12.html' title='ArcGIS Server Java ADF 案例教程 12'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__ZvvWze6o0c/Sdxu8_cBSHI/AAAAAAAACVM/0yLJZviLm0Y/s72-c/2009-4-8+17-27-48.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4407080893491295423</id><published>2009-04-08T17:17:00.003+08:00</published><updated>2009-04-08T17:22:42.088+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 11</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Map组件详解&lt;/span&gt;&lt;br /&gt;以上几个组件的使用非常简单，不需要很多设置就可以搭起一个有模有样的WebGIS页面了——当然，这是因为ADF在后台为我们做了很多事情。后面我们希望从Map组件入手，看看在一个会话中，ADF是怎么把后台的ArcGIS服务呈现到用户的浏览器，并使之能响应用户操作的。&lt;br /&gt;&lt;br /&gt;当一个用户会话开始时，让我们首先看一下Map组件在服务器端绑定的WebMap对象，WebMap对象的定义我们可以在“/WebContent/WEB-INF/context-attributes.xml”中找到。在前面我们已经知道，一个JSF应用在启动的时候会读取“faces-config.xml”文件来配置应用；这里的“context-attributes.xml”虽然不是默认配置文件，但是在这里它也会被读取，因为在“/WebContent/WEB-INF/web.xml”中有如下的配置：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SdxsiRdlRyI/AAAAAAAACUU/MQbBxGD0YJg/s1600-h/2009-4-8+17-19-45.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 216px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SdxsiRdlRyI/AAAAAAAACUU/MQbBxGD0YJg/s400/2009-4-8+17-19-45.png" alt="" id="BLOGGER_PHOTO_ID_5322248195703916322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;前面我们已经提过，“web.xml”是Java Web工程的部署描述文件，上述这段“web.xml”中的配置会指定JSF应用启动时需要读取的若干配置文件路径，“context-attributes.xml”赫然名列其中。对了，你也可以自己新建一个配置文件，然后在这里进行一下配置，比如我习惯新建一个“context-resources.xml”文件来定义WebContext需要的所有服务资源，然后再在“web.xml”中添加如上虚线框中的内容。&lt;br /&gt;&lt;br /&gt;在“context-attributes.xml”中首先就是对WebMap的定义：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SdxsiPoJgBI/AAAAAAAACUM/XxtRJh-H7PE/s1600-h/2009-4-8+17-20-02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 139px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SdxsiPoJgBI/AAAAAAAACUM/XxtRJh-H7PE/s400/2009-4-8+17-20-02.png" alt="" id="BLOGGER_PHOTO_ID_5322248195211362322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;这段配置文件的含义就是：在应用中，在有需要的时候会实例化一个名为map的WebMap对象供使用，并且其地图输出格式为24位的PNG图片。&lt;br /&gt;&lt;br /&gt;从图 3的结构我们可以看到，这个WebMap对象将会被放置到WebContext的attributes中进行使用和管理。比如按照下面这段“faces-config.xml”中的定义，当得到一个WebContext对象mapContext以后，我们就可以通过mapContext.attributes["map"]就可以得到WebMap对象了：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SdxsiI5TQkI/AAAAAAAACUE/YvTwCL5ReEc/s1600-h/2009-4-8+17-20-17.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 215px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SdxsiI5TQkI/AAAAAAAACUE/YvTwCL5ReEc/s400/2009-4-8+17-20-17.png" alt="" id="BLOGGER_PHOTO_ID_5322248193404256834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;好，目前为止我们已经知道了在一个会话中，Map组件在服务器上绑定的WebMap对象如何生成，并且如何引用了。下面让我们看看Map组件和WebMap怎么配合渲染成浏览器中的一个地图的。&lt;br /&gt;&lt;br /&gt;前面在JSP页面中我们是通过“a:map”标签来定义一个Map组件的，实际在ADF中，其对应的JSF组件为MapControl 。MapControl中包含WebMap、MapRenderer 、XslUrl等属性，WebMap负责维护地图的功能，MapRenderer负责将其输出成XML，最后再通过XslUrl指定的XSL文件将XML解释为DHTML输出。&lt;br /&gt;&lt;br /&gt;打开“/src/xsl”目录，我们会发现下面有很多“*.xsl”文件，其中的“map.xsl”就是我们的MapControl渲染时候默认使用的XSL文件。当有用户向服务器发送请求的时候，JSF会首先创建或者还原MapControl这个视图对象，然后再使用其MapRenderer按照XSL文件渲染成DHTML响应输出给浏览器。&lt;br /&gt;&lt;br /&gt;你可以运行下你的应用，然后查看地图页面的源代码，从中会发现类似以下的代码，这些就是Map组件的MapRenderer渲染的。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SdxshmoT-eI/AAAAAAAACT8/PgMbgX81dh0/s1600-h/2009-4-8+17-20-28.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 76px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SdxshmoT-eI/AAAAAAAACT8/PgMbgX81dh0/s400/2009-4-8+17-20-28.png" alt="" id="BLOGGER_PHOTO_ID_5322248184206195170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;在这里出现了EsriMap这个JavaScript类， 它将会实例化浏览器端的地图对象。在下面这一节里，我们将会对EsriMap做详细解释。这里先稍微做一下总结，如图 8，借用帮助里的一张图片，应该可以帮助你了解ADF组件的基本原理。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/Sdxshgh7oYI/AAAAAAAACT0/MSBhm4bb9vI/s1600-h/2009-4-8+17-20-53.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 182px; height: 269px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/Sdxshgh7oYI/AAAAAAAACT0/MSBhm4bb9vI/s400/2009-4-8+17-20-53.png" alt="" id="BLOGGER_PHOTO_ID_5322248182568821122" border="0" /&gt;&lt;/a&gt;图 8  Map组件的生命周期&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4407080893491295423?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4407080893491295423/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4407080893491295423' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4407080893491295423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4407080893491295423'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-11.html' title='ArcGIS Server Java ADF 案例教程 11'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__ZvvWze6o0c/SdxsiRdlRyI/AAAAAAAACUU/MQbBxGD0YJg/s72-c/2009-4-8+17-19-45.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-3267913115864627709</id><published>2009-04-03T17:34:00.000+08:00</published><updated>2009-04-03T17:29:12.280+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 10</title><content type='html'>&lt;span style="font-weight: bold;"&gt;几个ADF常用组件&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SdVorekS4AI/AAAAAAAACSk/mfK5vKPC0bk/s1600-h/2009-4-1+13-31-19.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 171px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SdVorekS4AI/AAAAAAAACSk/mfK5vKPC0bk/s400/2009-4-1+13-31-19.png" alt="" id="BLOGGER_PHOTO_ID_5320273630957068290" border="0" /&gt;&lt;/a&gt;图 6  ADF常用组件&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;如图 6所示，ADF中几个与地图相关的组件的命名和功能都和ArcEngine很类似，主要包括Map、Toolbar、TOC、Overview等。我们先大致看一下这几个组件的用法和大概功能。&lt;br /&gt;Map应该是所有ADF应用中都要使用的组件，它是一个地图的容器，内置了对各种地图服务的使用和操作。它在服务器端绑定的是一个WebMap 对象。以下标签在页面中添加了一个Map组件：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SdVorvInslI/AAAAAAAACS8/yVVDR9COWxA/s1600-h/2009-4-3+9-38-05.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 21px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SdVorvInslI/AAAAAAAACS8/yVVDR9COWxA/s400/2009-4-3+9-38-05.png" alt="" id="BLOGGER_PHOTO_ID_5320273635404395090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Toolbar是绑定到Map的工具条，在Toolbar中可以添加Tool和Command以实现相应的地图操作，而它本身仅仅是一个容器。以下标签在页面中添加了一个Toolbar组件，同时绑定到id为“map”的Map组件，并在其中放置了一个可以设置当前地图操作为“Pan”的Tool：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SdVorgbfleI/AAAAAAAACS0/z9T5aKGBkYw/s1600-h/2009-4-3+9-37-54.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 163px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SdVorgbfleI/AAAAAAAACS0/z9T5aKGBkYw/s400/2009-4-3+9-37-54.png" alt="" id="BLOGGER_PHOTO_ID_5320273631457023458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;TOC是Table Of Contents的缩写，它提供一个面板来显示当前地图的图层信息，并可以进行隐藏/显示图层、缩放到图层等操作。它在服务器端绑定的是一个WebToc 对象。以下标签在页面中添加了一个TOC组件，同时绑定到id为“map”的Map组件：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SdVorvInslI/AAAAAAAACS8/yVVDR9COWxA/s1600-h/2009-4-3+9-38-05.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 21px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SdVorvInslI/AAAAAAAACS8/yVVDR9COWxA/s400/2009-4-3+9-38-05.png" alt="" id="BLOGGER_PHOTO_ID_5320273635404395090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Overview提供鹰眼图功能，它在一个全图的地图上用一个矩形框来表示当前地图的视图范围。它在服务器端绑定的是一个WebOverview 对象。以下标签在页面中添加了一个Overview组件，同时绑定到id为“map”的Map组件：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SdVornUMqeI/AAAAAAAACTE/QBQnLCSdYRE/s1600-h/2009-4-3+9-38-19.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 38px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SdVornUMqeI/AAAAAAAACTE/QBQnLCSdYRE/s400/2009-4-3+9-38-19.png" alt="" id="BLOGGER_PHOTO_ID_5320273633305471458" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-3267913115864627709?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/3267913115864627709/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=3267913115864627709' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3267913115864627709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3267913115864627709'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-9.html' title='ArcGIS Server Java ADF 案例教程 10'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__ZvvWze6o0c/SdVorekS4AI/AAAAAAAACSk/mfK5vKPC0bk/s72-c/2009-4-1+13-31-19.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-3233988671504477151</id><published>2009-04-03T17:22:00.002+08:00</published><updated>2009-04-03T17:26:54.841+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 9</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ADF中的服务&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ADF的后台都是各种不同的ArcGIS服务，一个ADF应用所依赖的就是这些服务提供的功能。这个小节让我们看一下服务是怎么配置到ADF应用，并和ADF对象关联起来的。&lt;br /&gt;&lt;br /&gt;比如我现在发布了一个名为“World”的地图服务（Map Service），在ADF应用中准备通过Internet的方式进行连接。在当前的JSP文件上右键菜单，选择【ArcGIS】-【Configure Map Service…】后，如图 6所示添加地图服务。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SdXWJwIlRJI/AAAAAAAACTs/4YAG0oSo1lk/s1600-h/2009-4-3+11-43-46.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 307px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SdXWJwIlRJI/AAAAAAAACTs/4YAG0oSo1lk/s400/2009-4-3+11-43-46.png" alt="" id="BLOGGER_PHOTO_ID_5320393997836174482" border="0" /&gt;&lt;/a&gt;图 6  在当前应用中配置服务&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;在添加服务以后，让我们打开“faces-config.xml”来看一下ArcGIS Eclipse Plugin帮我们生成的配置（在此基础上我对一些名称作了修改）：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SdXWJ5a6RMI/AAAAAAAACTk/ROq6C1xhHb4/s1600-h/2009-4-3+17-24-01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 287px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SdXWJ5a6RMI/AAAAAAAACTk/ROq6C1xhHb4/s400/2009-4-3+17-24-01.png" alt="" id="BLOGGER_PHOTO_ID_5320394000328967362" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SdXWJoAKRQI/AAAAAAAACTc/ue7AuVL0LQY/s1600-h/2009-4-3+17-25-12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 346px; height: 400px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SdXWJoAKRQI/AAAAAAAACTc/ue7AuVL0LQY/s400/2009-4-3+17-25-12.png" alt="" id="BLOGGER_PHOTO_ID_5320393995653367042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;在ADF中，服务是作为资源（Resource）登上舞台的。上面这段配置定义了一个名为agswsWorld的AGSMapResource对象，事实上，这个Resource对象关联的就是我们前面发布的“World”这个地图服务。在这里需要注意的是“functionalities”标签，“functionalities”中定义了当前这个资源可以使用的功能，比如一个地图服务显然可以进行查询，因此在我们的“functionalities”中定义了一个属性“query”，它指向一个名为“agsQuery”的AGSQueryFunctionality 对象（打开“/WebContext/WEB-INF/ functionalities/ags-functionalities.xml”可以发现它的踪迹），它提供了地图查询功能。&lt;br /&gt;&lt;br /&gt;这个agswsWorld最后会被添加到WebContext的resources属性中去。通常在“faces-config.xml”中会以如下的方式定义：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SdXWJFD2i0I/AAAAAAAACTU/W5odIuytl6c/s1600-h/2009-4-3+17-25-29.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 199px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SdXWJFD2i0I/AAAAAAAACTU/W5odIuytl6c/s400/2009-4-3+17-25-29.png" alt="" id="BLOGGER_PHOTO_ID_5320393986273610562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;稍微总结一下，ADF会根据不同的ArcGIS服务类型生成对应的AGSxxxResource对象进行关联，服务包含各种不同的功能可供使用。这些Resource对象根据需要会被添加到WebContext的“resources”属性中去进行管理和使用。以上这些关于Resource的内容默认都集中在“/WebContext/WEB-INF/“目录下的 “faces-config.xml”和“functionalities/*-functionalities.xml”中进行定义的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-3233988671504477151?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/3233988671504477151/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=3233988671504477151' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3233988671504477151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3233988671504477151'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-9_03.html' title='ArcGIS Server Java ADF 案例教程 9'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__ZvvWze6o0c/SdXWJwIlRJI/AAAAAAAACTs/4YAG0oSo1lk/s72-c/2009-4-3+11-43-46.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-7910846113138634468</id><published>2009-04-03T14:55:00.006+08:00</published><updated>2009-04-03T15:09:54.573+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Map'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>浅谈ArcGIS Flex API使用非ArcGIS Server数据源问题</title><content type='html'>很多人问过我，ArcGIS Flex API能不能不使用ArcGIS Server，估计主要目标还是切片底图。中国免费开放的最详细的地图数据大概也就是1：400万的，对于有更详细地图需求的又不想自己架服务器的无疑是一个大问题，所以都想用Google或者Virtual Earth的图。&lt;br /&gt;&lt;br /&gt;事实上，这是可以的。这里主要集中在两块问题，如果你搞明白了，那就水到渠成了。&lt;br /&gt;&lt;br /&gt;1.你需要应用的数据源的切片方式，比如Google的数据，每个切片访问的URL是多少，你得清楚，在此基础上，你需要继承ArcGISTiledMapServiceLayer定义一个你自己的图层，并重写其getTileURL()方法。&lt;br /&gt;&lt;br /&gt;2.在使用这个自定义图层的时候，一定要指定其url属性值，这个url“必须”是一个ArcGIS Server图层的地址，并且这个ArcGIS Server图层的空间参考和你的数据源（比如Google Map）必须相同。你可能会想，那不还是得需要ArcGIS Server么？其实不用，你可以将其指向其它url，但是这个url需要可以输出和ArcGIS Server图层一样的JSON信息。&lt;br /&gt;&lt;br /&gt;说到这里，你应该明白怎么做了吧？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-7910846113138634468?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/7910846113138634468/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=7910846113138634468' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7910846113138634468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/7910846113138634468'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-flex-apiarcgis-server.html' title='浅谈ArcGIS Flex API使用非ArcGIS Server数据源问题'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-1841992675669017100</id><published>2009-04-02T15:04:00.003+08:00</published><updated>2009-04-02T15:13:41.127+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 8</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ADF页面结构&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在介绍ADF组件之前，我想还是先花点时间了解一下ADF的页面结构比较好，因为首先你要知道，使用ADF并不是简单地把这些组件拖到一个JSF页面上就可以用的。&lt;br /&gt;&lt;br /&gt;打开模板工程的地图页面“mapviewer.jsp”，首先在页面顶端我们会找到对ADF标签库的引用，JSF页面会通过这个标签库（前缀为“a”）来定义相应的ADF组件。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SdRkU8IKs6I/AAAAAAAACSc/_f5tcDG9hyU/s1600-h/2009-4-2+15-06-46.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 21px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SdRkU8IKs6I/AAAAAAAACSc/_f5tcDG9hyU/s400/2009-4-2+15-06-46.png" alt="" id="BLOGGER_PHOTO_ID_5319987370731942818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;往下到页面的主体部分，所有的ADF组件都放在“f:view”标签内，这很好理解，因为我们的ADF组件是基于JSF的，因此也必须放在JSF的组件树结构中，“f:view”就是JSF组件树的根节点。我们可以看到，在“a:context”，它绑定到服务器上的WebContext对象“mapContext”，由它来管理其余所有的ADF组件及相关状态，“mapContext”对象的定义我们可以在“/WebContent/WEB-INF/faces-config.xml”中找到：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SdRkUtQnTFI/AAAAAAAACSU/o5mZTBNYzGY/s1600-h/2009-4-2+15-07-01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 128px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SdRkUtQnTFI/AAAAAAAACSU/o5mZTBNYzGY/s400/2009-4-2+15-07-01.png" alt="" id="BLOGGER_PHOTO_ID_5319987366740839506" border="0" /&gt;&lt;/a&gt;&lt;a:context value="#{mapContext}"&gt;&lt;managed-bean&gt;&lt;managed-bean-scope&gt;&lt;/managed-bean-scope&gt;&lt;/managed-bean&gt;&lt;br /&gt;顺便简单说一下这个“faces-config.xml”文件，这是JSF默认的配置文件。在一个JSF应用启动以后，Java Web服务器会根据这个配置文件初始化相应的JSF对象。对于这个配置文件，我们在后面会多次接触到，届时会有更加详细的解释。&lt;br /&gt;&lt;br /&gt;在“&lt;f:view&gt;&lt;/f:view&gt;f:view”内部还有一个标签“h:form”，这代表的是一个纯HTML表单，所有需要向服务器提交数据的JSF组件必须放在这个表单下，因此，我们的ADF组件（除了“a:context”）也都需要放在“h:form”标签内。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SdRkUha5UtI/AAAAAAAACSM/ktc61rEMQaE/s1600-h/2009-4-2+15-07-15.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 155px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SdRkUha5UtI/AAAAAAAACSM/ktc61rEMQaE/s400/2009-4-2+15-07-15.png" alt="" id="BLOGGER_PHOTO_ID_5319987363562738386" border="0" /&gt;&lt;/a&gt;&lt;a:context value="#{mapContext}"&gt;&lt;a:context&gt;图 5  ADF页面主要元素&lt;br /&gt;&lt;br /&gt;&lt;/a:context&gt;&lt;/a:context&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;a:context value="#{mapContext}"&gt;&lt;a:context&gt;图 5表示了上述这些页面元素的关系。一般来说，要让我们的JSF页面正确地加载ADF和其它JSF组件，并正常地工作，页面源代码大概如下所示：&lt;/a:context&gt;&lt;/a:context&gt;&lt;br /&gt;&lt;/div&gt;&lt;a:context value="#{mapContext}"&gt;&lt;a:context&gt;&lt;/a:context&gt;&lt;/a:context&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SdRkUEUJmDI/AAAAAAAACSE/G7qQne6kUnw/s1600-h/2009-4-2+15-07-28.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 252px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SdRkUEUJmDI/AAAAAAAACSE/G7qQne6kUnw/s400/2009-4-2+15-07-28.png" alt="" id="BLOGGER_PHOTO_ID_5319987355749816370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/a:context&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-1841992675669017100?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/1841992675669017100/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=1841992675669017100' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1841992675669017100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1841992675669017100'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/04/arcgis-server-java-adf-8.html' title='ArcGIS Server Java ADF 案例教程 8'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__ZvvWze6o0c/SdRkU8IKs6I/AAAAAAAACSc/_f5tcDG9hyU/s72-c/2009-4-2+15-06-46.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-8199013827430680337</id><published>2009-03-30T16:43:00.004+08:00</published><updated>2009-03-30T16:52:55.782+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 7</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ADF是怎样开始工作的&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ADF现在已经存在于我们的工程中了，接下来的问题就是它是怎么工作的了。换句话说，当我们的开发任务完成以后，把这个ADF项目部署到一个Java Web服务器上，当有浏览器对它发生请求的时候，我们的服务器怎么知道我这是一个JSF应用，进一步还会根据ArcGIS的ADF来生成那些乱七八糟的诸如WebContext之类的对象呢？&lt;br /&gt;&lt;br /&gt;我们首先来看一下，当一个用户对服务器发送请求的时候，Java Web服务器怎么判断他要访问的是一个JSF应用。让我们打开“/WebContent/WEB-INF/web.xml”，这个web.xml文件是Java Web工程的部署描述文件，服务器会根据这个文件中的定义来加载Servlet以及其它的内容，在这个文件中我们可以分别找到下面两段定义：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SdCG5eQHM8I/AAAAAAAACR8/S3PCycx9-5E/s1600-h/2009-3-30+16-44-46.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 180px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SdCG5eQHM8I/AAAAAAAACR8/S3PCycx9-5E/s400/2009-3-30+16-44-46.png" alt="" id="BLOGGER_PHOTO_ID_5318899481855865794" border="0" /&gt;&lt;/a&gt;&lt;servlet-mapping&gt;&lt;/servlet-mapping&gt;&lt;br /&gt;“servlet”元素定义的是Java Web服务器加载的Servlet信息，“servlet-mapping”元素定义的是一个URL模式对应的Servlet，所有符合该URL模式的请求都会被映射到该Servlet上进行处理。在这里首先我们根据FacesServlet 这个类在服务器启动的时候加载了JSF的Servlet：“Faces Servlet”，然后又定义了一个“*.jsf”的URL模式，凡是以“*.jsf”出现的请求都会被映射到“Faces Servlet”进行处理。好了，到这里我们应该可以明白JSF是怎么工作的了。&lt;br /&gt;&lt;br /&gt;在此基础上，我们需要进一步了解ADF的运行。还是在刚才的web.xml文件中，从中我们还可以找到以下的这段内容：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SdCG46_i4LI/AAAAAAAACR0/5UnhjdCc0nQ/s1600-h/2009-3-30+16-45-20.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 91px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SdCG46_i4LI/AAAAAAAACR0/5UnhjdCc0nQ/s400/2009-3-30+16-45-20.png" alt="" id="BLOGGER_PHOTO_ID_5318899472391135410" border="0" /&gt;&lt;/a&gt;&lt;listener&gt;&lt;listener-class&gt;&lt;/listener-class&gt;&lt;/listener&gt;&lt;br /&gt;“listener”元素会根据相应的监听类配置一个监听。在这里模板工程为我们配置了一个ADFServletContextListener监听器，这个监听器实现了两个接口：ServletContextListener和HttpSessionListener。&lt;br /&gt;&lt;br /&gt;ServletContextListener负责监听Web应用（你部署的这个ADF工程）的ServletContext的变化。当我们的Java Web服务器启动的时候，我们的Web应用也会跟着启动，这时，Web应用的ServletContext将会被创建并初始化，因此ADFServletContextListener的contextInitialized(ServletContextEvent event)方法会被调用。在这个方法中，ADF的WebApplication 会被创建并初始化。这个WebApplication相当于我们ADF的女娲娘娘，以下我们会看到一个又一个的ADF对象会从中孕育出来。&lt;br /&gt;&lt;br /&gt;WebApplication中包含了由WebSession 组成的一个ArrayList，这个ArrayList中包含了所有的用户的ADF会话WebSession；当然，这个WebSession与整个Web应用的会话HttpSession 并不是独立的，WebSession会作为一个属性存储在HttpSession中。&lt;br /&gt;&lt;br /&gt;在这个WebSession中其实也是一片广阔的革命天地。在每个WebSession中都会有一个由WebContext 组成的ArrayList，它存放的是这个会话所用到的所有WebContext对象。还记得WebContext么？在《ADF的逻辑结构》这小节中，WebContext是以一个非常大哥的形象出现的。现在发现，这个大哥其实是WebSession的小弟之一，WebSession则是WebApplication的小弟之一。&lt;br /&gt;&lt;br /&gt;下面再说说HttpSessionListener，它负责监听Web应用当前会话的变化。当有一个新的用户向我们的服务器发送请求的时候，应用会为这个用户新建一个会话，这个时候，ADFServletContextListener的sessionCreated(HttpSessionEvent event)方法也会被执行（虽然事实上，在这里ADF并不做任何事情，WebSession并不是在这里创建，这个下面马上就讲）；当一个会话结束时，ADFServletContextListener的sessionDestroyed(HttpSessionEvent event)方法会被执行，ADF将会从Web应用的HttpSession中取得WebSession对象，并将之从WebApplication中移除并销毁。&lt;br /&gt;&lt;br /&gt;目前为止，只有WebSession的出身不太明白了。还是让我们打开web.xml文件，其中有下面的一段：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SdCG4st7wSI/AAAAAAAACRs/heNBWXkQSIE/s1600-h/2009-3-30+16-45-40.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 74px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SdCG4st7wSI/AAAAAAAACRs/heNBWXkQSIE/s400/2009-3-30+16-45-40.png" alt="" id="BLOGGER_PHOTO_ID_5318899468559171874" border="0" /&gt;&lt;/a&gt;&lt;filter&gt;&lt;filter-class&gt;&lt;/filter-class&gt;&lt;/filter&gt;&lt;br /&gt;这里定义了一个过滤器ADFFilter，每当有用户请求时，请求都会经过ADFFilter过滤，这时，ADFFilter的doFilter(…)方法将会被执行。在这个方法中，ADF会试图获得该请求的HttpSession中保存的WebSession对象，如果这个对象为null，则新建一个WebSession对象并保存（同时保存引用到HttpSession和WebApplication）。&lt;br /&gt;&lt;br /&gt;最后，让我们对ADF的工作流程稍作梳理。ADF的工作主要依赖于Web应用的web.xml中配置的ADFServletContextListener监听器和ADFFilter过滤器。当Web应用启动的时候，ADFServletContextListener负责创建WebApplication（老大）；当有用户请求的时候，请求会经过ADFFilter过滤并试图获得该请求的WebSession（老大的小弟），如果为null则创建WebSession并保存；在WebSession中包含了该会话使用的所有WebContext（老大的小弟的小弟），有了WebContext，剩下的事情都好办了。&lt;br /&gt;&lt;br /&gt;以上是ADF的内部机制，如果理解有困难或者觉得有点麻烦，其实也没必要了解那么清楚，对ADF的几个重要对象的关系有所了解就可以了，下面这个简单的图可能会对你的理解有所帮助。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SdCG3y__blI/AAAAAAAACRk/6io5AZag1BU/s1600-h/2009-3-30+16-45-54.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 252px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SdCG3y__blI/AAAAAAAACRk/6io5AZag1BU/s400/2009-3-30+16-45-54.png" alt="" id="BLOGGER_PHOTO_ID_5318899453065653842" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-8199013827430680337?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/8199013827430680337/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=8199013827430680337' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8199013827430680337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/8199013827430680337'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/03/arcgis-server-java-adf-7.html' title='ArcGIS Server Java ADF 案例教程 7'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__ZvvWze6o0c/SdCG5eQHM8I/AAAAAAAACR8/S3PCycx9-5E/s72-c/2009-3-30+16-44-46.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4521701299540995206</id><published>2009-03-27T23:13:00.004+08:00</published><updated>2009-04-03T16:45:50.450+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 6</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ADF的逻辑结构&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;尼采说：“我没有肉体，我只有灵魂”，感情这哥们从不吃喝拉撒——咱就不从唯物主义去批判他了，反正咱ADF不一样，它可是有胳膊有腿、有思想有能力的四有框架。上面刚介绍完了ADF的物理组成，根据由表及里、由浅入深的认识论原则，现在我们开始认识一下ADF的逻辑结构。&lt;br /&gt;&lt;br /&gt;在ADF的帮助中有一张MVC示意图，其中把视图和控制器合并在了一起，因为ESRI认为ADF的组件不仅仅在视图层，它们还影响到了Web应用流程，有控制器的功能。这种划分我感觉不太清晰，所以这里还是把控制器独立了出来。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SdXMo8H9ieI/AAAAAAAACTM/yR5PlDYJ0Mw/s1600-h/2009-4-3+16-43-28.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 365px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SdXMo8H9ieI/AAAAAAAACTM/yR5PlDYJ0Mw/s400/2009-4-3+16-43-28.png" alt="" id="BLOGGER_PHOTO_ID_5320383538514463202" border="0" /&gt;&lt;/a&gt;图 3  ADF的MVC示意图&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;如图 3所示是我绘制的MVC示意图。ADF在视图层的表现是一系列的JSF组件；它们是通过控制器层的ADF组件渲染器输出的；最下层的是模型层。在ADF的模型中，WebContext是最为重要的对象，不管是GISResource（各种服务资源）还是其它的WebControl（WebMap、WebToc等等），都是在WebContext中进行管理的。WebContext可以看作在用户会话中存在的管理ADF的一个环境，至于这个WebContext是从何而来，马上在下一小节中会详细叙述。&lt;br /&gt;&lt;br /&gt;浏览器中用户所能看到的Map、Toc等，在服务器上都是以WebMap、WebToc等JavaBean对象存在于用户的会话中；同时，这些对象作为WebContext的属性（attribute）被其包含。而Web应用中所用到的GIS服务（如Map Service、Geoprocessing Service等），在ADF中都是作为GISResource（如AGSMapResource、AGSGPResource等）来进行连接使用。这些不同的GISResource各自包含了各种不同的功能（GISFunctionality），这些不同的功能又会各自对应到WebMap、WebToc等对象上去。为什么需要在ADF的WebControl和GISResource之间加上GISFunctionality这一层呢？这主要是ADF为了统一不同服务数据源考虑，比如虽然AGSMapResource和AGSLocalMapResource是两种不同的GISResource，但是它们都可以在Map组件中进行地图浏览，因此ADF定义了AGSMapFunctionality这个功能，AGSMapResource和AGSLocalMapResource都分别实现了这个功能，Map只要调用这个功能就可以实现地图的浏览而不必关心后台的服务到底是什么类型的。&lt;br /&gt;&lt;br /&gt;上面这个MVC示意图目前有个大概印象就可以了，因为你还没有真正地使用ADF，都理解了也不太可能；在后续的环节中，经常会过来看看这张图可能会有更加深入的理解，先就认个脸熟吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4521701299540995206?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4521701299540995206/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4521701299540995206' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4521701299540995206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4521701299540995206'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/03/arcgis-server-java-adf-6.html' title='ArcGIS Server Java ADF 案例教程 6'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__ZvvWze6o0c/SdXMo8H9ieI/AAAAAAAACTM/yR5PlDYJ0Mw/s72-c/2009-4-3+16-43-28.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-1754901636288584872</id><published>2009-03-26T17:26:00.003+08:00</published><updated>2009-03-26T17:34:55.666+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 5</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ADF的物理组成&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;现在，ADF对你来说或许就像远处的一个美女，氤氲中你依稀可以看到她的体态轮廓；当然，你同时也迫切希望能更深一步地了解她。现在我们要做的，就是走近她，慢慢揭开她的面纱。&lt;br /&gt;&lt;br /&gt;我现在感觉自己有点像一个导演——当然，我可不想是拍《无极》那种烂片的水平——面对一个“她”，目前正在设计一个镜头，目的是怎样可以比较艺术化地表现出她的一切。这里，我决定从她的肉体——ADF的物理组成入手，先带你去一窥它的全貌。&lt;br /&gt;&lt;br /&gt;现在，让我们首先新建一个ADF的模板工程，这个模板工程是ESRI使用ADF开发的一个简单的Web应用供你参考，它包含了一些最常用和最基本的GIS功能；当然，它也必不可少会将ADF这个框架包含在这个应用中。&lt;br /&gt;&lt;br /&gt;对了，迄今为止我们也没有讲怎么搭建ADF的开发环境，并且新建ADF模板工程来测试我们的开发插件是否安装成功。这些内容在我很久以前的文章中写过，我就不想在这里再重复一遍，分散我们对ADF的注意力了。这些内容，不管是基于Eclipse还是NetBeans，都可以从ADF的帮助文档中找到；你也可以参考我写的文档：《配置ArcGIS Server 9.3 Java开发环境（&lt;a href="http://wu-yongfeng.blogspot.com/2008/07/arcgis-server-93-javaeclipse.html"&gt;Eclipse&lt;/a&gt;/&lt;a href="http://wu-yongfeng.blogspot.com/2008/07/arcgis-server-93-javanetbeans.html"&gt;NetBeans&lt;/a&gt;）》——好了，现在我认为你已经配置好了开发环境，并且学会如何新建一个ADF模板工程了。另外，下面的讲解基于的IDE是Eclipse。&lt;br /&gt;&lt;br /&gt;让我们打开刚刚新建的ADF模板工程，展开项目的目录结构。我对其中一些重要的部分重点用图 2表示了出来，下面让我们一级一级地展开。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SctKp_vMj5I/AAAAAAAACRU/B26JausphFs/s1600-h/2009-3-26+11-48-52.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 209px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SctKp_vMj5I/AAAAAAAACRU/B26JausphFs/s400/2009-3-26+11-48-52.png" alt="" id="BLOGGER_PHOTO_ID_5317425870385483666" border="0" /&gt;&lt;/a&gt;图 2  ADF模板工程的目录结构&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;在一个ADF的工程中，与开发相关的主要是“/src”目录和“/WebContent”目录。“/src”目录主要存放Java源代码相关内容，这些源代码最终会被编译后放到“/WebContent/WEB-INF/classes”目录中去；“/WebContent”目录主要存放最后需要部署的Web应用的内容。&lt;br /&gt;&lt;br /&gt;在“/src”目录中，纯Java的代码一般会放到你自己的命名空间下，比如“/src/com/…”目录；“/src/xsl”是另外一个很重要的目录，其中包含许多xsl文件，ADF通过这些xsl来渲染ADF组件，具体它是怎么工作的我们后续会做更详细的介绍。&lt;br /&gt;&lt;br /&gt;现在转到“/WebContent”目录，ADF本身带了一些“css”、“images”、“themes”目录内容来定义默认模板工程的样式；当然，还有一些“*.jsp”页面——事实上，在你自己做应用的时候基本上不需要用到这些页面。在此要详细解释的是“/WebContent/js”和“/WebContent/WEB-INF”两个目录。&lt;br /&gt;&lt;br /&gt;“/WebContent/js”目录包含了ADF的JavaScript函数库，主要是ADF在跟服务器做AJAX交互的时候需要用到，当然，你自己定义的JavaScript脚本也可以放到这个目录下；“/WebContent/WEB-INF”目录存放所有不希望被Web访问者访问到的文件和库，包括一些“*.xml”配置文件、“/WebContent/WEB-INF/classes”下的类文件（从“src”编译生成）、“/WebContent/WEB-INF/lib”下的Java库。&lt;br /&gt;&lt;br /&gt;在这里我们稍微总结一下ADF的物理组成：ADF的核心主要包括“/WebContent/WEB-INF/lib”目录下的Java库（底层功能、ADF的JSF组件等）、“/WebContent/js”目录下的JavaScript脚本库（支持AJAX）和“/WebContent/WEB-INF/classes/xsl”目录下的XSL样式表语言文件（渲染ADF组件）；除此之外，ADF外围还有一些模板页面、CSS文件、图片、主题等可用可不用的附赠品；最后，作为开发框架，ADF还包括帮助文件和例子，虽然这里并没有介绍它们——因为它们并不会被放到工程中去。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-1754901636288584872?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/1754901636288584872/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=1754901636288584872' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1754901636288584872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1754901636288584872'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/03/arcgis-server-java-adf-5.html' title='ArcGIS Server Java ADF 案例教程 5'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__ZvvWze6o0c/SctKp_vMj5I/AAAAAAAACRU/B26JausphFs/s72-c/2009-3-26+11-48-52.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-9076600119111027980</id><published>2009-03-19T23:11:00.002+08:00</published><updated>2009-03-19T23:20:39.155+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 4</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ADF是什么&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;说了半天的ADF，突然发现到底ADF是什么还一直没提。突然想到有人在网上恶搞了“卧槽泥马”源自《战国策》，居然还有报纸以此引经据典拽了一把酸文，捧腹之余顿感正本清源的重要。我们的ADF全称是ArcGIS Java Web Application Developer Framework，一般简称Java ADF，在这里我就直接称呼ADF了。从这个名字也可以看到ADF的实质，它是为了开发Web应用而生的一套开发框架，开发人员可以在ADF的基础上相对比较容易地开发出WebGIS应用。相比ArcGIS Server其它的客户端API，用ADF开发的应用功能最强大，对浏览器要求最低。&lt;br /&gt;&lt;br /&gt;让我们从帮助文档里的一张图开始，先感性认识一下ADF包含的内容吧。虽然我看过不少描述ADF的图表，但是我认为，这张图，是最简介明了的。&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/ScJipDDVBfI/AAAAAAAACRM/y3p8UVLU4Y0/s1600-h/2009-3-19+23-19-36.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 306px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/ScJipDDVBfI/AAAAAAAACRM/y3p8UVLU4Y0/s400/2009-3-19+23-19-36.png" alt="" id="BLOGGER_PHOTO_ID_5314918967584032242" border="0" /&gt;&lt;/a&gt;图 1  ADF的组成部分&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;大概来讲，ADF主要是由一些JSF组件、实现GIS相关功能的Java类库、支持AJAX的JavaScript脚本库和一些帮助文档及例子的集合。&lt;br /&gt;&lt;br /&gt;在图 1中，首先你需要把最下面的那些“Data Sources”理解成服务。不管是ArcGIS Server或者是ArcIMS等发布的服务都可以作为ADF的数据源。在这些服务之上，ADF内部通过不同的API（“Common Data Source API”）去使用这些服务，当然，这些API上层会有相应的类库（“Web ADF consolidation classes”）进行支持。在这之上就是与开发者关系最直接的ADF的“Web Controls”（Map、TOC等基本GIS功能）和“Task Framework”（完成比如查询、分析等定制的任务），事实上，我们可以把这两部分看成一个整体——Web组件。这些Web组件包含了JSF组件以及相应的AJAX操作所需的JavaScript脚本库（“Web ADF JavaScript”）；它们都会在用户请求的时候被ADF通过一定的规则渲染成对应的DHTML后输出到浏览器。图 1的左上角就是浏览器端，事实上在浏览器中已经基本看不到ADF的影子了，因为用户看到的页面不过是一些HTML和JavaScript脚本的组合，页面会和服务器上的某些ADF对象进行交互，但是这对浏览器来说基本是透明的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-9076600119111027980?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/9076600119111027980/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=9076600119111027980' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/9076600119111027980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/9076600119111027980'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/03/arcgis-server-java-adf-4.html' title='ArcGIS Server Java ADF 案例教程 4'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__ZvvWze6o0c/ScJipDDVBfI/AAAAAAAACRM/y3p8UVLU4Y0/s72-c/2009-3-19+23-19-36.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5419575814077030380</id><published>2009-03-18T15:45:00.004+08:00</published><updated>2009-03-19T23:22:36.377+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 3</title><content type='html'>&lt;span style="font-weight: bold;"&gt;JSF的直观印象&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;如果我是一个项目经理，我当然最喜欢的是又会写代码，又会做美工，顺便最好还能陪我对战几把Warcraft的全能型选手——最好要的薪水也可以少一点。不过，自古文武全才型的选手就比较难得，手下能有一些懂一点美工的程序员或者懂一点代码的美工就已经很不错了。&lt;br /&gt;&lt;br /&gt;因此，各种Web开发框架都希望做到的事情是尽量把页面设计和后台逻辑分离开。这里不仅仅涉及到MVC的实现，还在于开发者角色的分离。做美工的希望面向的是一个纯粹的页面设计工作，直接和HTML和CSS打交道会让他们非常舒服和得心应手；而程序员（不管是写页面上的JavaScript还是后台的Java /PHP/.Net…）一般都不喜欢去掺合页面的设计。&lt;br /&gt;&lt;br /&gt;JSF一方面有自己的标签库，使得美工可以使用类HTML的标签来设计页面，这样可以实现和程序员角色的分离；另一方面，JSF希望不仅做到这样的分离，而且希望带给程序员在进行Web开发时，来回徜徉于可能远隔千里之外的浏览器和服务器之上的时候，能够有更好的体验。&lt;br /&gt;&lt;br /&gt;让我们看一下下面在一个JSF页面中的一段标签：&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&amp;lt;h:commandbutton value="确定" actionlistener="#{user.verify}"&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;h:commandbutton value="确定" actionlistener="#{user.verify}"&gt;&lt;/h:commandbutton&gt;&lt;/span&gt;&lt;br /&gt;在这里出现的“#{…}”中包含的内容是在JSF页面中绑定的服务器端的JavaBean对象，在这里是“user”。“user.verify”是“user”对象的一个监听。我们看一下与其相对应的Java代码吧：&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;public void verify(ActionEvent e)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    this.outcome = "login";&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;这样的组合让JSF应用在页面点击那个“commandButton”的时候，服务器会监听到浏览器发来的请求，然后执行相应的代码，在这里让“user”对象的outcome属性值变成“login”。&lt;br /&gt;&lt;br /&gt;至于页面怎么向服务器发送请求，服务器怎么监听到请求等等细节，JSF都已经封装了起来，无需你去多考虑和写多余的代码。你只需要派美工做好设计，然后使用JSF相应的标签组织好页面；然后派程序员把后台的功能具体实现了，JSF会帮你把浏览器和服务器联系起来，完成你设计的功能。&lt;br /&gt;&lt;br /&gt;嗯，到这里你或许会已经对JSF有一个直观的印象了：MVC、页面绑定服务器端对象。当然，JSF更多的优点和特色还有很多，建议你找一本JSF的教材，内容肯定会很详细，我在这里就不多讲了。不过，关于JSF应用中比较重要的比如配置文件、事件处理、请求的生命周期等内容，我也会在后续的ADF讲解中根据需要做一些详细的解释的。好了，JSF这个幕后英雄就先了解到这里吧，让我们先尽早地接触到ADF再说。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5419575814077030380?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5419575814077030380/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5419575814077030380' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5419575814077030380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5419575814077030380'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/03/arcgis-server-java-adf-3.html' title='ArcGIS Server Java ADF 案例教程 3'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-1321900095704839711</id><published>2009-03-18T15:44:00.003+08:00</published><updated>2009-03-19T23:21:29.482+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 2</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ADF为什么选择JSF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;为什么ESRI会选择JSF作为ArcGIS Java ADF的基础框架，想来你也不会很关心，因为这已经是一个既成事实了（说这句话的时候我感觉很对不起我这个小标题）。我以前是用PHP写Web应用的，也没用过Struts、Spring之类的框架，因此也就无从比较JSF与它们的优劣。有句话说的好，生活就像某件事情，如果你不能去反抗，那就闭上眼就享受吧。如果你要使用ArcGIS Java ADF开发，那么你还可以对框架挑三拣四么？好了，既然你无能为力，那么就开始享受它吧。&lt;br /&gt;&lt;br /&gt;为了给自己再找点心理上的安慰，证明自己没有吃亏，你可以和我一样无聊地去Google搜一下关于JSF和Struts、Spring的相关页面数量，并把它作为一个框架流行度的大体指标。我在2009.3.16这一天得到的结果是JSF：约15700000，Struts：约14500000——至于Spring，这个名字实在是有太多的含义了，忽略了吧——这时，你发现原来全世界有这么多人和你一样在“享受”着JSF，是不是心里踏实了很多呢？&lt;br /&gt;&lt;br /&gt;好了，如果你还没有接触过JSF，那就让我们开始试着去享受JSF吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-1321900095704839711?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/1321900095704839711/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=1321900095704839711' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1321900095704839711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/1321900095704839711'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/03/arcgis-server-java-adf-2.html' title='ArcGIS Server Java ADF 案例教程 2'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-5717353931636798279</id><published>2009-03-16T23:18:00.002+08:00</published><updated>2009-03-19T23:21:09.482+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 1</title><content type='html'>&lt;span style="font-weight: bold;"&gt;前言&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;如果你开始学ArcGIS Server Java ADF，你会在第一时间发现相关资料的缺乏。手上最靠谱的资料就是自带的Help文件，可是当你虔诚地点开 “Open Java Help”以后一看，章节倒是不少，可是每一篇都是那么出人意料的短小精悍——这可不是因为英文比较精炼的缘故。好吧，吐血之余如果你能通过Google在浩瀚的互联网挖掘一下，你应该会如获至宝地发现前辈高人CJ的Java ADF教程，恭喜你，你基本已经找到中文Java ADF开发资料大约一半的内容了。&lt;br /&gt;&lt;br /&gt;相比 .Net ADF的开发资料，你不禁会发出一声感慨：“真是穷的穷死，富的富死啊！”。唉，不用多抱怨这个社会的不公了，想想CJ写那篇教程（2007.8左右）之前的岁月，想想那个时候受苦受难的弟兄们，现在好歹算是解放了吧。&lt;br /&gt;&lt;br /&gt;转眼解放也快2年了，Java ADF的资料还是一如既往的少——同时，ArcGIS Server已经从9.2更新到了9.3，CJ的教程是基于9.2的，有一些内容已经和9.3对不上了——这些都成为了我写这篇教程的原因之一。&lt;br /&gt;&lt;br /&gt;在我学习Java ADF的时候，非常幸运有一个ADF高手同事在我边上充当我的活字典（在这里我向他表示万分感谢）。由于我有问题马上能够得到解答，还能举一反三，这让我摸索的这个过程变得比较愉快。在我上学的时候就不喜欢看那些可以充当手册的教材，而是比较喜欢听谁来给我把知识像故事一样地娓娓道来——至今我还非常想念当年在实验室的一个师兄，感谢他在带我入门GIS世界时候的循循善诱和耐心教导，顺便也遥祝他在新加坡的学习生活愉快。&lt;br /&gt;&lt;br /&gt;希望这篇教程也能给你带来类似的感觉！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-5717353931636798279?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/5717353931636798279/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=5717353931636798279' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5717353931636798279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/5717353931636798279'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/03/arcgis-server-java-adf-1.html' title='ArcGIS Server Java ADF 案例教程 1'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-4776334711709295268</id><published>2009-03-16T23:05:00.002+08:00</published><updated>2009-03-16T23:10:46.622+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS Server Java ADF 案例教程 0</title><content type='html'>开始写一个ArcGIS Server Java ADF 的参考资料，希望可以坚持写完。&lt;br /&gt;&lt;br /&gt;——2009.3.16&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-4776334711709295268?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/4776334711709295268/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=4776334711709295268' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4776334711709295268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/4776334711709295268'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/03/arcgis-server-java-adf-0.html' title='ArcGIS Server Java ADF 案例教程 0'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-3119695888869297309</id><published>2009-03-03T13:54:00.001+08:00</published><updated>2009-03-03T14:00:34.155+08:00</updated><title type='text'>招聘信息</title><content type='html'>ESRI中国在这段时间可能需要招收一些技术人员，需要精通ArcGIS产品与服务器技术（.Net或J2EE），如果有能力并且有兴趣的话可以和我联系（给我发邮件），或者自己联系：&lt;a href="http://www.esrichina-bj.cn/templates/T_yestem_News/index.aspx?nodeid=54&amp;amp;page=ContentPage&amp;amp;contentid=4&amp;amp;departmentid=3"&gt;招聘信息&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1109386848296845044-3119695888869297309?l=wu-yongfeng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wu-yongfeng.blogspot.com/feeds/3119695888869297309/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1109386848296845044&amp;postID=3119695888869297309' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3119695888869297309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1109386848296845044/posts/default/3119695888869297309'/><link rel='alternate' type='text/html' href='http://wu-yongfeng.blogspot.com/2009/03/blog-post.html' title='招聘信息'/><author><name>牛魔王</name><uri>http://www.blogger.com/profile/14220620129375725294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/__ZvvWze6o0c/SbdaUks0e4I/AAAAAAAACQs/B1q8IsONSyU/S220/dog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1109386848296845044.post-383585963155615398</id><published>2009-02-23T11:51:00.006+08:00</published><updated>2009-02-23T12:30:51.834+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS API for Flex 客户端绘图性能测试</title><content type='html'>&lt;!--[if !mso]&gt; &lt;style&gt; v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} &lt;/style&gt; &lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;o:officedocumentsettings&gt;  &lt;o:relyonvml/&gt;  &lt;o:allowpng/&gt; &lt;/o:OfficeDocumentSettings&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:worddocument&gt;  &lt;w:view&gt;Normal&lt;/w:View&gt;  &lt;w:zoom&gt;0&lt;/w:Zoom&gt;  &lt;w:trackmoves&gt;false&lt;/w:TrackMoves&gt;  &lt;w:trackformatting/&gt;  &lt;w:punctuationkerning/&gt;  &lt;w:drawinggridverticalspacing&gt;7.8 磅&lt;/w:DrawingGridVerticalSpacing&gt;  &lt;w:displayhorizontaldrawinggridevery&gt;0&lt;/w:DisplayHorizontalDrawingGridEvery&gt;  &lt;w:displayverticaldrawinggridevery&gt;2&lt;/w:DisplayVerticalDrawingGridEvery&gt;  &lt;w:validateagainstschemas/&gt;  &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;  &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;  &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;  &lt;w:donotpromoteqf/&gt;  &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;  &lt;w:lidthemeasian&gt;ZH-CN&lt;/w:LidThemeAsian&gt;  &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;  &lt;w:compatibility&gt;   &lt;w:spaceforul/&gt;   &lt;w:balancesinglebytedoublebytewidth/&gt;   &lt;w:donotleavebackslashalone/&gt;   &lt;w:ultrailspace/&gt;   &lt;w:donotexpandshiftreturn/&gt;   &lt;w:adjustlineheightintable/&gt;   &lt;w:breakwrappedtables/&gt;   &lt;w:snaptogridincell/&gt;   &lt;w:wraptextwithpunct/&gt;   &lt;w:useasianbreakrules/&gt;   &lt;w:dontgrowautofit/&gt;   &lt;w:splitpgbreakandparamark/&gt;   &lt;w:dontvertaligncellwithsp/&gt;   &lt;w:dontbreakconstrainedforcedtables/&gt;   &lt;w:dontvertalignintxbx/&gt;   &lt;w:word11kerningpairs/&gt;   &lt;w:cachedcolbalance/&gt;   &lt;w:usefelayout/&gt;  &lt;/w:Compatibility&gt;  &lt;m:mathpr&gt;   &lt;m:mathfont val="Cambria Math"&gt;   &lt;m:brkbin val="before"&gt;   &lt;m:brkbinsub val="&amp;#45;-"&gt;   &lt;m:smallfrac val="off"&gt;   &lt;m:dispdef/&gt;   &lt;m:lmargin val="0"&gt;   &lt;m:rmargin val="0"&gt;   &lt;m:defjc val="centerGroup"&gt;   &lt;m:wrapindent val="1440"&gt;   &lt;m:intlim val="subSup"&gt;   &lt;m:narylim val="undOvr"&gt;  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;  &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;  &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;  &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;  &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;  &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;  &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;  &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;  &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;  &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;  &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;  &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;  &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;  &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;  &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;  &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;  &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;  &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;  &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;  &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;  &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;  &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;  &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;  &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;  &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;  &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;  &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;  &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;  &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;  &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;  &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;  &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;  &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;  &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;  &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;  &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;  &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;  &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;  &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;  &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;  &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;  &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;  &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;  &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;  &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;  &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;  &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;  &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;  &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;  &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;  &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;  &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;  &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;  &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;  &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;  &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;  &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;  &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;  &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;  &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;  &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt; &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!-- /* Font Definitions */ @font-face  {font-family:宋体;  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-alt:SimSun;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;} @font-face  {font-family:黑体;  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-alt:SimHei;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:1 135135232 16 0 262144 0;} @font-face  {font-family:"Cambria Math";  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:1;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:Cambria;  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:0;  mso-generic-font-family:roman;  mso-font-pitch:variable;  mso-font-signature:-1610611985 1073741899 0 0 159 0;} @font-face  {font-family:Calibri;  panose-1:2 15 5 2 2 2 4 3 2 4;  mso-font-charset:0;  mso-generic-font-family:swiss;  mso-font-pitch:variable;  mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face  {font-family:微软雅黑;  panose-1:2 11 5 3 2 2 4 2 2 4;  mso-font-charset:134;  mso-generic-font-family:swiss;  mso-font-pitch:variable;  mso-font-signature:-2147483001 705641554 22 0 262175 0;} @font-face  {font-family:"\@宋体";  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;} @font-face  {font-family:"\@微软雅黑";  panose-1:2 11 5 3 2 2 4 2 2 4;  mso-font-charset:134;  mso-generic-font-family:swiss;  mso-font-pitch:variable;  mso-font-signature:-2147483001 705641554 22 0 262175 0;} @font-face  {font-family:"\@黑体";  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  mso-pagination:none;  font-size:10.5pt;  mso-bidi-font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:宋体;  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;  mso-font-kerning:1.0pt;} h2  {mso-style-priority:9;  mso-style-qformat:yes;  mso-style-link:"标题 2 Char";  mso-style-next:正文;  margin-top:13.0pt;  margin-right:0cm;  margin-bottom:13.0pt;  margin-left:0cm;  text-align:justify;  text-justify:inter-ideograph;  line-height:173%;  mso-pagination:lines-together;  page-break-after:avoid;  mso-outline-level:2;  font-size:16.0pt;  font-family:"Cambria","serif";  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:major-latin;  mso-fareast-font-family:宋体;  mso-fareast-theme-font:major-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:major-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:major-bidi;  mso-font-kerning:1.0pt;} p.MsoCaption, li.MsoCaption, div.MsoCaption  {mso-style-priority:35;  mso-style-qformat:yes;  mso-style-next:正文;  margin:0cm;  margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  mso-pagination:none;  font-size:10.0pt;  font-family:"Cambria","serif";  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:major-latin;  mso-fareast-font-family:黑体;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:major-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:major-bidi;  mso-font-kerning:1.0pt;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  margin:0cm;  margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  text-indent:21.0pt;  mso-char-indent-count:2.0;  mso-pagination:none;  font-size:10.5pt;  mso-bidi-font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:宋体;  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;  mso-font-kerning:1.0pt;} span.2Char  {mso-style-name:"标题 2 Char";  mso-style-priority:9;  mso-style-unhide:no;  mso-style-locked:yes;  mso-style-link:"标题 2";  mso-ansi-font-size:16.0pt;  mso-bidi-font-size:16.0pt;  font-family:"Cambria","serif";  mso-ascii-font-family:Cambria;  mso-ascii-theme-font:major-latin;  mso-fareast-font-family:宋体;  mso-fareast-theme-font:major-fareast;  mso-hansi-font-family:Cambria;  mso-hansi-theme-font:major-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:major-bidi;  font-weight:bold;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} /* Page Definitions */ @page  {mso-page-border-surround-header:no;  mso-page-border-surround-footer:no;} @page Section1  {size:595.3pt 841.9pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:42.55pt;  mso-footer-margin:49.6pt;  mso-paper-source:0;  layout-grid:15.6pt;} div.Section1  {page:Section1;} /* List Definitions */ @list l0  {mso-list-id:612327001;  mso-list-type:hybrid;  mso-list-template-ids:2044870276 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1  {mso-level-tab-stop:none;  mso-level-number-position:left;  margin-left:42.0pt;  text-indent:-21.0pt;} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt; /* Style Definitions */ table.MsoNormalTable  {mso-style-name:普通表格;  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-para-margin:0cm;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.5pt;  mso-bidi-font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-font-kerning:1.0pt;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;h2&gt;&lt;span style="font-family:宋体;"&gt;测试环境&lt;/span&gt;&lt;/h2&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;"  lang="EN-US"&gt;Windows XP SP3&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;" &gt;，&lt;span lang="EN-US"&gt;3G&lt;/span&gt;内存，&lt;span lang="EN-US"&gt;Firefox 3.0.6&lt;/span&gt;，&lt;span lang="EN-US"&gt;Flash&lt;/span&gt;插件&lt;span lang="EN-US"&gt; 10.0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;h2&gt;&lt;span style="font-family:宋体;"&gt;测试方法&lt;/span&gt;&lt;/h2&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span style="font-family:宋体;"&gt;通过改变客户端绘制的&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;对象个数、&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;种类、属性等因素，记录程序执行时间的变化。在客户端绘制的时候，&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;对象的生命周期一般经历了创建&lt;/span&gt;&lt;span lang="EN-US"&gt;-&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;渲染&lt;/span&gt;&lt;span lang="EN-US"&gt;-&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;移除这样一个过程，因此本测试中主要测量的分别是&lt;b style=""&gt;生成所有&lt;/b&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family:宋体;"&gt;对象所花时间、将所有&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family:宋体;"&gt;渲染所花时间、清楚所有&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;/b&gt;&lt;b style=""&gt;&lt;span style="font-family:宋体;"&gt;所花时间&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:宋体;"&gt;。另外需要注意的是，&lt;/span&gt;&lt;span lang="EN-US"&gt;Flex&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;对时间的测量有大概几十毫秒的误差，因此小时间的测量结果的相对误差比较大。测试数据依赖硬件和系统环境，因此仅供参考。&lt;/span&gt;&lt;/p&gt;  &lt;h2&gt;&lt;span style="font-family:宋体;"&gt;测试过程&lt;/span&gt;&lt;/h2&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span style="font-family:宋体;"&gt;首先确定&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;对象数量的变化取值，我对当前地图的&lt;/span&gt;&lt;span lang="EN-US"&gt;x&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;y&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;方向分别取相同等分，将地图分别使用&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;20&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;30&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;40&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;50&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;60&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;70&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;100&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;等分分割后进行测试。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span style="font-family:宋体;"&gt;测试分成&lt;/span&gt;&lt;span lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个部分，第一部分是点要素：&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span style="font-family:宋体;"&gt;点要素全部采用圆形符号表示，采用&lt;/span&gt;&lt;span lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个半径：&lt;/span&gt;&lt;span lang="EN-US"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;，&lt;/span&gt;&lt;span lang="EN-US"&gt;6&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;，&lt;/span&gt;&lt;span lang="EN-US"&gt;12&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SaIeo4Q-bvI/AAAAAAAACP8/b-G5SLqzbK8/s1600-h/2009-2-23+11-56-05.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 230px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SaIeo4Q-bvI/AAAAAAAACP8/b-G5SLqzbK8/s400/2009-2-23+11-56-05.png" alt="" id="BLOGGER_PHOTO_ID_5305836998643052274" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style=""&gt;&lt;v:shapetype id="_x0000_t75" coordsize="21600,21600" spt="75" preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"&gt; &lt;v:stroke joinstyle="miter"&gt; &lt;v:formulas&gt;  &lt;v:f eqn="if lineDrawn pixelLineWidth 0"&gt;  &lt;v:f eqn="sum @0 1 0"&gt;  &lt;v:f eqn="sum 0 0 @1"&gt;  &lt;v:f eqn="prod @2 1 2"&gt;  &lt;v:f eqn="prod @3 21600 pixelWidth"&gt;  &lt;v:f eqn="prod @3 21600 pixelHeight"&gt;  &lt;v:f eqn="sum @0 0 1"&gt;  &lt;v:f eqn="prod @6 1 2"&gt;  &lt;v:f eqn="prod @7 21600 pixelWidth"&gt;  &lt;v:f eqn="sum @8 21600 0"&gt;  &lt;v:f eqn="prod @7 21600 pixelHeight"&gt;  &lt;v:f eqn="sum @10 21600 0"&gt; &lt;/v:f&gt; &lt;v:path extrusionok="f" gradientshapeok="t" connecttype="rect"&gt; &lt;o:lock ext="edit" aspectratio="t"&gt; &lt;/o:lock&gt;&lt;v:shape id="_x0000_i1033" type="#_x0000_t75" style="width: 417pt; height: 243pt; visibility: visible;" ole="" gfxdata="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 eXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAK0wP/HBAAAAMgEAAAsAAAAAAAAAAAAAAAAAWwEAAF9y ZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhACiyvOqEAQAAGgQAAB8AAAAAAAAAAAAAAAAARQIAAGNs aXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWxQSwECLQAUAAYACAAAACEAEi7a7dEAAABBAQAA JgAAAAAAAAAAAAAAAAAGBAAAY2xpcGJvYXJkL2NoYXJ0cy9fcmVscy9jaGFydDEueG1sLnJlbHNQ SwECLQAUAAYACAAAACEAZwPuhs4AAACsAQAAKgAAAAAAAAAAAAAAAAAbBQAAY2xpcGJvYXJkL2Ry YXdpbmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzUEsBAi0AFAAGAAgAAAAhAOFRNx/PBgAA5hsA ABoAAAAAAAAAAAAAAAAAMQYAAGNsaXBib2FyZC90aGVtZS90aGVtZTEueG1sUEsBAi0AFAAGAAgA AAAhAFJjta6gBAAA9BQAABsAAAAAAAAAAAAAAAAAOA0AAGNsaXBib2FyZC9jaGFydHMvY2hhcnQx LnhtbFBLAQItABQABgAIAAAAIQAZ11FFtBsAAM0lAAA1AAAAAAAAAAAAAAAAABESAABjbGlwYm9h cmQvZW1iZWRkaW5ncy9NaWNyb3NvZnRfT2ZmaWNlX0V4Y2VsX19fXzEueGxzeFBLBQYAAAAACAAI AGcCAAAYLgAAAAA="&gt; &lt;v:imagedata src="file:///C:%5CDOCUME%7E1%5Cwuyf%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.png" title=""&gt; &lt;o:lock ext="edit" aspectratio="f"&gt; &lt;/o:lock&gt;&lt;/v:imagedata&gt;&lt;/v:shape&gt;&lt;/v:path&gt;&lt;/v:f&gt;&lt;/v:f&gt;&lt;/v:f&gt;&lt;/v:f&gt;&lt;/v:f&gt;&lt;/v:f&gt;&lt;/v:f&gt;&lt;/v:f&gt;&lt;/v:f&gt;&lt;/v:f&gt;&lt;/v:f&gt;&lt;/v:formulas&gt;&lt;/v:stroke&gt;&lt;/v:shapetype&gt;&lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;o:oleobject type="Embed" progid="Excel.Chart.8" shapeid="_x0000_i1033" drawaspect="Content" objectid="_1296894976"&gt;  &lt;o:wordfieldcodes&gt;\s&lt;/o:WordFieldCodes&gt; &lt;/o:OLEObject&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style=""&gt;&lt;v:shape id="_x0000_i1032" type="#_x0000_t75" style="width: 417pt; height: 243pt; visibility: visible;" ole="" gfxdata="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 ABQABgAIAAAAIQCtMD/xwQAAADIBAAALAAAAAAAAAAAAAAAAAFsBAABfcmVscy8ucmVsc1BLAQIt ABQABgAIAAAAIQCIK/m/hQEAABoEAAAfAAAAAAAAAAAAAAAAAEUCAABjbGlwYm9hcmQvZHJhd2lu Z3MvZHJhd2luZzEueG1sUEsBAi0AFAAGAAgAAAAhABIu2u3RAAAAQQEAACYAAAAAAAAAAAAAAAAA BwQAAGNsaXBib2FyZC9jaGFydHMvX3JlbHMvY2hhcnQxLnhtbC5yZWxzUEsBAi0AFAAGAAgAAAAh AGcD7obOAAAArAEAACoAAAAAAAAAAAAAAAAAHAUAAGNsaXBib2FyZC9kcmF3aW5ncy9fcmVscy9k cmF3aW5nMS54bWwucmVsc1BLAQItABQABgAIAAAAIQDhUTcfzwYAAOYbAAAaAAAAAAAAAAAAAAAA ADIGAABjbGlwYm9hcmQvdGhlbWUvdGhlbWUxLnhtbFBLAQItABQABgAIAAAAIQDLB/EMpAQAAOgU AAAbAAAAAAAAAAAAAAAAADkNAABjbGlwYm9hcmQvY2hhcnRzL2NoYXJ0MS54bWxQSwECLQAUAAYA CAAAACEAswlxd6EbAAC9JQAANQAAAAAAAAAAAAAAAAAWEgAAY2xpcGJvYXJkL2VtYmVkZGluZ3Mv TWljcm9zb2Z0X09mZmljZV9FeGNlbF9fX18xLnhsc3hQSwUGAAAAAAgACABnAgAACi4AAAAA"&gt; &lt;v:imagedata src="file:///C:%5CDOCUME%7E1%5Cwuyf%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image002.png" title=""&gt; &lt;o:lock ext="edit" aspectratio="f"&gt; &lt;/o:lock&gt;&lt;/v:imagedata&gt;&lt;/v:shape&gt;&lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;o:oleobject type="Embed" progid="Excel.Chart.8" shapeid="_x0000_i1032" drawaspect="Content" objectid="_1296894977"&gt;  &lt;o:wordfieldcodes&gt;\s&lt;/o:WordFieldCodes&gt; &lt;/o:OLEObject&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style=""&gt;&lt;v:shape id="_x0000_i1031" type="#_x0000_t75" style="width: 417pt; height: 243pt; visibility: visible;" ole="" gfxdata="UEsDBBQABgAIAAAAIQAOHHsvKgEAAAwDAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbKxSyU7DMBC9 I/EPlq+occsBIZSkB5YjcCgfMNiTxsKxLY9b0r9nkqaXCkWq4OLxonnLPJfrvnNij4ls8JVcFUsp 0OtgrN9W8mPzsriXgjJ4Ay54rOQBSa7r66tyc4hIgrs9VbLNOT4oRbrFDqgIET2/NCF1kPmYtiqC /oItqtvl8k7p4DP6vMgDhqzLNxaQrEHxDim/Qsc8SjsbPwMko3TLt3Qsq4JxpXg8AgwaKgkxOqsh swO19+aMfRGaxmo0Qe865ixMgm8217lixL0Z8FRdPmEDO5fFc8/KjsNI6OgyqslkwZ2jHGptpBmG eS+TsvnhTHZITZt/G9BJ9jx95sBRjevfmUeYE+8vgfSO+ssCOcueYkIw1CJmzn+sQ/Zq/Mv1DwAA AP//AwBQSwMEFAAGAAgAAAAhAK0wP/HBAAAAMgEAAAsAAABfcmVscy8ucmVsc4SPzQrCMBCE74Lv EPZu03oQkaa9iOBV9AHWZNsG2yRk49/bm4ugIHibZdhvZur2MY3iRpGtdwqqogRBTntjXa/gdNwt 1iA4oTM4ekcKnsTQNvNZfaARU37iwQYWmeJYwZBS2EjJeqAJufCBXHY6HydM+Yy9DKgv2JNcluVK xk8GNF9MsTcK4t5UII7PkJP/s33XWU1br68TufQjQpqI97wsIzH2lBTo0Yazx2jeFr9FVeTmIJta fi1tXgAAAP//AwBQSwMEFAAGAAgAAAAhACJjyCCFAQAAGgQAAB8AAABjbGlwYm9hcmQvZHJhd2lu Z3MvZHJhd2luZzEueG1spFNLTsMwEN0jcQfLe5r0kxZFTbugFLGBSsABRo7TRCROZLshPQsrdpyC 2yBxDMapUUxBArUbazzjeTPz3ng6b4qc1FyqrBQR7fd8SrhgZZyJdUQf7pdn55QoDSKGvBQ8oluu 6Hx2ejKFcC2hSjNGEEGoECKaal2FnqdYygtQvbLiAmNJKQvQeJVrL5bwhMhF7g18f+wVkAk666AW oIFsZHYAVF6yRx5fgKhBIWTOQtdje8zZ8cgQivpKVnfVSprO2U29kiSLI4rMCSiQIurZgH2GV28v a90BNIkszPsySUjTomzN2WLwRhOGzmAwGQ37WIBhbOhPxsEksFXS21/yWHr5RyY2tCuMhtOMlXQp cRDTlBm1Fbn17E8cfE38/vz28fJKRs7kblZHgOs1+LaeYx6xAiwFqVF7FraW1fwQyXdIFkD+Z2dQ vYzxRck2BRd6t92S56DxW6k0qxQlMjRbIq/jvqGp5b2lw0zs3g0ZxyzFd2k7xrHG3q9wq/7o4hMA AP//AwBQSwMEFAAGAAgAAAAhABIu2u3RAAAAQQEAACYAAABjbGlwYm9hcmQvY2hhcnRzL19yZWxz L2NoYXJ0MS54bWwucmVsc4TPTUvEMBAG4LvgfwhzN9N6EJGme1FhDyLIei4xmbZh80UmSvffGwXB BcG5DcM8L++w24IXH1TYpaiglx0IiiZZFxcFr4fHq1sQXHW02qdICk7EsBsvL4YX8rq2J15dZtGU yArWWvMdIpuVgmaZMsV2mVMJura1LJi1OeqF8LrrbrD8NmA8M8XeKih724M4nHJL/t9O8+wM3Sfz HijWPyJ+0hupy0JVgZRI4Y3sV1/GJ2dK4jTX6fmbmh42Q35q08vN8wY4DnhWfPwEAAD//wMAUEsD BBQABgAIAAAAIQBnA+6GzgAAAKwBAAAqAAAAY2xpcGJvYXJkL2RyYXdpbmdzL19yZWxzL2RyYXdp bmcxLnhtbC5yZWxzrJDNasMwDIDvg72D0X1W0sMYo04vpdDr6B5AOMoPTWxjqWV9+5kWxgKFXnqR kIQ+fWi9+Zknc+YsYwwOaluB4eBjO4bewfdh9/YBRpRCS1MM7ODCApvm9WX9xRNpWZJhTGIKJYiD QTV9IoofeCaxMXEoky7mmbSUucdE/kg946qq3jH/Z0CzYJp96yDv2xWYwyWVy4/ZsetGz9voTzMH vXMCtXhxAVLuWR1Ye+vcYm2LK+B9jfqZGn6grAuNa0fwmv48cPHj5hcAAP//AwBQSwMEFAAGAAgA AAAhAOFRNx/PBgAA5hsAABoAAABjbGlwYm9hcmQvdGhlbWUvdGhlbWUxLnhtbOxZzW/cRBS/I/E/ jHxvs9/NRt1U2c1uA23aKNkW9Thrz9rTjD3WzGzSvaH2iISEKIgDlbhxQEClVuJS/ppAERSp/wJv ZmyvJ+uQtI2gguaQtZ9/877fm6/LV+7FDB0QISlPel79Ys1DJPF5QJOw590ajy6sekgqnASY8YT0 vDmR3pX199+7jNd8RtMJxyIYRyQmCBglcg33vEipdG1lRfpAxvIiT0kC36ZcxFjBqwhXAoEPQUDM Vhq1WmclxjTx1oGj0oyGDP4lSmqCz8SeZkNQgmOQfnM6pT4x2GC/rhFyLgdMoAPMeh7wDPjhmNxT HmJYKvjQ82rmz1tZv7yC17JBTJ0wtjRuZP6ycdmAYL9hZIpwUgitj1rdS5sFfwNgahk3HA4Hw3rB zwCw74OlVpcyz9Zotd7PeZZA9nGZ96DWrrVcfIl/c0nnbr/fb3czXSxTA7KPrSX8aq3T2mg4eAOy +PYSvtXfGAw6Dt6ALL6zhB9d6nZaLt6AIkaT/SW0DuholHEvIFPOtirhqwBfrWXwBQqyocguLWLK E3VSrsX4LhcjAGggw4omSM1TMsU+5OQAxxNBsRaA1wgufbEkXy6RtCwkfUFT1fM+THHilSAvn33/ 8tkTdHT/6dH9n44ePDi6/6Nl5IzawklYHvXi28/+fPQx+uPJNy8eflGNl2X8rz988svPn1cDoXwW 5j3/8vFvTx8//+rT3797WAHfEHhSho9pTCS6QQ7RLo/BMOMVV3MyEa82YhxhWh6xkYQSJ1hLqeA/ VJGDvjHHLIuOo0efuB68LaB9VAGvzu46Cu9FYqZoheRrUewAtzlnfS4qvXBNyyq5eTxLwmrhYlbG 7WJ8UCV7gBMnvsNZCn0zT0vH8EFEHDV3GE4UDklCFNLf+D4hFdbdodTx6zb1BZd8qtAdivqYVrpk TCdONi0GbdEY4jKvshni7fhm+zbqc1Zl9SY5cJFQFZhVKD8mzHHjVTxTOK5iOcYxKzv8OlZRlZJ7 c+GXcUOpINIhYRwNAyJl1ZibAuwtBf0aho5VGfZtNo9dpFB0v4rndcx5GbnJ9wcRjtMq7B5NojL2 A7kPKYrRDldV8G3uVoh+hzjg5MRw36bECffp3eAWDR2VFgmiv8yEjiW0aqcDxzT5u3bMKPRjmwPn 146hAT7/+lFFZr2tjXgD5qSqStg61n5Pwh1vugMuAvr299xNPEt2CKT58sTzruW+a7nef77lnlTP Z220i94KbVevG+yi2CyR4xNXyFPK2J6aM3JdmkWyhHkiGAFRjzM7QVLsmNIIHrO+7uBCgc0YJLj6 iKpoL8IpLLDrnmYSyox1KFHKJWzsDLmSt8bDIl3ZbWFbbxhsP5BYbfPAkpuanO8LCjZmtgnN5jMX 1NQMziqseSljCma/jrC6VurM0upGNdPqHGmFyRDDZdOAWHgTFiAIli3g5Q7sxbVo2JhgRgLtdzv3 5mExUTjPEMkIBySLkbZ7OUZ1E6Q8V8xJAORORYz0Ju8Ur5WkdTXbN5B2liCVxbVOEJdH702ilGfw Ikq6bo+VI0vKxckSdNjzuu1G20M+TnveFPa08BinEHWp13yYhXAa5Cth0/7UYjZVvohmNzfMLYI6 HFNYvy8Z7PSBVEi1iWVkU8N8ylKAJVqS1b/RBreelwE2019Di+YqJMO/pgX40Q0tmU6Jr8rBLlG0 7+xr1kr5TBGxFwWHaMJmYhdD+HWqgj0BlXA0YTqCfoFzNO1t88ltzlnRlU+vDM7SMUsjnLVbXaJ5 JVu4qeNCB/NWUg9sq9TdGPfqppiSPydTymn8PzNFzydwUtAMdAR8OJQVGOl67XlcqIhDF0oj6o8E LBxM74BsgbNY+AxJBSfI5leQA/1ra87yMGUNGz61S0MkKMxHKhKE7EBbMtl3CrN6NndZlixjZDKq pK5MrdoTckDYWPfAjp7bPRRBqptukrUBgzuef+57VkGTUC9yyvXm9JBi7rU18E+vfGwxg1FuHzYL mtz/hYoVs6odb4bnc2/ZEP1hscxq5VUBwkpTQTcr+9dU4RWnWtuxlixutHPlIIrLFgOxWBClcN6D 9D+Y/6jwmb1t0BPqmO9Cb0Vw0aCZQdpAVl+wCw+kG6QlTmDhZIk2mTQr69ps6aS9lk/W57zSLeQe c7bW7CzxfkVnF4szV5xTi+fp7MzDjq8t7URXQ2SPlyiQpvlGxgSm6tZpG6doEtZ7Htz8QKDvwRPc HXlAa2haQ9PgCS6EYLFkb3F6XvaQU+C7pRSYZk5p5phWTmnllHZOgcVZdl+SUzrQqfQVB1yx6R8P 5bcZsILLbj/ypupcza3/BQAA//8DAFBLAwQUAAYACAAAACEAh4ahdFsEAADmEwAAGwAAAGNsaXBi b2FyZC9jaGFydHMvY2hhcnQxLnhtbOxYzW7bRhC+F+g7sISujkhJlizBUiDLiBHAaYXYyaG3NTmS WC93ieXKkXrsIzQIit6LFmgP7aEomvcpnPYtOvtHWnQpx3GCoEF8kMndb2bnbz/u7P79VUq9CxB5 wtnQD+8Fvgcs4nHC5kP/yemDnT3fyyVhMaGcwdBfQ+7fH336yX40iBZEyJOMROChEpYPoqG/kDIb NJt5tICU5Pd4BgznZlykROKrmDdjQZ6h8pQ2W0HQbWolvlVA3kBBShLm5MXryPPZLIngkEfLFJg0 VgigRGIE8kWS5f4InYuJhLAfdLwLQjEuflMNUsLmZuDrxc7kczOoPVCzMpEU9MNK/YokWoz2yeCM x+upQHkyoLk8kWsK+iVTI9lUqH8xzB5rTLMY0uNiKjy16NA3C3qEymP9DmznyYkygAzk6PL5j/98 /8Orb17uo7wcqV8jrqZLHUam1FE4oYSOBMkWSVTRACyeEkHQuJvsUJbjys5vfJA6DJSs+VKioWrE RSijXI4FEBNUC4gGeUSkBDFRhaWm7LuOmYk7TRg8IuIchAl+DuhoNEjilZkPzDAXMYiNEWNMLsVj mCmJ2ehkASDDzxoHjVDZpkdxfkKwdhUikxO+ZNJosQWQSQ+XGvqBrxAXo7aSvNC+ZSruaHKhwbzo 5fDRrL96SqiSZMv0mh3jRmvQGDf6hTEIKowxO2jCYxgdAQNBqIbpfaVHqwbvmUBUDQ6DYNNk5afx KbQ+deohLQvp10PaFhJ26zEdi2nt1mN2Laa9RU/XYjpb7Ok5ewL823Qds1KG2Ly4bLk8rbfk60Dl 6+Ad56ti8vVshbubTpUIl6ywW4dwuer06hAuU729OoTLU9iqNcSlqRVUtktpq8tSN6w4vCVHJjcI sBxQpQK7Za9QgR2pp4LJHaigEmVl10cq0CT54VPBRFHB5H1TQWXrlLvLMUFbf+jKz1WJcEzQbtXt 81swQaA/Yf+1zC2YoNe/vqHq2PomJmhdOxTYkXomOLwDE4SVIH6kAt/V14dPBYeKCg7fNxW8xqmg 9nPtcnXzqaBf+z1/u6eCXr9yQLnFqYCsHsb2CN8JOq1et2NPxpWJ/m5XT6jNWulCsAMc61amIlLq QglsTObqZM9Fgl2lbibNsmnCHpGVYiCj2gHJaspzAzkz/FR0R4aW3m7/+Aa9n9jsHrd2oH/9+fPl i982msdbNYRI7Q9S6ZVtztC3fQ5eP/CliOA4YecQF614Sr7i4jSJzlU3aMLI8ILCRTI6Pz6jRYAZ rOQpN3OR4Hk+tu1iqGrCpR5vNNQc2KyQpeRfgrgqdgDyGQBziY0nRNrEFjVSPFSKpVzkjsVCjRva /yORxKojzrG6rnTX76J+tmb/799fXn73x+Wvv7z66dv/bRmU2/nOZYA7feOGA+Z4j6JSRPVTUZf2 EuPqFYlBKKzS8DTJv2B0bQpOty+ourhwwqoGwQg9JJJ4Ai9Bhr54GG/A9PXc6F8AAAD//wMAUEsD BBQABgAIAAAAIQAK6EWY9BgAAKoiAAA1AAAAY2xpcGJvYXJkL2VtYmVkZGluZ3MvTWljcm9zb2Z0 X09mZmljZV9FeGNlbF9fX18xLnhsc3jseoVbVGvX/tDdDUM3CENKd3cjoSDdDNIpjaSggEhKNyjd MZR0ipQgiPRIy5DyG4/v+3oO5/y+P+D73j3Xtfe1rz1r7Vnrudez1rrXaKshIRMDUAHoAACAHnBI GIgGRgAA8FEAACLAJwRTObCrp42rp7m+n5uNxyNuXxdnuvx5BLZcACL8+/89/pd5oFJ/RLOXB7+d 8QjvxVu2JyMI9B/q0WiUSuUvAFZgqornLn5NRTcB9zGqAKm55R19sZXZFBPxEhnOjmlV9Hk4ncS9 lnR8h6Lke2RFvpkSG00McrorbGTiKZZYbCzrI3FTzlQI/DlnRrGxbCsqMa1hJhYEDL4r6c/0Ob98 rk/S2SkyCWmnwXYtxM3p1tPEiSJPNDOSrkWtLVM9rXTcfEHFGjOVe4WLNUC0ECQ075Ym279dadg3 vLGYaV7p93qiCpXotNy2Oh+lzVH765sIZVM0Xz6SAeThxyjSDZyik8GvVTr465zTZiYu9aSxWteD Q1pMRIZphLKkyfwRn703viKxhSRX3RgtREtg3yx8tzsmmD6WiNho0XOYZne0udGE5RG6BxSzy6d8 akhGkbZqQUhWioqQJz3Lof6yiTWZ1VFFMOwt4sN/dh5E8w63Uh/xRDXGPLLOPPFgPkj0zHg7afWc xzvbpRiPiW4J5nyNAQDc3iIB/hp7DQY8jN/hgFKHhxYWYBzB3N3G2QPE/fNMlz/835j7XxNr8S8n 4FGGPXCg3C739WrXVRk9r6hNXbmNXp+mm2mftiGhgEkadhaBFKZqtTR1tjUhZbqyv+mgTwu0BGn2 trLJ1PBbBsw5+la9McTLtWSwcyB+T/kcaPFgecXZ3LcwJdNy7qq0Ni6OsjXlmtFSgFqLGOsI6l70 gkdn2MJ+Kpmi1OZTyoZEVBeNNpf4LMQRHS0ArVzyUvyitklAA+wL2gyyTNOMl84hEhvx3pCzxSqb WCrNkB1RCSc5yZohGLpisELKYVl8qHV62yj8hEEtZlJ59UT8c6yH9N5eKPcb+7LzjnHxLyURaxrW 5xaQfjx9c/iy/R3roZIpaafwJ61wrFMC0BF8nUG/4O4DdneyBIOdfmaaf0Ef+Sf04Tnp//ZR+XJC tY8Hf+Ag7AB/03WmmoEhc18hosMxKCRJPbPWhZBv/U1nR17+UqRNxynhue0g7IYv/du+E7APjWU3 /IE2CTP6Kcv8ig/mSsZWJhp+36KpBHIiJgvT/OzcgyUyoMCW2tdLZYY2X93V1+sFKdbA5xmx+FNb mlTTpSIjH4ZKx2R82IRs/EAz00i7RFo1TZjTKyth9sWvk29huC5LVIGYm0HyE3YMTEcCX9GiFUtw jSGJ3HyMgydHmYLrIokoiTt1KSfGjyxLP1qfY+9I475IBAYzv/TYYhhdzuD56il7Ncz+dunY9NXG 56HB5ISKLvhq/x0zi1QhjTrwJ6xwzODBwQDHzJ/REq/zn9z16kAAT9DFQLBMOmQbhb6h3o4ITFnx nHoB1+HC/+Nz3dUBB9p16oPR6o9bii+1eAztU2esCfUQyz88LLXS/Owz4YOlWmkVy19G8vUU8VV1 3FKmwduxHbk9IhlEGw8TsTnugsFXggKjmp5YmC9UM6NE7o3x1lYhDLjgrFJSFD0Rj6NkIaYmf7Up BWwtl8dIbIVSarvS8dKl93534TJRizNgZoKiKUQ0fON0cjuoK5Tn28tpduv2EO3XhR2WWLSe5RFN FxhnTZU2xwbyR8j1i+54s4GtlbqmHTLGr9XA/WbS4OCoQJVxtLzmfY/W1/kNaTWqdfEvJaXRII8S fPm6Gs2kgU5bAU+gQwXmUIjUNbN8flhzFUwAInfRDLnhFVILjVk4ZOKJt2JOZi4/ohdXr/OjLHTE MD1C6ZNOnbmysG9/coTzT96HjDBqzMC9zgJfAeJf3vewt3C3sdbzdHdwtfP4GbAPtTScEHnxO8iu 8Sz2BSu4dJli0PJWq56doUVAt1HvJwvwc14eUKXFFr2H2a6kLTyaLh03ErGtfWfinZsku8+YfS8w qFOqK9Ty6MMVL5FJM0PvOFcOdl1pMXMjT3RK1UcgqnpOWgtdwwjv3NciiP/0Q47LHDR5lQIzn2VF VloM/UGimMgH2kT9BxgwHyi2kt1mNBcZrYnnyeNKO+SSeFK74UlKFWxaA2r+oTzwjcxQQ7358JV6 V520WAHYta4gIL0/OHos2LLhKU/rN08puIl/h2Bp1ndAO/wJM9wJjL+c8BOCHvY2Np4e/9rB/rjh /c/+FZEIwezhwZc/CLvFP3Od9sd/UdwRPVmxjVa504jTqDKoONUltKogcygAxb2yLXGkOWHaJ17w L8lLQUF3H/D5iEM5XtLriBVG1IrLeqDcm0ye4d9S+lzAYlhJfLGbQQ/oRK6HKVY0Hy/AqEY7aFMC ezKQ8l64NGQzFqnMS8dZ/9pa+qaf2KWEvvERxpdTbJELqSVYh2A9bPN+spoUg37PiDxF9JPcQplh WNRn3eHre6WtuuYbu2T/aHw06yVvNCoAoE/1szf4I/487W1cbEB/nP+wGGqsAaZSIO9kPKJVDAC7 sHpTKnmVz9dQ2c8o1ph+WPeVWMn297YT5NfcpXJMVFaODvOXkX0oTJeryxkqfyHIrlCkfIPVzl/X thIzx8ROgF6KF+Nz5tcltZl9tMEJY4jCjU5Kec/11rtml57wKlB+PXdjmfKUuzJAmQOYyLPO6+DH z9DBmXnQ6UEBLk2SR0YIuifkNoKVqnqfg2Snl+8VmZ+spa/QJkMPJo2CNgVGIHogo6FxmeEcB0Fx zTNLIMJS5jrvdwz/H+taoC7/ry62n9qw5ftUd1HexHRuagAJw6k1HCnp7Wp7kUW7KzdCcwmkgEkB w3LYaiggE7PZwPbhzQ3MFeWY1yayprl76VqqaYTxLJyKxehRLZMmb1fa67NPhADFpE+WXZtmqjau sQFXkkaOXuzHlbCPTt/i7RCsu7iP9/WpZlvjQIfmjyZbFlybqMb0yUY+hEDnLhGfdrQafjZ5cohq fZSAEtjRMbtTKeKLVHvegBJ4oOtRtf8Fh81aIOderpd0QEdKAC6FR6Mepjnaub9g5IROEo6ftwOB FU2FTQvpWtvDU0BuKDYnJaOg2iD5VdIANRAHpd8EsELXfDjAfeFuoTIiO00moMN1cIMspzJ60fH0 7Nuendbknl1i4r6UROtt71Q4mhKsq6kd2EMNRFPoeWAefHxFRpv/OSfwYnfNbsPXuO/2eFlpIvhH PRCdRGBuu38rMTjo8ry/INH86ck75E7mw3fotJPRyp7hwPwgmlCXAd7qTWu2cUVedF4vNjf0djUj H4NtAHiUh7O3IWavfQkxQ4nicPe0usBJilhPQY3JHIsRrXlExMlDZzfEycQQ0hvuAEzBIpthcKVd D+dboAaK5X3TJNrOMNYV7TyI6NPxSFwzWgvpk6e/ea6Fzl6zj1v03NynDNT81SpyX/vDQP0HZiRR T0IHzXo5xuiRylFb9Ib1zOWl0jHj9Nmlr90KsjKPDfOvQ3jeJzw40l8rjd8AKFVuH+4ZRdqontn1 gL606soUIvUI7z6PTrEREEKZN0W/FMS+KReAtjmTtijnbRfGb3mN+hG0jLFm4yupUDRqrb+LDtLS pFPgXVwvx+4cWcacmsBHA4JwYC6qWW5vPqG7TnXrOOTQXY7pbxvJFnhfguXXpZwG4mWFGkUOGyma 2rnmM4ZVLbeMsMyirsjur7iIJ8DQv15+GThpPOj81rYS3HnAXbEx473kFx65UvEMTYwsk13ERJQp kd0qSNDqa6uAR23EmOWHcAUNO81oJikBZvpAjcy2cCzk+wLKbt8RDCyk+jBG5wW1+DGsh0WT2NYI x71tW1KaBnqzqqFD7/ImsBtplSu9Lwa53+5uQO2T6nhNNR+Pv0nPNRhbre8xBBWpQ6BCBIYzqtkm JmOltibZjFxCFJbN9pT3Nlci2JEhUEQzs3D+VlIcO6LRQeWrZdduYyN14nF+eb4+xpcDyksd5AUZ GLqvODf5AO4lTIqXWT5hc5jTGRnfzJO8M+hI+mfTokfyYQ/yU2wOxVVbXRNTGePi+ocsPeePMxJS o54FZtW38wKd1pxSpD8U0VzzYK26Dz7oKb6J6XcuD6QZs7V9bYos2Fz27qk5z/wOUkySI9XIZHGU X2oxIK6BqeJWFemTvxnqvHowEpfhHD3FD16u7kRX+yFf9UADbG8LhatxyeKqFC0Sghs3z+goZ44z 3gjzEo55/nxCV1Z1pUk8t9TiDhezljERrtYvKK8gC16jL/FLvhmm2RsOkbruCs9BxEk+IC2pegkN ZC8T6x1vWavyJtzaFW/fIFdjGSqJIko+3MCM9+xoFOfWH8zDYqb/HoCIijYjRme6KkpqJqcLiay9 AA2G/gA7jR/z2OCUSDZoITGxQZU4iCOgMqZ8Cz6IdSatPsav7tlY85XnVqtXLsq5S89Lw7oFO5oC 2CL0hZaZXJBQfcRvP23Vh0WF0rjHft88TQo8aBA89NGSbHwNYWvCywxlOQmuthyqdtzB8WuEkeJM gTatDCUqMPEN5zEzHBa68jDtPjm6vDd551v0gh1N52E9OelJKFuoGm3hbfcPpciJaBWrjjzcc8lT Q+QuQXvbpPtJs2TQ1VDP8Po4OfIsaL4Gy9hw633q7Pq52rHLLNblh/u8dk5jmkQH/KJitOMPn2hy 5ZTU6eGJdTY6qT3CeSFhlv9OYByXj4Vn067qC55WoC8ZYgfOg2u94kIVlnNjlcfkElfFuLnnVfJy rRdo/5i4nOSbc6TgRWMqnNSC1zY/C0cPTz9nmz9qlnp9rbgPPMRdWE+fJbVl7pTGcWqQyaMio1jY QZyKNZakf6Qw8TfmdPidyvmetJN1JWBd8QaqLGpuMdRFp511pMEOYCugobcBzFOhpqzxxcJtRhZ9 Xg4ceVSx4KZMu7c87jk7sSoFIv1IPuetvpdMPk+Tros3PjEq51H3V8GWnWQfLrj3f4rcaY5KXjTq Fy9tpK+uyzLgRmZX+Vgxy6yjbv/wa8PUSt40tKHEV4Iy9lOQDBpL3lvsZAZQggCpnzJegnycbSxr 4tWbz09vL2naHYsjgC+9qHtNbKnr0/kkggmca4Z49TFcnHleTirsbhhdcmRdp4nWZIX7yw7rQR+z HT/3m6haCQlT9BPzDHnYy6DbNgWKuO1vq3Ee/AgiQ2AivXecXUNy72mGP6qeVjFDWvsZYCm2GCcY LHq+Hw9TDNXG+Eg+xhRtHUuOEqLnzg5GFJGcZW25otzpWGS7rc4ntyeNkogBWBDrdRYSiyTnT8U6 GdE0maWEYjGXin+reJsXbtOhH6QjrL1zFKljLpUfHjyYaDQ3tKbxUD739CIaYd3yA2t4DloYogt7 Z1dbwPkRyUTupCuokExUBlsti5HObvZNNc5pDJm9ybULmZBwGXjMzlfMcDJoFUec7F1gbBAV2Lu1 XvZB+9a783tmKoRApafZG7Tp5DG+r8Twvb/sGf+IWVQTVZpnwkYqr6UW90KYFbdbBfc7NaY9FaPV DUyROlSFzs5Cv+sA4xPZ2SSHD3pvhrnXl+P14g4cjuBQ+3t9WI1uXumEBAAoYAMA5L+Q9qf68Hdl GJ+m5pHJgx9ykL0T/Lh5TvxaGVqTrcKUfDaZrm7ug4KViaFITNx2AXsUisIZ4+nf+xnzG2tN7vfL /Ymyw/F2V3cd12t7wksakF7NxEjvwO0F44XnXkCC9UYOSf5XqtsEoR/LZ+vPvit8AI298NiBYNvU HSXqGlbQ2U8zStXYMnCYyTIRfY9ROTemDSsuF1lqEsqOpcPtVXCz9Nvx4a/cvU2XszbOceeYniMC 2QipjGGxQLpENg3WwXNXQEtHGbOxuoRg2iqa9XRa5zmXXXORLoHtxWTohRjIl+OCxrsb9mE4J9JX B6kLgGkxXEydW2xdNjqRdZg/f64iEL58sWyrM5fEsO2x6pQNcvBZLzs7E7d6G3nNwv3G76mwqrJ4 9miA0jDTUrXTk6PHetJlZa8Xv9h7IXGXhcFiG3mbH3BdtuPMQSheFs8R4O1HDwJlPhHUiIS1Mhbf RAOu/Yd89XV1mMtO8ydJ+3Q4FX8QFKzzytmJlheUfkwXERWmHLuyaVzScJt0LxKOchWI0M9rxtPR 4ar3jHATMDGSFRZuoLnXD4HFbxYoxjoW2K+xrR1CB3R7IGWPVISj9wXuO/CWF5Yaxm49J8T9/MlE Na7x1FldrD2w5BVYUZB4llLPx85NOPbbsc5BlT/Kq2LaDneBlXn870deFYo6LnweI6jP1t2MrB4M NlXF9JaN4CRvlMbkLyKvgLcWVs8ZaleoaqE049McLuUX2uZRqoWSqvvV9UZD3Q+aH+2Gy0XLlcp5 46oAj6Njdu6b9bzgnoaMsfRRyPHy1q1iGjQEShB64uAaO8syZGqrj95rvtQmfWQuR5qZNMhCTMSP VX0vRSFtPKmfhakWo79vkFDOfGZuNKmoX3FMOEI4wtLSFpIaU7utV2+u5kz0BX83KVuOUF2dyEtx 1wc5fbvAg6cGI8ZFlrrWQzksxiFf8z0BUZA9Lst9+hqNP34UD6/GhzJhy3y8EUgfC/Li+325kvfa z6DAl4+n0z2XLeaWDZTsS21yZIVex+iWaxKVy3YaTNqkhUUfL6ZWHBj3415zVuD5LfiiTORuYLEe Msw92ps3U9NpIB5fsKMvEt4xV9puEfGMX0Nu5CeS3aXlAdV3osD7NOd2/fZX5TiRb1W0OvxTww1v bD4/NQiXBNw4T94izP+Ab/Z/D9CYppI6GnjztvG7i/W0sISnAtAflz+aGOckjZ8keCRM+RMkQ8Lr pSGJvgZHbrk+Rk3uKYAlXeDVNZHfw0XgM2qldXJhByR5T7susO1KZjrouUmNjydTlQo9jUL35NfG JNu0njMvLw+s+HaeSO2PjzFxCO/V7lW0kIExjbfvp8huBEmsZx1jNuS+qJpC1jUpicQzb1rXFyNG MYg248yRn0pxosfhMUY2fay4zXOzt87fjqXSQDh2Qjtkkd4TJG66gnDyEUsBdPauDEofgfuijQfv I8n2q/fu1IqKSdkMkiYNc1FGrrCBEh6KXbkA1MDJ2alCPKFO+fcS2Wb5yTkDKnF+aSdZ29D6o4Se BnaugnfjqqLHJWGuNYYBhLeF3n4H1glrZ2uPXWbLdpQSnt7Ugv8xtU65STcqw31pB0+vBHAezxps pe0OdvMAWYHdbX5Ni/5L38E9B4h/qaPVS0cc+VnjGg/ngKt+RkRlidnx7CshkV1xJ0HzHqUpXTf0 7KDom2HbKBpty9bhk3GcnUDzBxAhclOO9DxhBjbAUCqbzYu8plmGrLxuURaUipQIbOrufL+nQanu Gi18h5YpqOuq70JZVdRaxic/imjwNgZiCda98FEGuaaUpZ8o6T0eOyfjBLBGqD/BeY6xSe4amkcT vR1NHCi9m10mGrJKzlEqIxq3zjbQZYZW3Bhstp3yoo57WeZK832zVeNqh3AzrBEYrzEjP1YYt3by /jzo4nrRAEdtYT8WaVgPwi7UncV34U8WyGbsLE3KTjO2RG042lpkDitGPnITbjIbzllM3Z6iQ6SN O2PWHPY/Pq83yf3E2oanQshirbC/PUadMGR3dblwc99WqjSR4odcVqWy7DpFR/bzaFbpnC9xb1/c /iP89OIHUrLg8COC51z8P8PPws3tv+j7ibtfR9ZLiCMVL37UQWRnb35AZQN7EXmV7BNdd/syiOZ+ rPdHzvzUCAEzqKQaSIL4ElXiu4vJoJW1d1rVnIbmrIPtj7W5EoqYETmrOlJLvhUSZ8kRY1TNq+nm RxDXJlrulZp7ee5FtSsykOdJ80WBN6qVBXj4U9LDgz1FYbPRFkN+04ICHGPK3oX6kvcx2RPE9iuG 7ZuP/T+HyHUOnjQBcdGrI44ZrgWtw9dr+28FuTr2z6eXz8jRjWJh9EYFJNOcG6wFBVqdPdDLXAim JAnKlIv0QQGkYBTlTbFlQWokCcWI6gJy2BvML6j6QvUNfLwqU19qURIkbYcC82q4jLzfEnoKozgZ CAzTW3i5yE2/v88UfzwxcdAVHBR0fSbnNv3MhFbTtKTGj3ErCAllKyEb0i3TI7L2MTfytMWkIhoE mCjplugNEVt1dgQA97OOv4OKM38cmV2wsPmkGB2g0BIdTTU/86Rq/KFKH48kAYrVqGJIqQ/XkSLp wxnjWxy3NuBsCneH+nF77nVR/WjOAtmKZD/ds9I4nAG/0oIvza8EhYDIBadU/3kE/+8V/Pf1Hwby 2mp/VfDXOeK/BX9eA+Fh8qep4l3Bvw5l/ixoD6f9/v8jmrt67hL1vzVlwf9lcIe2vyt8l2f+LUyJ +at1u8s639Vwl6T9rYEW6z+v/58o27sK7xKfvxUC4XU+3J67NOhdBXcb0N8KZgl/2fSfdvSu6N2O 4reoFMldY373F3e13C17fmtZhbcpPy24WwTd1fDXRP9bHgDgoQQA/pb274r/daP+s/hb4J/E/7Vt a6uhwAEHAGDDPz+39lDan3f/TwAAAAD//wMAUEsBAi0AFAAGAAgAAAAhAA4cey8qAQAADAMAABMA AAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEArTA/8cEA AAAyAQAACwAAAAAAAAAAAAAAAABbAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAImPIIIUB AAAaBAAAHwAAAAAAAAAAAAAAAABFAgAAY2xpcGJvYXJkL2RyYXdpbmdzL2RyYXdpbmcxLnhtbFBL AQItABQABgAIAAAAIQASLtrt0QAAAEEBAAAmAAAAAAAAAAAAAAAAAAcEAABjbGlwYm9hcmQvY2hh cnRzL19yZWxzL2NoYXJ0MS54bWwucmVsc1BLAQItABQABgAIAAAAIQBnA+6GzgAAAKwBAAAqAAAA AAAAAAAAAAAAABwFAABjbGlwYm9hcmQvZHJhd2luZ3MvX3JlbHMvZHJhd2luZzEueG1sLnJlbHNQ SwECLQAUAAYACAAAACEA4VE3H88GAADmGwAAGgAAAAAAAAAAAAAAAAAyBgAAY2xpcGJvYXJkL3Ro ZW1lL3RoZW1lMS54bWxQSwECLQAUAAYACAAAACEAh4ahdFsEAADmEwAAGwAAAAAAAAAAAAAAAAA5 DQAAY2xpcGJvYXJkL2NoYXJ0cy9jaGFydDEueG1sUEsBAi0AFAAGAAgAAAAhAAroRZj0GAAAqiIA ADUAAAAAAAAAAAAAAAAAzREAAGNsaXBib2FyZC9lbWJlZGRpbmdzL01pY3Jvc29mdF9PZmZpY2Vf RXhjZWxfX19fMS54bHN4UEsFBgAAAAAIAAgAZwIAABQrAAAAAA=="&gt; &lt;v:imagedata src="file:///C:%5CDOCUME%7E1%5Cwuyf%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image003.png" title=""&gt; &lt;o:lock ext="edit" aspectratio="f"&gt; &lt;/o:lock&gt;&lt;/v:imagedata&gt;&lt;/v:shape&gt;&lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;o:oleobject type="Embed" progid="Excel.Chart.8" shapeid="_x0000_i1031" drawaspect="Content" objectid="_1296894978"&gt;  &lt;o:wordfieldcodes&gt;\s&lt;/o:WordFieldCodes&gt; &lt;/o:OLEObject&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__ZvvWze6o0c/SaIeptrQfhI/AAAAAAAACQE/qFSDjUvKrJE/s1600-h/2009-2-23+11-56-23.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 232px;" src="http://3.bp.blogspot.com/__ZvvWze6o0c/SaIeptrQfhI/AAAAAAAACQE/qFSDjUvKrJE/s400/2009-2-23+11-56-23.png" alt="" id="BLOGGER_PHOTO_ID_5305837012980366866" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SaIeqcg_b6I/AAAAAAAACQM/Uvj4XOpPOrE/s1600-h/2009-2-23+11-56-31.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 230px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SaIeqcg_b6I/AAAAAAAACQM/Uvj4XOpPOrE/s400/2009-2-23+11-56-31.png" alt="" id="BLOGGER_PHOTO_ID_5305837025553772450" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span style="font-family:宋体;"&gt;从这里可以看到，&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;的大小对&lt;/span&gt;&lt;span lang="EN-US"&gt;Flash&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;的操作&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;速度基本没有影响，在下面的测试中，&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;的尺寸将不被考虑。另外，操作对象的多少与花费的时间基本成正比，对于点要素来说，每生成&lt;/span&gt;&lt;span lang="EN-US"&gt;1000&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个点大约花费&lt;/span&gt;&lt;span lang="EN-US"&gt;0.3&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;秒，每渲染&lt;/span&gt;&lt;span lang="EN-US"&gt;1000&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个点大约花费&lt;/span&gt;&lt;span lang="EN-US"&gt;0.07&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;秒，每擦除&lt;/span&gt;&lt;span lang="EN-US"&gt;1000&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个点大约花费&lt;/span&gt;&lt;span lang="EN-US"&gt;0.07&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;秒。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span style="font-family:宋体;"&gt;下面测试线要素，每个线要素包含&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个点，为了与点要素做一定比较，因此选择线要素的数目分别为&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;40&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;90&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;160&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;250&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;360&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;490&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;&lt;span lang="EN-US"&gt;1000&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个，这样总共的节点数与上面测试的点要素总数相同。同样，对多边形要素的测试也与此类似。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SaIerIg3ZNI/AAAAAAAACQU/56QUhFT110o/s1600-h/2009-2-23+11-56-41.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 232px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SaIerIg3ZNI/AAAAAAAACQU/56QUhFT110o/s400/2009-2-23+11-56-41.png" alt="" id="BLOGGER_PHOTO_ID_5305837037364405458" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style=""&gt;&lt;v:shape id="_x0000_i1030" type="#_x0000_t75" style="width: 417pt; height: 243pt; visibility: visible;" ole="" gfxdata="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 AAYACAAAACEADhx7LyoBAAAMAwAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNdLnht bFBLAQItABQABgAIAAAAIQCtMD/xwQAAADIBAAALAAAAAAAAAAAAAAAAAFsBAABfcmVscy8ucmVs c1BLAQItABQABgAIAAAAIQDXXhU6hAEAABoEAAAfAAAAAAAAAAAAAAAAAEUCAABjbGlwYm9hcmQv ZHJhd2luZ3MvZHJhd2luZzEueG1sUEsBAi0AFAAGAAgAAAAhABIu2u3RAAAAQQEAACYAAAAAAAAA AAAAAAAABgQAAGNsaXBib2FyZC9jaGFydHMvX3JlbHMvY2hhcnQxLnhtbC5yZWxzUEsBAi0AFAAG AAgAAAAhAGcD7obOAAAArAEAACoAAAAAAAAAAAAAAAAAGwUAAGNsaXBib2FyZC9kcmF3aW5ncy9f cmVscy9kcmF3aW5nMS54bWwucmVsc1BLAQItABQABgAIAAAAIQDhUTcfzwYAAOYbAAAaAAAAAAAA AAAAAAAAADEGAABjbGlwYm9hcmQvdGhlbWUvdGhlbWUxLnhtbFBLAQItABQABgAIAAAAIQCSEtm9 rQQAAOYUAAAbAAAAAAAAAAAAAAAAADgNAABjbGlwYm9hcmQvY2hhcnRzL2NoYXJ0MS54bWxQSwEC LQAUAAYACAAAACEAdbtawtgbAADnJQAANQAAAAAAAAAAAAAAAAAeEgAAY2xpcGJvYXJkL2VtYmVk ZGluZ3MvTWljcm9zb2Z0X09mZmljZV9FeGNlbF9fX18xLnhsc3hQSwUGAAAAAAgACABnAgAASS4A AAAA"&gt; &lt;v:imagedata src="file:///C:%5CDOCUME%7E1%5Cwuyf%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image004.png" title=""&gt; &lt;o:lock ext="edit" aspectratio="f"&gt; &lt;/o:lock&gt;&lt;/v:imagedata&gt;&lt;/v:shape&gt;&lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;o:oleobject type="Embed" progid="Excel.Chart.8" shapeid="_x0000_i1030" drawaspect="Content" objectid="_1296894979"&gt;  &lt;o:wordfieldcodes&gt;\s&lt;/o:WordFieldCodes&gt; &lt;/o:OLEObject&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span lang="EN-US"&gt;&lt;span style=""&gt;&lt;v:shape id="图表_x0020_4" spid="_x0000_i1029" type="#_x0000_t75" style="width: 417pt; height: 243pt; visibility: visible;" ole="" gfxdata="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 AFBLAQItABQABgAIAAAAIQAOHHsvKgEAAAwDAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9U eXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAK0wP/HBAAAAMgEAAAsAAAAAAAAAAAAAAAAAWwEAAF9y ZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhAN2PYfCEAQAAGgQAAB8AAAAAAAAAAAAAAAAARQIAAGNs aXBib2FyZC9kcmF3aW5ncy9kcmF3aW5nMS54bWxQSwECLQAUAAYACAAAACEAEi7a7dEAAABBAQAA JgAAAAAAAAAAAAAAAAAGBAAAY2xpcGJvYXJkL2NoYXJ0cy9fcmVscy9jaGFydDEueG1sLnJlbHNQ SwECLQAUAAYACAAAACEAZwPuhs4AAACsAQAAKgAAAAAAAAAAAAAAAAAbBQAAY2xpcGJvYXJkL2Ry YXdpbmdzL19yZWxzL2RyYXdpbmcxLnhtbC5yZWxzUEsBAi0AFAAGAAgAAAAhAOFRNx/PBgAA5hsA ABoAAAAAAAAAAAAAAAAAMQYAAGNsaXBib2FyZC90aGVtZS90aGVtZTEueG1sUEsBAi0AFAAGAAgA AAAhAJZTDd67BAAA7RQAABsAAAAAAAAAAAAAAAAAOA0AAGNsaXBib2FyZC9jaGFydHMvY2hhcnQx LnhtbFBLAQItABQABgAIAAAAIQDOFFAO0hsAAOYlAAA1AAAAAAAAAAAAAAAAACwSAABjbGlwYm9h cmQvZW1iZWRkaW5ncy9NaWNyb3NvZnRfT2ZmaWNlX0V4Y2VsX19fXzEueGxzeFBLBQYAAAAACAAI AGcCAABRLgAAAAA="&gt; &lt;v:imagedata src="file:///C:%5CDOCUME%7E1%5Cwuyf%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image005.png" title=""&gt; &lt;o:lock ext="edit" aspectratio="f"&gt; &lt;/o:lock&gt;&lt;/v:imagedata&gt;&lt;/v:shape&gt;&lt;/span&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;o:oleobject type="Embed" progid="Excel.Chart.8" shapeid="图表_x0020_4" drawaspect="Content" objectid="_1296894980"&gt;  &lt;o:wordfieldcodes&gt;\s&lt;/o:WordFieldCodes&gt; &lt;/o:OLEObject&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__ZvvWze6o0c/SaIesPnNQBI/AAAAAAAACQc/uZ1oI14Y9rg/s1600-h/2009-2-23+11-56-50.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 230px;" src="http://2.bp.blogspot.com/__ZvvWze6o0c/SaIesPnNQBI/AAAAAAAACQc/uZ1oI14Y9rg/s400/2009-2-23+11-56-50.png" alt="" id="BLOGGER_PHOTO_ID_5305837056449921042" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span style="font-family:宋体;"&gt;我们发现，操作线与多边形要素，在顶点数相同的情况下，耗时比点要素要少的多。基本上，操作（包括生成、渲染、擦除）包含&lt;/span&gt;&lt;span lang="EN-US"&gt;10000&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个顶点的&lt;/span&gt;&lt;span lang="EN-US"&gt;1000&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;条线或多边形，花费时间与操作&lt;/span&gt;&lt;span lang="EN-US"&gt;1000&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个点差不多。换句话说，在&lt;/span&gt;&lt;span lang="EN-US"&gt;Flex&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;中，操作时间基本上与&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;要素数量有线性关系，与其它因素关系不大。&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span style="font-family:宋体;"&gt;但是，在这个测试中可以发现，虽然程序测算的线和多边形的操作时间比点要少的多，但是在操作体验上相差很远。具体体现鼠标在图形上移动呈现严重滞后现象，移动地图非常困难，等等。由于测试程序所取线和多边形的顶点都是随机点，因此所有的&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;要素基本上都叠加在了一起，如下图。在绘制交错的&lt;/span&gt;&lt;span lang="EN-US"&gt;20&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;顶点的线的时候，鼠标移动开始出现滞后现象；在绘制重叠的&lt;/span&gt;&lt;span lang="EN-US"&gt;15&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;顶点的多边形的时候，鼠标移动开始出现滞后现象。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__ZvvWze6o0c/SaId7jHZRmI/AAAAAAAACPc/EB6R0rDav-I/s1600-h/2009-2-23+11-14-47.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 189px;" src="http://4.bp.blogspot.com/__ZvvWze6o0c/SaId7jHZRmI/AAAAAAAACPc/EB6R0rDav-I/s400/2009-2-23+11-14-47.png" alt="" id="BLOGGER_PHOTO_ID_5305836219871610466" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt; page-break-after: avoid;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;v:shape id="图片_x0020_8" spid="_x0000_i1028" type="#_x0000_t75" alt="2009-2-23 11-14-47.png" style="width: 415.5pt; height: 196.5pt; visibility: visible;"&gt; &lt;v:imagedata src="file:///C:%5CDOCUME%7E1%5Cwuyf%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image006.png" title="2009-2-23 11-14-47"&gt; &lt;/v:imagedata&gt;&lt;/v:shape&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoCaption" style="text-align: center;" align="center"&gt;&lt;span style="font-family:黑体;"&gt;交错的&lt;/span&gt;&lt;span lang="EN-US"&gt;20&lt;/span&gt;&lt;span style="font-family:黑体;"&gt;个&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span style="font-family:黑体;"&gt;顶点的线&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoCaption" style="text-align: center;" align="center"&gt;&lt;span lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoCaption" style="text-align: center;" align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SaId73hlrrI/AAAAAAAACPk/Sk_mceodNmQ/s1600-h/2009-2-23+11-16-01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 189px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SaId73hlrrI/AAAAAAAACPk/Sk_mceodNmQ/s400/2009-2-23+11-16-01.png" alt="" id="BLOGGER_PHOTO_ID_5305836225350184626" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt; page-break-after: avoid;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;v:shape id="图片_x0020_9" spid="_x0000_i1027" type="#_x0000_t75" alt="2009-2-23 11-16-01.png" style="width: 415.5pt; height: 196.5pt; visibility: visible;"&gt; &lt;v:imagedata src="file:///C:%5CDOCUME%7E1%5Cwuyf%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image007.png" title="2009-2-23 11-16-01"&gt; &lt;/v:imagedata&gt;&lt;/v:shape&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoCaption" style="text-align: center;" align="center"&gt;&lt;span lang="EN-US"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:黑体;"&gt;重叠的&lt;/span&gt;&lt;span lang="EN-US"&gt;15&lt;/span&gt;&lt;span style="font-family:黑体;"&gt;个&lt;/span&gt;&lt;span lang="EN-US"&gt;10&lt;/span&gt;&lt;span style="font-family:黑体;"&gt;顶点的多边形&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoCaption" style="text-align: center;" align="center"&gt;&lt;span lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;span style="font-family:宋体;"&gt;为了考察到底是&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;的相互重叠导致了操作性能低下，还是其它原因，我们对要素点的取值进行限制，使所有的线、多边形基本没有重合，再次进行了测试。测试发现，用户操作体验有了极大提升，基本上在&lt;/span&gt;&lt;span lang="EN-US"&gt;5000&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;个要素以下用户操作都没有明显的延迟。&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-indent: 21pt;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__ZvvWze6o0c/SaId8YeHsBI/AAAAAAAACPs/MK81AHXdyVw/s1600-h/2009-2-23+11-11-01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 189px;" src="http://1.bp.blogspot.com/__ZvvWze6o0c/SaId8YeHsBI/AAAAAAAACPs/MK81AHXdyVw/s400/2009-2-23+11-11-01.png" alt="" id="BLOGGER_PHOTO_ID_5305836234194006034" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 21pt; page-break-after: avoid;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;v:shape id="图片_x0020_6" spid="_x0000_i1026" type="#_x0000_t75" alt="2009-2-23 11-11-01.png" style="width: 415.5pt; height: 196.5pt; visibility: visible;"&gt; &lt;v:imagedata src="file:///C:%5CDOCUME%7E1%5Cwuyf%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image008.png" title="2009-2-23 11-11-01"&gt; &lt;/v:imagedata&gt;&lt;/v:shape&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoCaption" style="text-align: center;" align="center"&gt;&lt;span style="font-family:黑体;"&gt;不交叉的&lt;/span&gt;&lt;span lang="EN-US"&gt;2500&lt;/span&gt;&lt;span style="font-family:黑体;"&gt;个&lt;/span&gt;&lt;span lang="EN-US"&gt;4&lt;/span&gt;&lt;span style="font-family:黑体;"&gt;顶点的线&lt;/span&gt;&lt;span lang="EN-US"&gt;Graphic&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoCaption" style="text-align: center;" align="center"&gt;&lt;span lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&l
