﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-I am Thinking !</title><link>http://www.blogjava.net/Juizes361/</link><description>路漫漫兮其修远兮,吾将上下而求索!</description><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 04:42:36 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 04:42:36 GMT</pubDate><ttl>60</ttl><item><title>ArcSDE空间数据库中SDE用户使用探讨（转）</title><link>http://www.blogjava.net/Juizes361/articles/304773.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Fri, 04 Dec 2009 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/304773.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/304773.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/304773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/304773.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/304773.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p><br />
</p>
<p>ArcSDE作为空间数据库解决方案，应用非常广泛，本短文将尝试描述SDE的工作机制，简要说明空间数据库中SDE用户的使用方法。</p>
<p><span style="color: rgb(0, 128, 128);"><strong><span style="background-color: rgb(0, 16, 255);"><span style="background-color: rgb(250, 248, 255);"><span style="color: rgb(0, 16, 255);"><br />
</span></span></span></strong></span></p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;"><span style="color: rgb(0, 128, 128);"><strong><span style="color: rgb(0, 16, 255);">ArcSDE如何工作</span></strong></span></span></span></p>
<p>ArcSDE属于中间件技术，其本身并不能够存储空间数据，它的作用可以理解为数据库的&#8220;空间扩展&#8221;。在基于Oracle的ArcSDE空间数据库中，ArcSDE保存了一系列Oracle对象，用于管理空间信息。这些对象统称为资料档案库（Repository），包含空间数据字典和ArcSDE
软件程序包。ArcSDE需要SDE用户管理空间资料档案库，这类似于Oracle中需要SYS用户管理数据字典。Oracle的数据字典存储在
SYSTEM表空间中；相应地，在存储ArcSDE空间资料档案库的时候，也需要使用特定的表空间。通常，为了方便起见，默认使用名称也是SDE的表空间管理空间数据字典。</p>
<p>ArcSDE的工作机制中，SDE用户负责ArcSDE与Oracle的交互，通过维护SDE模式下的空间数据字典以及运行其模式中的程序包，来保证空间数据库的读/写一致性。在ArcSDE服务启动的过程中，SDE用户通过Oracle验证，并且创建和维护一个Oracle会话连接，连接的程序便是giomgr，即ArcSDE服务器管理进程，该进程一直存在，负责监听用户连接请求，分配相应的gsrvr管理进程<strong><span style="color: rgb(255, 0, 0);">（见注1）</span></strong>，进行空间数据字典的维护。</p>
<p><span style="color: rgb(0, 128, 128);"><strong><span style="color: rgb(0, 16, 255);"><br />
</span></strong></span></p>
<p><span style="color: rgb(0, 128, 128);"><strong><span style="color: rgb(0, 16, 255);">ArcSDE的安全性</span></strong></span> </p>
<p>ArcSDE的安全机制完全依赖于Oracle，空间数据库用户（包括SDE），需要Oracle的用户密码才能够访问空间数据，ArcSDE本身并不保存任何认证信息。</p>
<p>在Oracle中，SDE用户的最小系统权限设置要求是：</p>
<p>Create procedure / Create table / Create sequence / Create trigger / Create session</p>
<p>由此可见，SDE亦属于Oracle数据库中的普通权限用户。</p>
<p>对于Oracle来说，虽然SDE属于非DBA用户，但是在ArcSDE架构中，SDE的地位比较特殊，是ArcSDE管理员。只有SDE可以完成
一些特定的工作：比如启动/停止ArcSDE服务；终止某些用户连接；压缩多版本数据库等。SDE用户虽然不是一个真正的Oracle
DBA用户，但是在ArcSDE工作过程中，软件会进行一些特定的对象权限操作。因此，应该将SDE用户等同于Oracle
DBA用户处理，就像SYS或者SYSTEM一样，必须严格保护其密码。</p>
<p>在ArcSDE空间数据库中，从权限管理级别上，可以把用户分成两大类：</p>
<p>1、 空间数据库管理员，只有并且只能是SDE </p>
<p>2、 空间数据库一般用户，包括创建、浏览空间数据的除SDE外的其它oracle用户 使用SDE用户，强烈推荐遵循两个原则：</p>
<ul>
    <li>SDE用户不用于加载空间数据 </li>
    <li>SDE存储资料档案库的表空间不用于存放空间数据 </li>
</ul>
<p><br />
<span style="color: rgb(0, 128, 128);"><strong><span style="color: rgb(0, 16, 255);">SDE用户的特殊对象权限</span></strong></span></p>
<p>SDE用户作为Oracle数据库的一般用户，可以创建自己的表或者存储过程；作为ArcSDE空间数据库管理员，在对象权限设置中，ArcSDE
会自动授予SDE一些对象权限。SDE用户需要这些对象权限，以保证ArcSDE
Geodatabase的完整性。空间数据库的一般用户在创建新的Geodatabase对象的时候，ArcSDE将这些新建对象的权限授予SDE用户。
比如ACTC用户创建一个名称为Country的Geodatabase的要素类，此时数据库中同时生成Country（即B表，Business
Table）的相应<span style="color: rgb(32, 46, 255);"><span style="color: rgb(32, 0, 255);">支撑表</span></span>，即F表（Feature Table）和S表（Spatial Index
Table）。这时候，SDE用户将自动获取得到Country、F表和S表这几个表的Select权限。当用户将Country注册为版本，此时
ACTC模式下生成<span style="color: rgb(32, 0, 255);">记录编辑信息</span>的A表（Additions Table）和D表（Deletions
Table）。这时候，SDE用户获得该A表和D表的Select / Insert / Update /
Delete权限。在这些对象权限授予过程中，ACTC用户并未获取任何通知信息。</p>
<p>在ArcGIS
Desktop的空间数据库连接中，并没有体现出来SDE用户的这些对象权限，如果使用SDE用户进行空间数据库连接，只能够观察到上例中的
Country表，其它的支撑表都被过滤掉了。如果需要完整查看SDE用户被授予的对象权限，可以通过Oracle的
USER_TAB_PRIVS_RECD视图获取。</p>
<p><span style="color: rgb(0, 128, 128);"><strong><span style="color: rgb(0, 16, 255);"><br />
</span></strong></span></p>
<p><span style="color: rgb(0, 128, 128);"><strong><span style="color: rgb(0, 16, 255);">SDE用户完成哪些特定工作</span></strong></span></p>
<p>在空间数据库中，作为管理员的SDE完成一般用户不能完成的操作，以下举例说明：</p>
<p>1、 启动/停止ArcSDE服务</p>
<p>只有SDE能够与Oracle完成交互，启动或停止ArcSDE的服务。操作为：<br />
sdemon &#8211;o start / shutdown （启动/停止） <br />
这时候需要提交SDE用户密码。 </p>
<p>2、 终止某个空间用户连接 </p>
<p>在空间数据库连接中，有时候出连接进程挂起或者非法连接的时候，可以使用SDE终止其连接。操作为：<br />
首先，从连接列表中获取该连接的信息<br />
sdemon &#8211;o info &#8211;I users <br />
在获取到需要终止的连接ID后，使用kill命令<br />
sdemon &#8211;o kill &#8211;t &lt; 连接 ID&gt;<br />
&lt;连接ID&gt; 完成此项操作需要提交SDE用户密码。</p>
<p>3、 压缩多版本数据库（Multi-versioned Geodatabase）</p>
<p>在ArcSDE
Geodatabase中，随着数据编辑工作的进行，SDE空间资料档案库中相应元数据表、以及用户模式中的A表和D表的记录逐渐增加，会影响空间数据的
访问效率，因此经常需要进行数据库版本的压缩工作。在确定数据库不存在任何锁定后，便可以进行压缩工作，操作为： </p>
<p>sdeversion &#8211;o compress &#8211;u sde</p>
<p>完成此项操作需要提交SDE用户密码。</p>
<p>作为ArcSDE管理员，SDE还要完成其它一些工作。比如，在控制空间数据的数据段、索引段存储的时候，SDE用户可以使用sdedbtune命令来提高数据库效率。</p>
<p><br />
</p>
<p><span style="color: rgb(255, 0, 0);"><strong>注1：</strong><br />
</span></p>
<p><span style="color: rgb(255, 0, 0);">这是传统的ArcSDE应用服务器连接
（Application-server
connection）的工作方式，在这种方式中，ArcSDE服务器进程（giomgr）分配名为gsrvr的进程来全面负责客户机与服务器的元数据通信。ArcSDE
8.1版本之后，出现新的连接方式，即直接连接方式（Direction-connection），在这种连接方式中，gsrvr进程功能嵌入到客户机连接应用程序中，如ArcCatalog或其它ESRI软件产品。此种方式下，Gsrvr的功能由客户端连接应用程序完成。</span></p>
<p><span style="color: rgb(255, 0, 0);">测试环境：ArcSDE 9.0，Oracle 9.2.0.4.0，Windows NT</span></p>
<p><br />
</p>
<p><span style="color: rgb(255, 0, 0);"><br />
</span></p>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/304773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-12-04 14:51 <a href="http://www.blogjava.net/Juizes361/articles/304773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ArcSDE服务(转)</title><link>http://www.blogjava.net/Juizes361/articles/304772.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Fri, 04 Dec 2009 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/304772.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/304772.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/304772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/304772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/304772.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-size: 10pt;">
<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;"><strong><span style="color: #0010ff;"><br />
ArcSDE程序服务介绍<br />
<br />
</span></strong>
ArcSDE是空间数据与GIS程序之间的一个重要的&#8220;通路&#8221;，使用它可以将ArcGIS等程序与关系数据库系统联系起来，这些关系数据库并不是如ACCESS的桌面型，而是类似ORACLE和SQLSERVER的分布式关系数据库服务系统。<br />
<br />
ArcSDE提供了两种数据联结架构，即两层和三层模型，一般我们都是使用的三层架构，如果用户需要使用前者，可以在ArcCatalog中选择&#8220;产生一个直接联结&#8221;。<br />
<br />
Sdemon
命令可以允许管理员管理和监视ArcSDE服务，在SDE服务启动后，始终存在一个giomgr的SDE服务器进程，它负责监听连接请求（服务器名和端
口）、验证连接（密码和用户）、给每个成功的连接分配一个独立的gsrvr进程，而gsrvr负责在客户端和服务器之间进行通讯（使用相同的服务器名和端
口）。<br />
<br />
ArcSDE是一种客户端/服务器模式，因此存在几个需要注意的属性：<br />
1. Home目录 它是一个被记录的路径，成为SDEHOME，这个目录中包含可执行文件，配置文件和动态共享库等。<br />
2. 两个进程 giomgr和gsrvr（作用如前）<br />
3. 由于SDE走的是TCP/IP协议，因此服务器名和端口在通讯在起着重要的作用。服务建立后，服务名和端口号被存储在&#8220;C:\WINNT\system32\drivers\etc&#8221;的services文件中。&nbsp;&nbsp; 它有两种形式：服务名：端口、IP：端口。<br />
4. 配置参数 配置参数被保存在一个名为SDE.SERVER_CONFIG的表中，缺省的参数文件为giomgr.defs，它被存放在SDEHOME中的etc文件夹中。<br />
<br />
<br />
<strong><span style="color: #0010ff;">启动服务<br />
<br />
</span></strong>
1. 使用正常服务启动程序<br />
2. Sdemon &#8211;o start &#8211;p sde<br />
<br />
<br />
<strong><span style="color: #0010ff;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">参数配置<br />
<br />
</span>
</span></span></strong>
SDE服务的参数是可以被修改的，这个过程可以通过修改数据库中表或修改service.sde或dbinit.sde两个文件，这两个文件都被保存在SDEHOME中的etc文件夹中。<br />
对于一个SDE服务而言，外界程序联系到它的方法是通过TCP/IP协议的，因此，在默认的情况下，当我们打开service.sde文件，我们会发现下面的代码：<br />
esri_sde 5151/tcp #ArcSDE 9.0 for Oracle9i<br />
这就是名为esri_sde的SDE服务的端口号，当我们执行Sdemon &#8211;o start &#8211;p sde时，系统会寻找这个文件的参数，看看是否匹配。如果匹配再验证密码和用户。<br />
在一台机器上可以同时存在多个SDE服务，这些服务名将不一样，占用的端口也不一样，但是它们的参数都保存在service.sde文件，如：<br />
esri_sde2 5152/tcp #ArcSDE 9.0 for Oracle9i<br />
SDE服务需要从dbinit.sde文件中读取一些系统的环境变量，以获得必要的关系数据库信息，如：<br />
# Oracle SID for service esri_sde.<br />
set ORACLE_SID=SDE<br />
上面的语句指明了SDE服务使用的是那一个ORACLE数据库例程。<br />
下面是获得全部参数的命令：<br />
Sdemon &#8211;o info &#8211;I config<br />
用户也可以打开SDE.SERVER_CONFIG表，查看其中的具体参数。<br />
<br />
<br />
<strong><span style="font-size: 12pt;"><span style="font-size: 10pt;"><span style="color: #0010ff;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">服务器的管理</span></span></span></span></span></strong><br />
<br />
服务器的管理包括服务的启动、暂停和关闭两个操作，在WINDOWS平台下，服务的启动关闭，例程的关闭都可以可视化实现，下面我们将介绍使用命令行的方式：<br />
<br />
1. 启动一个远程SDE服务<br />
&nbsp;&nbsp;
Sdemon &#8211;o start &#8211;p mypassword &#8211;s service &#8211;i arcsde<br />
&nbsp;&nbsp;
上句中的-p后为密码，-s后为远程机器名，而-i为SDE服务名<br />
2. 暂停一个服务<br />
&nbsp;&nbsp;
Sdemon &#8211;o pause &#8211;p mypassword<br />
3. 重新启动<br />
&nbsp;&nbsp;
Sdemon &#8211;o resume &#8211;p mypassword<br />
4. 关闭一个giomgr进程<br />
&nbsp;&nbsp;
Cd %SDEHOME%\tools<br />
&nbsp;&nbsp;
Killp 100 (100为进程号) <br />
&nbsp;&nbsp;
Do you really want to kill process with pid 100(y/n)?<br />
Y<br />
5. 关闭一个服务<br />
&nbsp;&nbsp;
Sdemon &#8211;o shutdown &#8211;p mypassword<br />
6. 关闭所有用户会话<br />
&nbsp;&nbsp;
Sdemon &#8211;o kill &#8211;t all<br />
<br />
<br />
<strong><span style="color: #0010ff;"><span style="font-size: 12pt;"><span style="font-size: 10pt;">SDE服务的监视<br />
<br />
</span></span></span></strong>
为了显示SDE服务的状态，我们需要使用sdemon命令来显示一些信息：<br />
<br />
1. 状态监视<br />
&nbsp;&nbsp;
Sdemon &#8211;o status<br />
2. 数据锁<br />
&nbsp;&nbsp;
Sdemon &#8211;o info &#8211;I locks<br />
&nbsp;&nbsp;
SDE提供了四种锁，它们分别是：<br />
&nbsp;&nbsp;
对象锁：用于版本和地理数据库的激活<br />
&nbsp;&nbsp;
表锁：用于锁定表<br />
&nbsp;&nbsp;
区域锁Area Locks：用于锁定一个要素类的空间范围<br />
&nbsp;&nbsp;
状态锁State Locks：用于锁定一个要素类或表的版本状态<br />
3. 用户状态<br />
&nbsp;&nbsp;
Sdemon &#8211;o info &#8211;I users<br />
<br />
<br />
<strong><span style="color: #0010ff;">SDE服务故障解决<br />
<br />
</span></strong>
1. 启动SDE服务时发生了什么？<br />
* SDE服务程序启动一个giomgr进程。<br />
* 进程从dbinit.sde文件中获得系统环境变量。<br />
* 进程探测服务的license是否已经安装。<br />
* 进程读取services.sde文件。<br />
* 进程获得TCP/IP协议和服务名。<br />
* Giomgr使用dbinit.sde和系统变量定义的连接信息连接到一个DBMS上。<br />
* Giomgr遍历所有锁定表。<br />
* 服务启动了，giomgr进程开始监听它的端口，以确定外界是否有连接。<br />
<br />
2. SDE客户端连接服务时候发生了什么？<br />
* Giomgr进程监听着它的端口<br />
* 程序确认一个连接到服务的连接请求<br />
* Giomgr比较程序计算机的锁定时间和它的主机时间，如果它的时间大于MAXTIMEDIFF，则不允许连接<br />
* Gimogr开始比较客户端程序的ARCSDE版本和ARCSDE服务端版本，如果前者比后者旧，连接将被拒绝<br />
* Gimogr进程启动一个gsrvr进程，为客户端程序服务<br />
* Gsrvr进程获得共享内存<br />
* Gsrvr进程连接到DBMS上一旦上面的过程成功，giomgr将继续监听下一个连接<br />
<br />
除此以外，我们还可以通过命令行的方式来管理服务和数据，这些程序都放在%SDEHOME%\bin文件夹内，如：<br />
<br />
<table border="0" cellpadding="2" cellspacing="2" height="822" width="535">
    <tbody>
        <tr>
            <td valign="top"><strong><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;"><span style="color: #0010ff;"><strong><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Commands </span></span></strong></span></span></span></strong></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;"><strong><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;"><span style="color: #0010ff;">&nbsp;Command Description</span></span></span></strong></span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;cov2sde</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Converts ArcInfo coverages to ArcSDE feature classes.</span></span></td>
        </tr>
        <tr>
            <td>&nbsp;<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">sde</span></span><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">2cov</span></span></td>
            <td>&nbsp;<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">Converts ArcSDE feature classes to ArcInfo coverages.</span></span></td>
        </tr>
        <tr>
            <td>&nbsp;<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">sde2shp</span></span></td>
            <td>&nbsp;<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">Converts an ArcSDE feature class to an ESRI shapefile.</span></span></td>
        </tr>
        <tr align="left" valign="middle">
            <td>&nbsp;<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">sde2tbl</span></span></td>
            <td>&nbsp;<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">Converts ArcSDE tables into INFO and dBASE tables. </span></span></td>
        </tr>
        <tr align="left" valign="middle">
            <td>&nbsp;<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">sdeconfig</span></span></td>
            <td>&nbsp;<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">Manages your ArcSDE server configuration file</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdedbtune</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Exports and imports an ArcSDE dbtune file.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdeexport</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Creates an ArcSDE export file.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdegcdrules</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Manages ArcSDE geocoding rules</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdegroup</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Merges feature classes.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdeimport</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Imports data from an ArcSDE export file.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdelayer</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Administers feature classes.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdelocator</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Manages ArcSDE locators.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdelog</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Administers ArcSDE log files.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdemon</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Manages the ArcSDE server.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sderaster</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Manages ArcSDE raster layers.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdeservice</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Manages the ArcSDE service on Windows NT platforms.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdesetup</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Initial setup program for ArcSDE for your RDBMS.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdetable</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Administers business tables and their data.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdeversion</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Manages versions of a geodatabase.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdexinfo</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Provides descriptive information of an ArcSDE export file.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;sdexml</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Administers XML columns.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;shp2sde</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Converts an ESRI shapefile to an ArcSDE feature class.</span></span></td>
        </tr>
        <tr>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;tbl2sde</span></span></td>
            <td valign="top"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">&nbsp;Converts INFO and dBASE tables into ArcSDE tables.
            </span></span></td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
<br />
<br />
</span></span>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/304772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-12-04 14:24 <a href="http://www.blogjava.net/Juizes361/articles/304772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何开发Oracle存储过程(转)</title><link>http://www.blogjava.net/Juizes361/articles/303612.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Wed, 25 Nov 2009 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/303612.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/303612.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/303612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/303612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/303612.html</trackback:ping><description><![CDATA[<p>　　在我的上一个银行项目中，我接到编写ORACLE<a href="http://storage.it168.com/" target="_blank" class="nounderline" title="存储">存储</a>过
程的任务，我是程序员，脑袋里只有一些如何使用CALLABLE接口调用存储过程的经验，一时不知如何下手，我查阅了一些资料，通过实践发现编写
ORACLE存储过程是非常不容易的工作，即使上路以后，调试和验证非常麻烦。简单地讲，Oracle存储过程就是存储在Oracle数据库中的一个程
序。</p>
<p>　　<strong>一. 概述</strong></p>
<p>　　Oracle存储过程开发的要点是：</p>
<p>　　&#8226; 使用Notepad文本编辑器，用Oracle PL/SQL编程语言写一个存储过程;</p>
<p>　　&#8226; 在Oracle数据库中创建一个存储过程;</p>
<p>　　&#8226; 在Oracle数据库中使用SQL*Plus工具运行存储过程;</p>
<p>　　&#8226; 在Oracle数据库中修改存储过程;</p>
<p>　　&#8226; 通过编译错误调试存储过程;</p>
<p>　　&#8226; 删除存储过程;</p>
<p>　<strong>　二.环境配置</strong></p>
<p>　　包括以下内容：</p>
<p>　　&#8226; 一个文本编辑器Notepad;</p>
<p>　　&#8226; Oracle SQL*Plus工具，提交Oracle SQL和PL/SQL 语句到Oracle database。</p>
<p>　　&#8226; Oracle 10g express数据库，它是免费使用的版本;</p>
<p>　　需要的技巧：</p>
<p>　　&#8226; SQL基础知识,包括插入、修改、删除等</p>
<p>　　&#8226; 使用Oracle's SQL*Plus工具的基本技巧;</p>
<p>　　&#8226; 使用Oracle's PL/SQL 编程语言的基本技巧;</p>
<p>　　<strong>三.写一个存储过程</strong></p>
<p>　　存储过程使用Oracle's PL/SQL 程序语言编写，让我们写一个什么工作都不做的存储过程，我们可以编译和运行它而不用担心会对数据库产生任何损害。</p>
<p>　　在Notepad, 写下：</p>
<p>　　CREATE OR REPLACE PROCEDURE skeleton</p>
<p>　　IS</p>
<p>　　BEGIN</p>
<p>　　NULL;</p>
<p>　　END;</p>
<p>　　把文件存为skeleton.sql.</p>
<p>　　让我们一行行遍历这个存储过程:</p>
<p>　　1 CREATE OR REPLACE PROCEDURE skeleton</p>
<p>　　2 IS</p>
<p>　　3 BEGIN</p>
<p>　　4 NULL;</p>
<p>　　5 END;</p>
<p>　　行1:</p>
<p>　　CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;</p>
<p>　　行2:</p>
<p>　　IS关键词表明后面将跟随一个PL/SQL体。</p>
<p>　　行3:</p>
<p>　　BEGIN关键词表明PL/SQL体的开始。</p>
<p>　　行4:</p>
<p>　　NULL PL/SQL语句表明什么事都不做，这句不能删去，因为PL/SQL体中至少需要有一句;</p>
<p>　　行5:</p>
<p>　　END关键词表明PL/SQL体的结束</p>
<p>　　<strong>四.创建一个存储过程</strong></p>
<p>　　SQL语句CREATE OR REPLACE PROCEDURE在Oracle数据库中创建、编译和保存一个存储过程。</p>
<p>　　从Window打开SQL*Plus并且从SQL*Plus登录到你的数据库;打开skeleton.sql文件.</p>
<p>　　在SQL&gt;命令提示符下输入以下命令：</p>
<p>　　SQL&gt;@skeleton</p>
<p>　　SQL&gt;/</p>
<p>　　SQL*Plus装载skeleton.sql文件的内容到SQL*Plus缓冲区并且执行SQL*Plus语句;SQL*Plus 会通知你存储过程已经被成功地创建。</p>
<p>　　现在你的存储过程被创建，编译和保存在你的Oracle数据库，我们可以运行它。</p>
<p>　　<strong>五.运行一个存储过程</strong></p>
<p>　　从SQL*Plus 命令行提示符运行你的存储过程使用EXECUTE命令，如下:</p>
<p>　　SQL&gt; EXECUTE skeleton;</p>
<p>　　SQL*Plus 输出一下信息确信存储过程成功执行: PL/SQL procedure successfully completed.</p>
<p>　　你也可以在一个无名PL/SQL块内运行你的存储过程，在SQL*Plus命令提示符下，它看起来像：</p>
<p>　　SQL&gt; BEGIN</p>
<p>　　2 SKELETON;</p>
<p>　　3 END;</p>
<p>　　4 /</p>
<p>　　现在我们已经运行了我们的存储过程，我们如何修改它呢?</p>
<p>　　<strong>六.修改一个存储过程</strong></p>
<p>　　让我们写一个输出字符串&#8220;Hello World!&#8221;的存储过程，用Notepad打开你的skeleton.sql 文件，. 用DBMS_OUTPUT.PUT_LINE 过程调用去替换NULL语句，如下所示:</p>
<p>　　CREATE OR REPLACE PROCEDURE skeleton</p>
<p>　　IS</p>
<p>　　BEGIN</p>
<p>　　DBMS_OUTPUT.PUT_LINE('Hello World!');</p>
<p>　　END;</p>
<p>　　保存到文件skeleton.sql.</p>
<p>　　从SQL*Plus命令行, 打开文件skeleton.sql .</p>
<p>　　SQL&gt; @skeleton</p>
<p>　　SQL&gt;</p>
<p>　　1 CREATE OR REPLACE PROCEDURE skeleton</p>
<p>　　2 IS</p>
<p>　　3 BEGIN</p>
<p>　　4 DBMS_OUTPUT.PUT_LINE('Hello World!');</p>
<p>　　5* END;</p>
<p>　　SQL&gt; /</p>
<p>　　SQL*Plus 通知你存储过程成功创建并输出提示信息：Procedure created.</p>
<p>　　SQL&gt;</p>
<p>　　用EXECUTE 命令运行你的存储过程:</p>
<p>　　SQL&gt; EXECUTE skeleton;</p>
<p>　　SQL*Plus显示存储过程运行成功：PL/SQL procedure successfully completed.</p>
<p>　　我们想要的输出字符串 "Hello World!"没有出来，在显示一个DBMS_OUTPUT.PUT_LINE 结果前需要运行一个SET命令，在SQL*Plus 命令行提示符,键入：</p>
<p>　　SQL&gt; SET SERVEROUTPUT ON</p>
<p>　　再次执行你的存储过程：</p>
<p>　　SQL&gt; EXECUTE skeleton;</p>
<p>　　现在结果输出了：Hello World!</p>
<p>　　PL/SQL procedure successfully completed.</p>
<p>　　<strong>七.调试一个存储过程</strong></p>
<p>　　当调试一个存储过程时，遵循一样的步骤，修改SQL文件，创建存储过程，执行存储过程，根据编译器反馈的出错信息进行修改，这一步是非常繁琐的，需要依靠经验。</p>
<p>　　在实际的商用存储过程的开发调试过程中，由于涉及很多表、类型、光标、循环、条件等复杂的逻辑，和PL/SQL语句的灵活运用，编译时会产生很多错误提示信息，程序员在根据这些错误信息定位，进行修正，再编译最后得到正确的结构;</p>
<p>　<strong>　八.放弃一个存储过程</strong></p>
<p>
如果在数据库中你不在需要一个存储过程你可以删除它，SQL语句 DROP PROCEDURE 完成从数据库中删除一个存储过程，DROP
PROCEDURE 在SQL中被归类为数据定义语言(DDL) 类操作，其他的例子有CREATE, ALTER, RENAME
和TRUNCATE。.</p>
<p>　　在SQL*Plus 命令提示符下，使用DROP PROCEDURE SQL 语句删除你的叫做skeleton的存储过程：</p>
<p>　　SQL&gt; DROP PROCEDURE skeleton;</p>
<p>　　SQL*Plus assures us the procedure has been removed:</p>
<p>　　Procedure dropped.</p>
<p>　<strong>　总结</strong></p>
<p>　　本文详细讨论了如何使用Oracle工具开发Oracle商用存储过程的步骤。最后在存储过程的使用中可能是程序直接调用，也可能被触发器调用。</p>
<img src ="http://www.blogjava.net/Juizes361/aggbug/303612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-11-25 14:33 <a href="http://www.blogjava.net/Juizes361/articles/303612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的proxool配置(转)</title><link>http://www.blogjava.net/Juizes361/articles/300757.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Mon, 02 Nov 2009 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/300757.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/300757.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/300757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/300757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/300757.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p><span style="font-size: small;"><br />
</span></p>
<p><span style="font-size: small;">搞了一天的在hibernate中配置proxool,终于算是调通过了,其中遇到了许多问题,在这里和大家分享一下.</span></p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;"><strong><span style="font-size: small;">1.官网下载地址:</span></strong>
<br />
<a title="proxool下载" href="http://sourceforge.net/projects/proxool/files/" target="_blank">http://sourceforge.net/projects/proxool/files/</a>
</span>
</p>
<p>&nbsp;</p>
<p><strong>2.配置环境 </strong></p>
<p>JRE1.6, tomcat6.0,hibernate3.1, proxool-0.9.0RC3 </p>
<p>数据库为MSSQL2005&nbsp; JDBC驱动为sqljdbc.jar</p>
<p>&nbsp;</p>
<p><strong>3.配置步聚</strong></p>
<p>(1) 建立proxool.xml文件,路径为根目录src下即与hibernate.cfg.xml同目录,内容如下:</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!--<br />
&nbsp; the proxool configuration can be embedded within your own application's.<br />
&nbsp; Anything outside the "proxool" tag is ignored.<br />
--&gt;<br />
&lt;something-else-entirely&gt;<br />
&nbsp; &lt;proxool&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;alias&gt;mssqlProxool&lt;/alias&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;driver-url&gt;jdbc:sqlserver://XXX.XXX.XXX.XX:1433;databaseName=XXX&lt;/driver-url&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;com.microsoft.sqlserver.jdbc.SQLServerDriver&lt;/driver-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;driver-properties&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="user" value="sa" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password" value="XXX" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/driver-properties&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;house-keeping-test-sql&gt;select CURRENT_DATE&lt;/house-keeping-test-sql&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;house-keeping-sleep-time&gt;90000&lt;/house-keeping-sleep-time&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;simultaneous-build-throttle&gt;20&lt;/simultaneous-build-throttle&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;maximum-connection-count&gt;100&lt;/maximum-connection-count&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;minimum-connection-count&gt;10&lt;/minimum-connection-count&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;maximum-connection-lifetime&gt;3600000&lt;/maximum-connection-lifetime&gt;<br />
&nbsp; &lt;/proxool&gt;<br />
&lt;/something-else-entirely&gt;</p>
<p>&nbsp;</p>
<p>属性列表说明:
</p>
<p>fatal-sql-exception:
它是一个逗号分割的信息片段.当一个SQL异常发生时,他的异常信息将与这个信息片段进行比较.如果在片段中存在,那么这个异常将被认为是个致命错误
(Fatal SQL Exception
).这种情况下,数据库连接将要被放弃.无论发生什么,这个异常将会被重掷以提供给消费者.用户最好自己配置一个不同的异常来抛出.</p>
<p>fatal-sql-exception-wrapper-class:正如上面所说,你最好配置一个不同的异常来重掷.利用这个属性,用户可以包装</p>
<p>SQLException,使他变成另外一个异常.这个异常或者继承SQLException或者继承字RuntimeException.proxool</p>
<p>自带了2个实现:'org.logicalcobwebs.proxool.FatalSQLException' 和'org.logicalcobwebs.proxool.FatalRuntimeException'.后者更合适.</p>
<p>house-keeping-sleep-time: house keeper 保留线程处于睡眠状态的最长时间,house keeper 的职责就是检查</p>
<p>各个连接的状态,并判断是否需要销毁或者创建.</p>
<p>house-keeping-test-sql: 如果发现了空闲的数据库连接.house keeper 将会用这个语句来测试.这个语句最好非</p>
<p>常快的被执行.如果没有定义,测试过程将会被忽略。</p>
<p>injectable-connection-interface: 允许proxool实现被代理的connection对象的方法.</p>
<p>injectable-statement-interface: 允许proxool实现被代理的Statement 对象方法.</p>
<p>injectable-prepared-statement-interface: 允许proxool实现被代理的PreparedStatement 对象方法.</p>
<p>injectable-callable-statement-interface: 允许proxool实现被代理的CallableStatement 对象方法.</p>
<p>jmx: 如果属性为true，就会注册一个消息Bean到jms服务，消息Bean对象名: "Proxool:type=Pool, name=&lt;alias&gt;". 默认值为false.</p>
<p>jmx-agent-id:
一个逗号分隔的JMX代理列表(如使用MBeanServerFactory.findMBeanServer(String
agentId)注册的连接池。）这个属性是仅当"jmx"属性设置为"true"才有效。所有注册jmx服务器使用这个属性是不确定的</p>
<p>jndi-name: 数据源的名称</p>
<p>maximum-active-time: 如果housekeeper 检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程.</p>
<p>所以确认一下你的服务器的带宽.然后定一个合适的值.默认是5分钟.</p>
<p>maximum-connection-count: 最大的数据库连接数.</p>
<p>maximum-connection-lifetime: 一个线程的最大寿命.</p>
<p>minimum-connection-count: 最小的数据库连接数</p>
<p>overload-without-refusal-lifetime: 这可以帮助我们确定连接池的状态。如果我们已经拒绝了一个连接在这个设定值</p>
<p>(毫秒),然后被认为是超载。默认为60秒。</p>
<p>prototype-count: 连接池中可用的连接数量.如果当前的连接池中的连接少于这个数值.新的连接将被建立</p>
<p>(假设没有超过最大可用数).例如.我们有3个活动连接2个可用连接,而我们的prototype-count是4,那么数</p>
<p>据库连接池将试图建立另外2个连接.这和 minimum-connection-count不同. minimum-connection-count</p>
<p>把活动的连接也计算在内.prototype-count 是spare connections 的数量.</p>
<p>recently-started-threshold: 这可以帮助我们确定连接池的状态,连接数少还是多或超载。只要至少有一个连接</p>
<p>已开始在此值(毫秒)内,或者有一些多余的可用连接,那么我们假设连接池是开启的。默认为60秒</p>
<p>simultaneous-build-throttle:
这是我们可一次建立的最大连接数。那就是新增的连接请求,但还没有可供使用的连接。由于连接可以使用多线程,在有限的时间之间建立联系从而带来可用连接，
但是我们需要通过一些方式确认一些线程并不是立即响应连接请求的，默认是10。</p>
<p>statistics: 连接池使用状况统计。 参数&#8220;10s,1m,1d&#8221;</p>
<p>statistics-log-level: 日志统计跟踪类型。 参数&#8220;ERROR&#8221;或 &#8220;INFO&#8221;</p>
<p>test-before-use: 如果为true，在每个连接被测试前都会服务这个连接，如果一个连接失败，那么将被丢弃，另一个连接将会被处理，如果所有连接都失败，一个新的连接将会被建立。否则将会抛出一个SQLException异常。</p>
<p>test-after-use: 如果为true，在每个连接被测试后都会服务这个连接，使其回到连接池中，如果连接失败，那么将被废弃。</p>
<p>trace: 如果为true,那么每个被执行的SQL语句将会在执行期被log记录(DEBUG LEVEL).你也可以注册一个ConnectionListener (参看ProxoolFacade)得到这些信息.</p>
<p>&nbsp;</p>
<p>(2)修改hibernate.cfg.xml文件,内容如下:</p>
<p>&lt;?xml version='1.0' encoding='UTF-8'?&gt;<br />
&lt;!DOCTYPE hibernate-configuration PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Hibernate/Hibernate Configuration DTD 3.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;<br />
<br />
&lt;!-- Generated by MyEclipse Hibernate Tools.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&lt;hibernate-configuration&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;session-factory&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="hibernate.proxool.pool_alias"&gt;mssqlProxool&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="hibernate.proxool.xml"&gt;proxool.xml&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property
name="hibernate.connection.provider_class"&gt;org.hibernate.connection.ProxoolConnectionProvider&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">&lt;property name="hibernate.proxool.existing_pool"&gt;true&lt;/property&gt;</span>
&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="hibernate.cache.use_query_cache"&gt;true&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/session-factory&gt;<br />
&lt;/hibernate-configuration&gt;</p>
<p>这里需注意三点:</p>
<p>1.别名与proxool中的别名保持一致. </p>
<p>2.路径确保正确 </p>
<p>3一般网上只说明了以上两点,<span style="color: #ff0000;">hibernate.proxool.existing_pool 这个参数很重要<br />
</span>
</p>
<p><span style="color: #ff0000;">hibernate.proxool.existing_pool：此值设为 false，当 hibernate 开始被调用时，就会初始化 proxool，进行数据库连接等操作；</span>
</p>
<p>&nbsp;</p>
<p>(3)要让程序直接使用proxool连接池,可以在web.xml中<span style="color: #3366ff;">配置初始化servlet,在web容器加载的时候自动加载配置文件</span>
</p>
<p>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;ServletConfigurator &lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.logicalcobwebs.proxool.configuration.ServletConfigurator&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;param-name&gt;xmlFile&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">&lt;param-value&gt;/WEB-INF/classes/proxool.xml&lt;/param-value&gt;</span>
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</p>
<p><span style="color: #ff0000;">注意:如果同时配置了web.xml和hibernate.cfg.xml会产生错误:</span>
</p>
<p><span style="color: #ff0000;">org.logicalcobwebs.proxool.ProxoolException:&nbsp;&nbsp; Parsing&nbsp;&nbsp; failed.</span>
</p>
<p><span style="color: #ff0000;">因为同名的proxool连接池已经启动，而hibernate开始运行时会自己启动关联的proxool连接池.</span>
</p>
<p><span style="color: #ff0000;">所以此时应改变hibernate.cfg.xml配置为:</span>
</p>
<p><span style="color: #ff0000;"><span class="tag">&lt;</span>
<span class="tag-name">property</span>
&nbsp;
<span class="attribute">name</span>
=
<span class="attribute-value">"hibernate.proxool.existing_pool"</span>
<span class="tag">&gt;</span>
true
<span class="tag">&lt;/</span>
<span class="tag-name">property</span>
<span class="tag">&gt;</span>
</span>
</p>
<p>&nbsp;</p>
<p>(4)这一步是可选的 <span style="color: #008000;">在应用中实时监控连接池</span>
</p>
<p>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;adminProxool&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.logicalcobwebs.proxool.admin.servlet.AdminServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;adminProxool&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/admin/proxool&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 访问http://localhost:8080/项目名称/admin/proxool即可看到页面</p>
<p>&nbsp;</p>
<p><strong>4.错误解析:</strong></p>
<p>常遇到的问题是</p>
<p><span style="color: #ff0000;">org.hibernate.HibernateException:Proxool Provider unable to load JAXP configurator file:proxool.xml</span>
</p>
<p>这有可能是由于proxool包版本的问题,我先后试过proxool-0.9.0RC1 proxool-0.9.0RC2 proxool-0.9.0RC3</p>
<p>proxool-0.9.0 proxool-0.9.1 结果是高版本的0.9.0和0.9.1都会有这个问题,使用RC1或者以下的版本则没有.</p>
<p>&nbsp;</p>
<p>希望以上的解说写成word文档提供下载,希望能给准备使用proxool的朋友以帮助.</p>
<p><br />
</p>
<p><br />
</p>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/300757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-11-02 17:02 <a href="http://www.blogjava.net/Juizes361/articles/300757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WMS简介(转)</title><link>http://www.blogjava.net/Juizes361/articles/300651.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Mon, 02 Nov 2009 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/300651.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/300651.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/300651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/300651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/300651.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p><strong><br />
</strong></p>
<p><strong>1 简要介绍</strong><br />
WMS是OGC标准中比较简单也是比较重要的标准之一。它全称是&#8220;Web Map
Service&#8221;（网络地图服务）。此标准主要定义了用于创建和显示地图图像的三大操作：GetCapabilities（获取服务能力）,
GetMap（获取地图）和GetFeatureInfo（获取对象信息）。其中GetMap为核心操作，此操作得到一幅地图图像。</p>
<p><strong><br />
</strong></p>
<p><strong>2 GetMap请求</strong><br />
GetMap请求类似于在Web上请求一幅图像，但它的请求参数更加复杂。下面是一个样例请求：</p>
<p><span style="color: #0817ff;">http://webmapping.mgis.psu.edu/geoserver/wms?version=1.1.1&amp;request=getmap&amp;layers=topp:states&amp;styles=population&amp;SRS=EPSG:4326&amp;bbox=-125,24,-67,50&amp;width=400&amp;height=200&amp;format=image/png</span></p>
<p>返回的图像如下图所示：</p>
<p><img title="WMS" style="width: 164px; height: 82px;" src="http://www.blogjava.net/images/blogjava_net/juizes361/wms_1.jpg" alt="" align="left" border="0" height="82" width="164" /></p>
<p>&nbsp;</p>
<p><br />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>其中：</p>
<p>http:// —— 使用的网络协议</p>
<p>webmapping.mgis.psu.edu/ —— 主机域名</p>
<p>geoserver/wms —— 页面或web程序位置</p>
<p>参数 ——</p>
<p>version=1.1.1 —— WMS版本号</p>
<p>request=getmap —— 操作动词，可以为GetCapabilities, GetMap和GetFeatureInfo等</p>
<p>layers=topp:states —— 请求地图所包含的图层名，可以为多层</p>
<p>styles=population —— 指定图层绘制的样式名</p>
<p>SRS=EPSG:4326 —— 指定地图的坐标投影系统代码</p>
<p>bbox=-125,24,-67,50 —— 请求地图的范围（The Bounding Box）</p>
<p>width=400 —— 地图的像素宽度</p>
<p>height=200 —— 地图的像素高度，宽度和高度的不同设置可能会引起返回图像的变形</p>
<p><img title="WMS" src="http://www.blogjava.net/images/blogjava_net/juizes361/wms_2.jpg" alt="" align="left" border="0" height="54" width="164" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>format=image/png —— 返回地图图像的格式，可以为Image/gif, image/jpg, image/svg+xml等等</p>
<p>如果参数设置错误，将返回一个XML文件来描述错误信息。如下所示：</p>
</span></span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ServiceExceptionReport&nbsp;</span><span style="color: #ff0000;">version</span><span style="color: #0000ff;">=&#8221;1.1.1&#8220;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">&lt;ServiceException&nbsp;code</span><span style="color: #0000ff;">=&#8221;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">WIDTH&nbsp;and&nbsp;HEIGHT&nbsp;incorrectly&nbsp;specified<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ServiceException</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ServiceExceptionReport</span><span style="color: #0000ff;">&gt;</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p>&nbsp;</p>
<p><strong>3 GetCapabilities请求</strong><br />
GetCapabilities请求用于查询WMS服务的能力信息，包括支持的服务、支持的格式、空间坐标、地图列表、地图样式等。它主要的目的是使客户端在使用GetMap请求前可以对WMS服务有一个基本的了解，从而可以设置正确的参数。</p>
<p>GetCapabilities请求的样例如下所示：</p>
<p><span style="color: #0817ff;">http://webmapping.mgis.psu.edu/geoserver/wms?version=1.1.1&amp;request=getcapabilities</span></p>
<p>返回是一个XML文件，包括Service、Capability等部分，详细信息可以查看返回XML文件。</p>
<p><br />
</p>
<p><strong>4 GetFeatureInfo请求</strong><br />
GetFeatureInfo用于查询屏幕某点的对象信息，它的样例请求如下所示：</p>
<p><span style="color: #0817ff;">http://webmapping.mgis.psu.edu/geoserver/wms?version=1.1.1&amp;request=getfeatureinfo&amp;layers=topp:states&amp;styles=population&amp;SRS=EPSG:4326&amp;bbox=-125,24,-67,50&amp;<br />
width=400&amp;height=200&amp;format=text/html&amp;X=100&amp;y=100&amp;query_layers=topp:states</span></p>
<p>此请求返回一个HTML文档来描述对象，如下所示：</p>
</span></span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><span style="color: #2708ff;"><span style="font-size: 8pt;"><span style="font-size: 10pt;">Results&nbsp;for&nbsp;FeatureType&nbsp;&#8217;states&#8217;:<br />
——————————————&#8211;<br />
the_geom&nbsp;=&nbsp;[GEOMETRY&nbsp;(MultiPolygon)&nbsp;with&nbsp;153&nbsp;points]<br />
STATE_NAME&nbsp;=&nbsp;Arizona<br />
STATE_FIPS&nbsp;=&nbsp;04<br />
SUB_REGION&nbsp;=&nbsp;Mtn<br />
STATE_ABBR&nbsp;=&nbsp;AZ<br />
LAND_KM&nbsp;=&nbsp;294333.462<br />
WATER_KM&nbsp;=&nbsp;942.772<br />
PERSONS&nbsp;=&nbsp;3665228.0<br />
FAMILIES&nbsp;=&nbsp;940106.0<br />
HOUSHOLD&nbsp;=&nbsp;1368843.0<br />
MALE&nbsp;=&nbsp;1810691.0<br />
FEMALE&nbsp;=&nbsp;1854537.0<br />
WORKERS&nbsp;=&nbsp;1358263.0<br />
DRVALONE&nbsp;=&nbsp;1178320.0<br />
CARPOOL&nbsp;=&nbsp;239083.0<br />
PUBTRANS&nbsp;=&nbsp;32856.0<br />
EMPLOYED&nbsp;=&nbsp;1603896.0<br />
UNEMPLOY&nbsp;=&nbsp;123902.0<br />
SERVICE&nbsp;=&nbsp;455896.0<br />
MANUAL&nbsp;=&nbsp;185109.0<br />
P_MALE&nbsp;=&nbsp;0.494<br />
P_FEMALE&nbsp;=&nbsp;0.506<br />
SAMP_POP&nbsp;=&nbsp;468178.0</span></span></span></span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p><span style="font-size: 8pt;">
<p><br />
</p>
<p>&nbsp;</p>
</span></p>
<p><br />
</p>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/300651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-11-02 10:31 <a href="http://www.blogjava.net/Juizes361/articles/300651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Postgres模板数据库(转)</title><link>http://www.blogjava.net/Juizes361/articles/300304.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Fri, 30 Oct 2009 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/300304.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/300304.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/300304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/300304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/300304.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">
<p><tt class="COMMAND"><br />
</tt></p>
<p><tt class="COMMAND">CREATE DATABASE</tt>
实际上是通过拷贝一个现有的数据库进行工作的。缺省时，它拷贝名为 <tt class="LITERAL">template1</tt>
的标准系统数据库。所以该数据库是创建新数据库的"模板"。如果你给 <tt class="LITERAL">template1</tt>
增加对象，这些对象将被拷贝到随后创建的用户数据库中。这样的行为允许节点对数据库中的标准套件进行修改。比如，如果你把过程语言
PL/pgSQL 安装到 <tt class="LITERAL">template1</tt>
里，那么你在创建用户数据库的时候它们就会自动可得，而不需要额外的动作。</p>
<p>系统里还有名为 <tt class="LITERAL">template0</tt> 的第二个标准系统数据库，这个数据库包含和
<tt class="LITERAL">template1</tt> 初始时一样的数据内容，也就是说，只包含标准的
PostgreSQL 对象。在 <tt class="COMMAND">initdb</tt> 之后，我们不应该对
<tt class="LITERAL">template0</tt> 做任何修改。通过告诉 <tt class="COMMAND">CREATE DATABASE</tt> 使用 <tt class="LITERAL">template0</tt> 而不是 <tt class="LITERAL">template1</tt>
进行拷贝，你可以创建一个"纯净"的用户数据库，它不会包含任何 <tt class="LITERAL">template1</tt>
里所特有的东西。这一点在恢复 <tt class="LITERAL">pg_dump</tt>
转储的时候是非常方便的：转储脚本应该在一个纯净的数据库中恢复以确保我们正确创建了被转储出的数据库内容，而不和任何现在可能已经存在于
<tt class="LITERAL">template1</tt> 中的附加物相冲突。</p>
<p>要通过拷贝 <tt class="LITERAL">template0</tt>
的方法创建一个数据库，可使用下列方法之一：</p>
</span></span><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">CREATE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">DATABASE</span><span style="color: #000000;">&nbsp;dbname&nbsp;TEMPLATE&nbsp;template0;<br />
<br />
</span><span style="color: #000000;">createdb&nbsp;</span><span style="color: #808080;">-</span><span style="color: #000000;">T&nbsp;template0&nbsp;dbname</span><br />
</div>
<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">
<p><br />
</p>
<p>前者用于 SQL 环境，后者用于 shell 环境。</p>
<p>我们可以创建额外的模板数据库，而且实际上我们可以在一个集群中通过将 <tt class="COMMAND">CREATE
DATABASE</tt> 的模板声明为相应的数据库名拷贝任何数据库。不过，我们必需明白，这个功能并非一般性的<span class="QUOTE">"<tt class="COMMAND">COPY
DATABASE</tt>"</span>工具。实际上，在拷贝操作的过程中，源数据库必需是空闲状态(没有正在处理的数据修改事务)。如果在
<tt class="COMMAND">CREATE DATABASE</tt> 开始的时候存在其它连接，那么操作将会失败，否则在
<tt class="COMMAND">CREATE DATABASE</tt> 的执行过程中新连接都将被锁定，直到拷贝完成。</p>
<p>在 <tt class="LITERAL">pg_database</tt>
里有两个有用的标志可以用于每个数据库：<tt class="LITERAL">datistemplate</tt> 和
<tt class="LITERAL">datallowconn</tt> 字段。<tt class="LITERAL">datistemplate</tt> 表示该数据库是准备用作 <tt class="COMMAND">CREATE
DATABASE</tt> 模板的。如果设置了这个标志，那么该数据库可以由任何有 <tt class="LITERAL">CREATEDB</tt> 权限的用户克隆；如果没有设置，那么只有超级用户和该数据库的所有者可以克隆它。如果
<tt class="LITERAL">datallowconn</tt>
为假，那么将不允许与该数据库发生任何新的连接(不过现有的会话不会因为把该标志设置为假而被杀死)。<tt class="LITERAL">template0</tt> 数据库通常被标记为 <tt class="LITERAL">datallowconn
= false</tt> 以避免对它的修改。<tt class="LITERAL">template0</tt> 和
<tt class="LITERAL">template1</tt> 都应该总是标记为 <tt class="LITERAL">datistemplate = true</tt> 。</p>
<p><strong>【注意】</strong><tt class="LITERAL">template1</tt> 和 <tt class="LITERAL">template0</tt> 没有任何特殊的状态，除了 <tt class="LITERAL">template1</tt> 是 <tt class="COMMAND">CREATE DATABASE</tt>
的缺省源数据库名之外。比如，我们可以删除 <tt class="LITERAL">template1</tt> 然后从
<tt class="LITERAL">template0</tt> 中创建它而不会有任何不良效果。如果我们不小心在
<tt class="LITERAL">template1</tt> 里加了一堆垃圾，那么我们就会建议做这样的操作。</p>
<p>&nbsp;</p>
<p>在初始化数据库集群的时候，也会创建 <tt class="LITERAL">postgres</tt>
数据库。这个数据库用于做为用户和应用连接的缺省数据库。它只是 <tt class="LITERAL">template1</tt>
的一个简单拷贝，需要的时候可以删除或者重建。</p>
<p><br />
</p>
<p><br />
</p>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/300304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-30 10:00 <a href="http://www.blogjava.net/Juizes361/articles/300304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装postgis,使用postgis导入shapefile的步骤总结(转)</title><link>http://www.blogjava.net/Juizes361/articles/300302.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Fri, 30 Oct 2009 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/300302.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/300302.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/300302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/300302.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/300302.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p><br />
</p>
<p><strong><span style="font-size: 12pt;">一. 安装postgis</span></strong></p>
<p>&nbsp;&nbsp;&nbsp; (1) 首先到postgresql的官方网站(<cite>www.<strong>postgresql</strong>.org</cite>)上下载最新版的开源数据库postgresql,我当前下载的最新安装包是postgresql-8.3.6-1-windows.exe </p>
<p>&nbsp;&nbsp;&nbsp; (2) 运行该exe,按照向导安装之,在安装过程中最好关闭防火墙,以及监控;另外最好将安装目录设置为NTFS分区的盘上.</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(3) 安装完成后提示你是否在退出时配置application stack builder,这里购选上它,然后点finish</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(4) 进入application stack builder向导后,选择postgresql 8.3 on port 5432,点next.</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(5) 在application list中沟选中你要安装的application,这里必须沟选postgis-pg83-setup-1.3.5-1.exe</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(6) 下一步,选择下载服务器,下载完成后开始安装相应的application.</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(7) 在安装时要注意,有两处都要设置密码,不要设置密码为空.</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(8) 这样根据向导就可以成功安装postgis了</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>安装postgis过程中可能会出现:</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>"Error opening file for writing: c:\program files\PostgreSQL\8.3\bin\libiconv-2.dll"的提示,这里我们可以忽略之.</p>
<p><br />
</p>
<p><strong><span style="font-size: 12pt;">二. 向postgis导入shapefile数据</span></strong></p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(1)安装后运行pgadmin III,右击postgresql 8.3(localhost)服务器,连接之,这里的密码是你安装时设置的密码,务必牢记.</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(2)连接后,我们发现postgis安装后自动给我们生成了一个数据库template_postgis,我们将要导入的数据就需要放到这个数据库中.</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(3)运行命名提示符cmd.exe,将其转向C:\Program Files\PostgreSQL\8.3\bin(或者将cmd.exe复制到该目录下)如下:</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>C:\Program Files\PostgreSQL\8.3\bin&gt;</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(4)首先将shp生成对应的sql脚本,键入以下字符</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>C:\Program Files\PostgreSQL\8.3\bin&gt;shp2pgsql -W "GBK" D:\CampusGISProject\new_pku_vector\viwpt.shp viwpt &gt; D:\CampusGISProject\new_pku_vector\viwpt.sql</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>这里的-W
"GBK"代表字符编码的转换,D:\CampusGISProject\new_pku_vector\viwpt.shp则是要生成sql脚本的
shp文件.viwpt是创建数据表的表名,&gt;不能少,D:\CampusGISProject\new_pku_vector
\viwpt.sql则是要生成SQL文件的绝对目录</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 生成成功后命令提示符会显示如下: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; Shapefile type: Point<br />
&nbsp;&nbsp;&nbsp;&nbsp; Postgis type: POINT[2]</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>(5)然后我们执行sql语句,执行该SQL语句文件,导入数据到数据库template_postgis中</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>C:\Program Files\PostgreSQL\8.3\bin&gt;psql -d template_postgis -f D:\CampusGISProject\new_pku_vector\viwpt.sql postgres</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>其中 template_postgis是数据库名,postgres是该数据库的用户.</p>
<p><br />
</p>
<p><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span></span>执行成功后,刷新该数据库,就可以看到新生成的数据表viwpt<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">, </span></span>这样viwpt.shp数据就成功导入到了postgis中了.<br />
</p>
</span></span><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;"><br />
<br />
<br />
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/300302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-30 09:36 <a href="http://www.blogjava.net/Juizes361/articles/300302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断JS文件加载完成(转)</title><link>http://www.blogjava.net/Juizes361/articles/299861.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Tue, 27 Oct 2009 00:49:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/299861.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/299861.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/299861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/299861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/299861.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;"><br />
在&#8220;按需加载&#8221;的需求中，我们经常会判断当脚本加载完成时，返回一个回调函数，那如何去判断脚本的加载完成呢? <br />
<br />
我们可以对加载的 JS 对象使用 onload 来判断(js.onload)，此方法 Firefox2、Firefox3、Safari3.1+、Opera9.6+ 浏览器都能很好的支持，但 IE6、IE7 却不支持。曲线救国 —— IE6、IE7 我们可以使用 js.onreadystatechange 来跟踪每个状态变化的情况(一般为 loading 、loaded、interactive、complete)，当返回状态为 loaded 或 complete 时，则表示加载完成，返回回调函数。<br />
<br />
对于 readyState 状态需要一个补充说明：<br />
<br />
在 interactive 状态下，用户可以参与互动。<br />
<br />
Opera 其实也支持 js.onreadystatechange，但他的状态和 IE 的有很大差别。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;include_js(file)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;_doc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.getElementsByTagName('head')[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;js&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.createElement('script');<br />
&nbsp;&nbsp;&nbsp;&nbsp;js.setAttribute('type',&nbsp;'text</span><span style="color: #000000;">/</span><span style="color: #000000;">javascript');<br />
&nbsp;&nbsp;&nbsp;&nbsp;js.setAttribute('src',&nbsp;file);<br />
&nbsp;&nbsp;&nbsp;&nbsp;_doc.appendChild(js);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #008000;">/*</span><span style="color: #008000;">@cc_on!@</span><span style="color: #008000;">*/</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">if&nbsp;not&nbsp;IE</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Firefox2、Firefox3、Safari3.1+、Opera9.6+&nbsp;support&nbsp;js.onload</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;js.onload&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Firefox2、Firefox3、Safari3.</span><span style="color: #000000;">1</span><span style="color: #000000;">+</span><span style="color: #000000;">、Opera9.</span><span style="color: #000000;">6</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;support&nbsp;js.onload');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">IE6、IE7&nbsp;support&nbsp;js.onreadystatechange</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;js.onreadystatechange&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(js.readyState&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;'loaded'&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;js.readyState&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;'complete')&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('IE6、IE7&nbsp;support&nbsp;js.onreadystatechange');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
}<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">execution&nbsp;function</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">include_js('http:</span><span style="color: #008000;">//</span><span style="color: #008000;">www.planabc.net/wp-includes/js/jquery/jquery.js');</span></div>
<br />
<br />
<br />
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/299861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-27 08:49 <a href="http://www.blogjava.net/Juizes361/articles/299861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java软件架构师所要需的东西(转)</title><link>http://www.blogjava.net/Juizes361/articles/299366.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Thu, 22 Oct 2009 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/299366.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/299366.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/299366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/299366.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/299366.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">作为Java程序员来说，最痛苦的事情莫过于可以选择的范围太广，可以读的书太多，往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些，按照学习的先后顺序，推荐给大家，特别是那些想不断提高自己技术水平的Java程序员们。<br />
<br />
<strong>一、Java编程入门类</strong><br />
<br />
对于没有Java编程经验的程序员要入门，随便读什么入门书籍都一样，这个阶段需要你快速的掌握Java基础语法和基本用法，宗旨就是&#8220;囫囵吞枣不求甚解&#8221;，先对Java熟悉起来再说。用很短的时间快速过一遍Java语法，连懵带猜多写写代码，要&#8220;知其然&#8221;。<br />
<br />
1、《Java编程思想》<br />
<br />
在有了一定的Java编程经验之后，你需要&#8220;知其所以然&#8221;了。这个时候《Java编程思想》是一本让你知其所以然的好书，它对于基本的面向对象知识有比较清楚的交待，对Java基本语法，基本类库有比较清楚的讲解，可以帮你打一个良好的Java编程基础。这本书的缺点是实在太厚，也比较罗嗦，不适合现代人快节奏学习，因此看这本书要懂得取舍，不是每章每节都值得一看的，挑重点的深入看就可以了。<br />
<br />
2、《Agile Java》中文版<br />
<br />
这本书是出版社送给我的，我一拿到就束之高阁，放在书柜一页都没有翻过，但是前两天整理书柜的时候，拿出来一翻，竟然发现这绝对是一本好书！这本书一大特点是以单元测试和TDD来贯穿全书的，在教你Java各种重要的基础知识的过程中，潜移默化的影响你的编程思维走向敏捷，走向TDD。另外这本书成书很新，以JDK5.0的语法为基础讲解，要学习JDK5.0的新语法也不错。还有这本书对于内容取舍也非常得当，Java语言毕竟类库庞大，可以讲的内容太多，这本书选择的内容以及内容的多寡都很得当，可以让你以最少的时间掌握Java最重要的知识，顺便培养出来优秀的编程思路，真是一本不可多得的好书。<br />
<br />
虽然作者自己把这本书定位在入门级别，但我不确定这本书用来入门是不是稍微深了点，我自己也准备有空的时候翻翻这本书，学习学习。<br />
<br />
<br />
<strong>二、Java编程进阶类</strong><br />
<br />
打下一个良好的Java基础，还需要更多的实践经验积累，我想没有什么捷径。有两本书值得你在编程生涯的这个阶段阅读，培养良好的编程习惯，提高你的代码质量。<br />
<br />
1、《重构 改善既有代码的设计》<br />
<br />
这本书名气很大，不用多介绍，可以在闲暇的时候多翻翻，多和自己的实践相互印证。这本书对你产生影响是潜移默化的。<br />
<br />
2、《测试驱动开发 by Example》<br />
本书最大特点是很薄，看起来没有什么负担。你可以找一个周末的下午，一边看，一边照做，一个下午就把书看完，这本书的所有例子跑完了。这本书的作用是通过实战让你培养TDD的思路。<br />
<br />
<strong>三、Java架构师之路</strong><br />
<br />
到这个阶段，你应该已经非常娴熟的运用Java编程，而且有了一个良好的编程思路和习惯了，但是你可能还缺乏对应用软件整体架构的把握，现在就是你迈向架构师的第一步。<br />
<br />
1、《Expert One-on-One J2EE Design and Development》<br />
<br />
这本书是Rod Johnson的成名著作，非常经典，从这本书中的代码诞生了springframework。但是好像这本书没有中译本。<br />
<br />
2、《Expert One-on-One J2EE Development without EJB》<br />
<br />
这本书由gigix组织翻译，多位业界专家参与，虽然署名译者是JavaEye，其实JavaEye出力不多，实在是忝居译者之名。<br />
<br />
以上两本书都是Rod Johnson的经典名著，Java架构师的必读书籍。在我所推荐的这些书籍当中，是我看过的最仔细，最认真的书，我当时读这本书几乎是废寝忘食的一气读完的，有小时候挑灯夜读金庸武侠小说的劲头，书中所讲内容和自己的经验知识一一印证，又被无比精辟的总结出来，读完这本书以后，我有种被打通经脉，功力爆增的感觉。<br />
<br />
但是后来我看过一些其他人的评价，似乎阅读体验并没有我那么high，也许是因为每个人的知识积累和经验不同导致的。我那个时候刚好是经验知识积累已经足够丰富，但是还没有系统的整理成型，让这本书一梳理，立刻形成完整的知识体系了。<br />
<br />
3、《企业应用架构模式》<br />
<br />
Martin的又一本名著，但这本书我只是泛泛的看了一遍，并没有仔细看。这本书似乎更适合做框架的人去看，例如如果你打算自己写一个ORM的话，这本书是一定要看的。但是做应用的人，不看貌似也无所谓，但是如果有空，我还是推荐认真看看，会让你知道框架为什么要这样设计，这样你的层次可以晋升到框架设计者的角度去思考问题。Martin的书我向来都是推崇，但是从来都没有像Rod Johnson的书那样非常认真去看。<br />
<br />
4、《敏捷软件开发原则、模式与实践》<br />
Uncle Bob的名著，敏捷的经典名著，这本书比较特别，与其说是讲软件开发过程的书，不如说讲软件架构的书，本书用了很大篇幅讲各种面向对象软件开发的各种模式，个人以为看了这本书，就不必看GoF的《设计模式》了。<br />
<br />
<br />
<strong>四、软件开发过程</strong><br />
<br />
了解软件开发过程不单纯是提高程序员个人的良好编程习惯，也是增强团队协作的基础。<br />
<br />
1、《UML精粹》<br />
<br />
UML其实和软件开发过程没有什么必然联系，却是软件团队协作沟通，撰写软件文档需要的工具。但是UML真正实用的图不多，看看这本书已经足够了，完全没有必要去啃《UML用户指南》之类的东西。要提醒大家的是，这本书的中译本翻译的非常之烂，建议有条件的看英文原版。<br />
<br />
2、《解析极限编程 拥抱变化》XP<br />
<br />
这是Kent Beck名著的第二版，中英文对照。没什么好说的，必读书籍。<br />
<br />
3、《统一软件开发过程》UP<br />
<br />
其实UP和敏捷并不一定冲突，UP也非常强调迭代，测试，但是UP强调的文档和过程驱动却是敏捷所不取的。不管怎么说，UP值得你去读，毕竟在中国真正接受敏捷的企业很少，你还是需要用UP来武装一下自己的，哪怕是披着UP的XP。<br />
<br />
4、《敏捷建模》AM<br />
<br />
Scott Ambler的名著，这本书非常的progmatic，告诉你怎么既敏捷又UP，把敏捷和UP统一起来了，又提出了很多progmatic的建议和做法。你可以把《解析极限编程拥抱变化》、《统一软件开发过程》和《敏捷建模》这三本书放在一起读，看XP和UP的不同点，再看AM是怎么统一XP和UP的，把这三种理论融为一炉，形成自己的理论体系，那么你也可以去写书了。<br />
<br />
<br />
<strong>五、软件项目管理</strong><br />
<br />
如果你突然被领导提拔为项目经理，而你完全没有项目管理经验，你肯定会心里没底；如果你觉得自己管理项目不善，很想改善你的项目管理能力，那么去考PMP肯定是远水不解近渴的。<br />
<br />
1、《快速软件开发》<br />
<br />
这也是一本名著。可以这样说，有本书在手，你就有了一个项目管理的高级参谋给你出谋划策，再也不必担心自己不能胜任的问题了。这本书不是讲管理的理论的，在实际的项目管理中，讲这些理论是不解决问题的，这本书有点类似于&#8220;软件项目点子大全&#8221;之类的东西，列举了种种软件项目当中面临的各种问题，以及应该如何解决问题的点子，你只需要稍加变通，找方抓药就行了。<br />
<br />
<br />
<strong>六、总结</strong><br />
<br />
在这份推荐阅读书籍的名单中，我没有列举流行的软件框架类学习书籍，例如Struts，Hibernate，Spring之类，也没有列举AJAX方面的书籍。是因为这类书籍容易过时，而上述的大半书籍的生命周期都足够长，值得你去购买和收藏。<br />
<br />
<br />
<br />
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/299366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-22 15:01 <a href="http://www.blogjava.net/Juizes361/articles/299366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用OpenLayers开发WebGIS客户端(转)</title><link>http://www.blogjava.net/Juizes361/articles/299170.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Wed, 21 Oct 2009 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/299170.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/299170.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/299170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/299170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/299170.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p>OpenLayers是一个开源的js框架，用于在您的浏览器中实现地图浏览的效果和基本的zoom，pan等功能。OpenLayers支持的地
图来源包括了WMS，GoogleMap，KaMap，MSVirtualEarth等等，您也可以用简单的图片作为源，在这一方面OPenLayers
提供了非常多的选择。</p>
<p>要使用OpenLayers，您可以到它的官方网站http://www.openlayers.org下载他的压缩包，解压后可以看到其中的一些
目录和文件。拷贝dist目录下的OpenLayer.js、根目录下的lib目录、根目录下的img目录到你网站的scrīpts目录下（当然，这个只
是例子，您网站的目录结构您自己说得算，只要保证OpenLayers.js，/lib，/img在同一目录中即可）。</p>
<p>接下来创建一个index.html作为查看地图的页面。导入OpenLayers.js和你将要创建的js。内容需要一个div，我们给它的id起名叫做area。你有必要在写一些CSS限定#area的宽度和高度，如果乐意，加上一个border也是很不错的选择。</p>
<p>废话不多说，我们首先要创建一个OpenLayer.Map对象的实例:<br />
var map = new OpenLayers.Map("area");<br />
其中的参数可以传id，也可以传ElementObject，当然id更加方便一些。</p>
<p>接下来就是向地图中添加图层，通常情况下使用OpenLayers.Layer的子类来完成图层的初始化。<br />
OpenLayers提供了一下Layers的扩展：
</p>
<ul>
    <li>OpenLayers.Layer.Image</li>
    <li>OpenLayers.Layer.HTTPRequest</li>
    <li>OpenLayers.Layer.Grid</li>
    <li>OpenLayers.Layer.WMS</li>
    <li>OpenLayers.Layer.KaMap</li>
    <li>OpenLayers.Layer.EventPane</li>
    <li>OpenLayers.Layer.Google</li>
    <li>OpenLayers.Layer.VirtualEarth</li>
    <li>OpenLayers.Layer.Markers</li>
    <li>OpenLayers.Layer.Text</li>
    <li>OpenLayers.Layer.GeoRSS</li>
    <li>OpenLayers.Layer.Boxes</li>
    <li>OpenLayers.Layer.TMS</li>
</ul>
Image类封装一个实际图象作为图曾内容<br />
HTTPRequest类可以接收一个动态生成的图片，你可以通过HTTPRequest类的参数向服务器发送参数<br />
Grid类是HTTPRequest类的子类，提供更加详细的方法<br />
WMS类用于连接WMS服务器以获得图象<br />
KaMap类用于连接MapServer<br />
EventPane类作为用于接收用户操作的图层<br />
Google类用于从Google获得图象，它仍然需要你从Google获得API KEY，并且include<br />
VirtualEarth类用于操作VirtualEarth的图层<br />
Markers类用于生成接收和显示用户本地标记的图层<br />
Text类用于接收CSV文件<br />
GeoRSS类是Marker类的子类，用于封装接收GeoRSS并在图层中作出marker<br />
Boxes同样也是Marker类的子类，可以用div来做marker，而非image<br />
TMS用于接收TMS服务器的地图
<p>创建完图层后，可以用Map的addLayer(layer)方法插入，并执行Map的zoomToMaxExtent()方法让地图合适地显示。</p>
<p>OpenLayers还提供了丰富的Control类为地图浏览添加一些工具，继承自OpenLayers.Control类
</p>
<ul>
    <li>OpenLayers.Control.LayerSwitcher</li>
    <li>OpenLayers.Control.MouseDefaults</li>
    <li>OpenLayers.Control.MousePosition</li>
    <li>OpenLayers.Control.MouseToolbar</li>
    <li>OpenLayers.Control.OverviewMap</li>
    <li>OpenLayers.Control.PanZoom</li>
    <li>OpenLayers.Control.PanZoomBar</li>
    <li>OpenLayers.Control.Permalink</li>
    <li>OpenLayers.Control.Scale</li>
</ul>
这些类的实例会在地图浏览的&#8220;窗口&#8221;上增加一些工具栏或是&#8220;按钮&#8221;，增加互动性和功能性。
<p>OpenLayers对常用的数据结构进行了封装
</p>
<ul>
    <li>OpenLayers.LonLat</li>
    <li>OpenLayers.Size</li>
    <li>OpenLayers.Pixel</li>
    <li>OpenLayers.Bounds</li>
</ul>
以便于操作。
<p>此外OpenLayers.Util类可以对图片载入错误时图片框的颜色和图片框中默认的图片进行自定义，这一点是非常方便的。OpenLayers的Ajax类对创建XHR对象的过程进行了封装，可以使用它进行简单的Ajax操作。</p>
<p><br />
</p>
<p><br />
</p>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/299170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-21 11:18 <a href="http://www.blogjava.net/Juizes361/articles/299170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分离JavaScript和HTML(转)</title><link>http://www.blogjava.net/Juizes361/articles/299169.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Wed, 21 Oct 2009 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/299169.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/299169.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/299169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/299169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/299169.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;"><br />
今天的目标是实现javascrīpt动作与html的分离，换句话说就是把onclick之类的属性赋值放到html的外面去。这样做的好处不仅仅是使
页面清晰，功能分离，更重要的，对于那些禁用Javascrīpt的浏览器来说，不会造成Error的出现（虽然很多时候功能还是不能实现，那是因为分离
js仅仅是确保访问性的第一步）。<br />
<br />
那么我们应该怎么做呢，直接在js里面这样写吗：<br />
</span></span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">ELEMENT_ID</span><span style="color: #000000;">"</span><span style="color: #000000;">).onclick&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FUNCTION_NAME();</span></div>
<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;"><br />
这是不能实现的，我过去一直不明白为什么它不能正常运转，在做VeryFTP的界面的时候，就苦于此而造成VeryFTP的页面里到处都是难看的onclick。那么现在来解决这个问题，究竟为什么呢？<br />
<br />
其实很简单，直接将这句写在js里，它将在js载入时被执行。而我们现在大多都有这样的好习惯——将&lt;scrīpt src=...一句写在head里，那么这句执行的时候，DOM还是不完整的，整个body都没有载入，那么又何来getElementById呢？<br />
<br />
为
了解决这个问题，理所当然地需要一个事件。我起初一直以为自己熟悉的window.onload事件实在页面刚一载入时触发，但是我错了，这个事件被触发
的时间是文档载入之后，以前曾经隐约有一个ondocumentready的印象，其实就是window.onload吧。所以当初WG的驿站因为
GoogleAD打不开而造成整个网站无法载入的问题恰可以用这个事件来解决问题，虽然往里面append脚本可能还有一点问题，但至少是可能的。（WG
别怪我哈，我当初是年幼无知哈，哈哈）<br />
<br />
于是这样写：<br />
</span></span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">window.onload&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){<br />
&nbsp;&nbsp;addEvent();<br />
}<br />
</span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;addEvent(){<br />
&nbsp;&nbsp;document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">ELEMENT_ID</span><span style="color: #000000;">"</span><span style="color: #000000;">).onclick&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FUNCTION_NAME();<br />
}</span></div>
<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;"><br />
这样就OK了吗？呵呵，没有结束呢。我发现这样写，刷新页面之后居然提示我添加信息完成！！（我页面的功能）。数据库里也多了好几行空白。不过这次问题好找，我几乎一眼就看出来了，呵呵。改成这样<br />
<br />
</span></span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">window.onload&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){<br />
&nbsp;&nbsp;addEvent();<br />
}<br />
</span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;addEvent(){<br />
&nbsp;&nbsp;document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">ELEMENT_ID</span><span style="color: #000000;">"</span><span style="color: #000000;">).onclick&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">FUNCTION_NAME();</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
}</span></div>
<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;"><br />
在
DOM中一切属性都是字符串。刷新，很自然地，函数没有在载入后就被自动执行。但是问题又出来了，点击按钮居然没有用了！！上帝啊，用Frefox自带的
DOM查看器查看呢，按钮上果然没有onclick这一属性。那么IE呢，IE中功能已经实现了，用IE的Develop
Bar查看DOM，果然onclick属性已经被加上去了。<br />
<br />
这样，问题就简单了，Firefox要求我们换一种更加规范的方法为它添加这个属性，而IE也是遵守这种规范的，那我们还犹豫什么：<br />
</span></span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">window.onload&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){<br />
&nbsp;&nbsp;addEvent();<br />
}<br />
</span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;addEvent(){<br />
&nbsp;&nbsp;document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">ELEMENT_ID</span><span style="color: #000000;">"</span><span style="color: #000000;">).setAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">onclick</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">FUNCTION_NAME();</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;<br />
}</span></div>
<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;"><br />
这样就没有问题了，刷新Firefox，重新打开DOM查看器，这个属性已经上去了，运转正常。<br />
<br />
分离JS和HTML的方法终于理清了。<br />
<br />
<br />
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/299169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-21 11:17 <a href="http://www.blogjava.net/Juizes361/articles/299169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GIS研究方向(转)</title><link>http://www.blogjava.net/Juizes361/articles/299075.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Tue, 20 Oct 2009 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/299075.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/299075.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/299075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/299075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/299075.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;">
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;" class="MsoNormal">GIS
已经深入到各行业的应用中，从最早面向制图的系统发展到桌面GIS，随着互联网的发展，出现了WEBGIS，并得到了迅速发展，近年来，智能手机的普及，
嵌入式GIS正成为一种新的客户终端，将被广泛应用到各行业中，硬件性能的提升，三维GIS也逐步被重视起来；同时，随着数据库系统的广泛应用，GIS数
据管理，也从文件系统发展到空间数据库系统；从基础理论研究的角度来讲，时态GIS、空间数据挖掘、自动制图综合等一直是GIS中最难解决的核心课题，吸
引很多科研人员不断在这一领域辛勤耕耘。下面重点谈几个研究方向。</p>
<p><strong>一、&nbsp;空间数据库</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一提到&#8220;空间数据库&#8221;，大家就会想到oracle spatial、arcsde、SuperMap SDX+ 等，实现了GIS图形数据的数据库存储和管理，但仅仅有这些，还不能称其为&#8220;空间数据库&#8221;，下面列举几点，说明&#8220;空间数据库&#8221;还需要研究的方向：</p>
<p>1，
空间数据的完整性。这个问题没有得到很好的解决。所谓&#8220;完整性&#8221;，就是数据的正确性和一致性，在关系型数据库中，有&#8220;实体完整性&#8221;、&#8220;参照完整性&#8221;、&#8220;用
户自定义完整性&#8221;；在空间数据库中，语义层面的空间数据的正确性和一致性，就很难界定，它要比关系型属性数据复杂得多。打个比方，一条道路横跨一条河流，
必然经过一座桥，而如果不经过，就必然违背了空间数据的正确性，也就是说&#8220;不完整&#8221;。这只是一个很简单的例子，类似于这样的空间语义关系，是需要空间数据
库提供&#8220;用户自定义完整性约束&#8221;，以保证空间数据的完整性；但目前所谓的&#8220;空间数据库&#8221;还很难保证这一点，arcsde能从&#8220;图形&#8221;层面保证几何规则的完
整性，但还很难从语义层面保证空间语义的完整性。</p>
<p>2， 空间查询的执行效率。一个带有空间和属性的混合查询，是先进行空间查询，再进行属性查询，还是反过来，先进行属性查询，再进行空间查询，还是多个步骤交错进行，这是一个值得思考的问题，怎样作查询效率才更高？</p>
<p>3，
空间数据的物理存储。物理存储，关系到空间数据添加删除修改的性能，而目前，空间数据是以二进制对象或字符等形式，交给关系型数据库来管理的，屏蔽了物理
层的存储细节，粒度较大；同时，空间聚簇与数据更新存在矛盾，如果这些问题交给关系型数据库来处理，还很难得到较好的解决，需要单独针对空间数据实现物理
存储的管理。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上三点表明，不是空间数据存储在数据库里，实现数据的共享，就是所谓的&#8220;空间数据库&#8221;，总体上来说，&#8220;空间数据库&#8221;还不成熟，这一领域还有许多值得探讨的地方。</p>
<p><strong>二、&nbsp; 时态GIS</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
现在的GIS，属于&#8220;静态GIS&#8221;，只描述了地理空间在某一时间片上的状态，而地理空间状态是随着时间在不断改变的，为了描述这种动态变化的过程，&#8220;时态
GIS&#8221;应运而生，就是加入&#8220;时间维&#8221;来刻画这种动态性，地理空间状态State是时间Time的函数State=F(Time)，输入时间点
Time1，经过F函数的映射得到空间状态State1。有了这样一种本质的抽象，下面我们来探讨一下&#8220;时空模型&#8221;的建立。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
既然地理空间状态State是时间Time的函数State＝F(Time)，假设输入不同的时间点Time1、Time2，我们得到的状态
State1、State2，假设State1&#8800;State2，表明空间状态发生了改变，那么相对应的&#8220;空间索引&#8221;也发生了改变，即State1状态下的
空间索引SpatialIndex1&#8800;State2状态下的空间索引SpatailIndex2。由此，我们将问题转化为
&#8220;空间索引SpatialIndex是时间Time的函数SpatialIndex=G(Time)&#8221;,所以，对事件发生的时间片建立一维索引，并在每个
时间片上存储不同的空间索引，也就是所谓的&#8220;时空索引&#8221;，如果事件发生的时间间隔比较短，每个时间片上都建立完整的空间索引，会造成时间片之间的空间索引
的冗余，为此，可以设定一个的时间片跨度，在跨度之内的时间片上的空间索引采用增量方式，在跨度之上的时间片上，保存一次完整的空间索引。这样，两个时间
片跨度之间，空间索引的合并，工作量并不是很大，可以很好地控制空间索引的冗余。&#8220;时态GIS&#8221;是要保存所有时间片上状态的空间数据，采用以上模型，可以
很好地控制空间数据在不同时间片上存储相同空间数据所带来的冗余。下一步考虑空间数据的存储，存储策略决定着空间数据的存取性能，再下一步，就是&#8220;时空分
析&#8221;，有了时间维，就可以看出地理空间状态演化的过程，为探索空间演化的机理、预测未来发展的趋势打下了基础，时空序列分析，极大地丰富了空间数据挖掘的
内涵。 <br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&#8220;时态GIS&#8221;，比现在&#8220;静态GIS&#8221;前进了一大步，更符合现实世界，实用价值更大，但真正实现还有很多的困难，以上只是作者关于&#8220;时空模型和时空索引&#8221;
的一种观点，还有很多需要细化的地方，对于&#8220;时态GIS数据存储&#8221;、&#8220;时空分析&#8221;、&#8220;时间序列挖掘&#8221;还有很多方向有待进一步探讨。总之，&#8220;时态GIS&#8221;是
未来GIS发展重要的研究领域之一。</p>
<p><strong>三、空间数据挖掘</strong></p>
<p>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;空间数据挖掘，就是从空间数据集中抽取出隐含的、有价值的信息的过程，它源于空间统计、空间分析、机器学习和数据库技术。空间数据不同于其他数
据，比如空间自相关性，即性质相似的对象在地理空间分布上聚集，找出这种某种性质与空间分布的关系，便于找出某种现象背后的本质规律。目前常用的空间数据
挖掘方法有空间聚类、空间分类、关联规则、奇异点挖掘等，实现也有很的理论和技术手段。空间数据挖掘是目前GIS领域最时髦的词，是从时空数据中获得信息
的更高级的手段，开辟了GIS更高的研究领域。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此外，&#8220;自动制图综合&#8221;是地图学家梦寐以求的目标，目前在这一领域，已经实现了半自动化的程度，离全自动还有很长的路要走，随着人工智能等技术的不断进步，&#8220;自动制图综合&#8221;也会得到更进一步的发展，将带动整个GIS研究上一个更高的水平。</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/299075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-20 17:25 <a href="http://www.blogjava.net/Juizes361/articles/299075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>坐标系统概念(转)</title><link>http://www.blogjava.net/Juizes361/articles/299074.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Tue, 20 Oct 2009 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/299074.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/299074.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/299074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/299074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/299074.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p><strong>一：需要用到的几个基本概念-------- 球面坐标系</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;&nbsp;几个常涉及到的名词的中英文对照：地形面（Topography）；大地水准面（Geoid）；参考椭球面（Reference Ellipsoid）；基准（Datum）；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.&nbsp; 基准：就是一组用于描述其他量的量，比如，描述空间位置的基准为位置基准；描述时间的基准为时间基准。具体的例子如：位置基准-----椭球有原点、尺度、定向；时间基准-----起点、尺度等。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.&nbsp;
坐标系转换：首先坐标参照系是由基准和坐标系两部分构成的，坐标系转换实质上是在基准相同的情况下，坐标系之间的相互转换。比如：在同一基准下（即地球椭
球的参数、定位、定向等不变），同一个点既可以用空间直角坐标表示，也可以用大地坐标表示；或者在站心坐标系中，同一个点级可以用站心地平坐标表示，也可
以用站心极坐标法表示。（从这我们也就很容易地明白了：基准转换实质上是基准发生了变化即椭球及其定位定向发生了改变）（无论基准和坐标系哪一个发生了变
化就会导致坐标参照系的改变）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.&nbsp;
基准转换：实质上是将同一点从某一个基准或坐标参照系下的坐标转换到另一种坐标基准或者坐标参照系下去，即两种基准（椭球参数、定位、定向）之间的转换。
比如：旧BJ54坐标系下的坐标和CGCS2000大地坐标系之间的转换（因为前者是参心坐标系，后者是地心坐标系）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.&nbsp; 大地基准：是指用于定义地球参考椭球的一系列参数，主要包括：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 椭球的大小和形状-----只要有长半轴a(Semo--major Axis)和扁率 f (Flattening)即可（注意扁率和偏心率不是一个概念），其他参数均可由他们两个推导得出；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 椭球短半轴(Semi--minor Axis)指向（Orientation）：通常与地球的自转轴平行；（另外它还和极移和章动有联系）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 椭球中心的位置：根据需要确定，若为地心则称为地心椭球，否则称为参心椭球；（注意参考和参心的不同含义）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本初子午线（Prime Meridian）：通过固定平极和经度原点的天文子午线，通常称为格林尼治子午线。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.&nbsp;
大地坐标系：以大地基准为基础建立的坐标系称为大地坐标系，也称为椭球坐标系，用（B,L,H）来表示空间任一点的位置。其中，H是该点沿该点处法线至参
考椭球面的距离即是我们通常所说的大地高。一般在工程测量当中我们很少使用大地高，而是使用正高或者正常高：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正高：是空间任一点沿该点处垂线至大地水准面的距离（与大地高的基准面不一样）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正常高：由于高程方向上的重力值很难精确表达出来，所以引入距离方向上的重力平均值来进行确定高程值，相应的基准面就是似大地水准面，因为它与大地水准面十分接近。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大地水准面差距（N）：指的就是空间任一点大地高与正高的差值-------H（大地高）=H（正高）+N；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 高程异常（sita）：&nbsp;&nbsp;&nbsp;&nbsp;指的就是空间任一点大地高与正常高的差值-------H（大地高）=H（正常高）+sita</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
问题：工程测量当中，平面位置与高程位置的控制分开的主要原因是-------我们虽然可以通过GPS精密单点定位或者差分方法得到精度相当高的
（X,Y,Z）或者（B,L,H），但是他们都是以椭球参考面为基准的，然而我们却无法精确确定大地水准面差距或者高程异常，因而高程方向的精度一般通过
GPS等方法获得的比较低，从而导致我们工程测量当中常常还是采用精密水准测量的方法进行高程控制。 <br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7.&nbsp;
空间直角坐标系/笛卡尔坐标系：实质上点的空间直角坐标就是该点到坐标系原点形成的向径在三个坐标轴上的投影；一般坐标系原点选在参考椭球的中心（参考椭
球分为地心椭球和参心椭球），X轴指向本初子午线与赤道的交点，Z轴与地球自转轴平行并指向参考椭球的北极，最终与Y轴形成右手直角坐标系。一般用
（X,Y,Z）来表示任一点的空间位置。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.&nbsp; 站心坐标系：分为站心地平坐标系（又称直角坐标系并且是左手系）和站心极坐标系：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 站心地平坐标系：它是以测站标石中心为坐标系原点；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以该点出椭球法方向为U轴（uppering）；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;以与U轴垂直并且指向Z轴的方向为N轴（northing）；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 以东方向为E轴（easting）；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从而形成左手系。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 站心地平极坐标系：以测站标石中心为原点；NU轴所在平面为起始平面；顺时针为正方向，空间任一点到原点为向径；从而形成的的坐标系。</p>
<p><strong>二：需要用到的几个基本概念-------- 平面坐标系/格网坐标</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
前言：虽然空间任一点我们都可以在球面坐标系下描述其具体位置，但是在实际应用当中，我们还是习惯于在一个平面二维坐标系中来确定一个点的位置。由球面坐
标系转换到平面二维坐标系是通过所谓的&#8220;投影（Projection）&#8221;方法实现的，其投影函数的数学表达方式为：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=f1(B,L)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y=f2(B,L)</p>
<p>其中x，y为平面系下的坐标；B, L为任一点的大地坐标系的经纬度；f1，f2为单值、连续、有界的投影函数。在一些文献和软件中也称平面坐标为格网坐标。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.&nbsp;
横轴墨卡托投影：也称为高斯正形投影、高斯--克吕格投影或者高斯投影，我国统一采用高斯投影，一般在工程测量当中采用3度带或6度带投影法，为尽可能减
少由球面坐标系转换到平面坐标系时带来的变形影响，在精密程度要求较高的工程项目当中一般采用3度带法。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6度带中央子午线经度L=6n-3；其中n是带数标号，起始编号为1，即第一带的中央子午线的经度为3度。我国的经度为69度至135度共跨12带。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3度带的中央子午线一般与6度带的重合，一般和6度带的边沿重合，其中央子午线经度的计算公式为：L=3n；</p>
<p>其中n=1，2，3，。。。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按照目前我的测绘法规规定：在国内进行测量工作时，在需要进行球面坐标系到平面坐标系的转换时，统一采用高斯投影法。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.&nbsp; 通用横轴墨卡托投影（UTM）：有些西方国家为了控制投影带边沿的变形，采用之。它的显著特点是：投影后中央子午线的长度发生变化，与原来的比值为0.9996.它与高斯投影坐标之间的关系用公式表示如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x(U)=0.9996 x(G)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y(U)=0.9996 y(G)</p>
<p><strong>三：常用的地球参照系和参考框架</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.&nbsp; 地球参照系：是一种地固系，一种固定在地球上随地球一同旋转的坐标系。同样根据地球参照系原点选取的不同分为地心系和参心系。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.&nbsp; 协议地球参照系（CTRS）：是一种相对地球固定的地心系</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目的：主要是为了解决全球坐标参照系不统一带来的各种问题和不便。&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;协议地球参照系：Conventional Terrestrial Reference System（英文名称）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原点：地球质心</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Z轴：指向协议地极CTP（Conventional Terrestrial Pole）,即是1900----1905年间地极的平均位置</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X轴：指向协议赤道与格林威治子午圈的交点，最终与Y轴一起形成右手坐标系</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.&nbsp;
协议地球框架(CTRF)：是一组-------具有指定协议的地球参照系下的-------具有精确坐标的点。这些点即协议地球框架是刚述及的协议地球
参考系的实现。CTRF（Conventional Terrestrial Reference ）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.&nbsp; GPS测量定位中的地球参照系和参考框架</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在卫星导航定位系统中，轨道数据通常是地心地固系（ECEF----Earth-Centered Earth-Fixed）下的数据,只有这样才能保证最终的定位结果和轨道数据同属于相同的坐标参照系，以方便进行相关计算。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目前，较为常用的GPS卫星轨道数据主要有两种：基于WGS-84的广播星历和基于国际地球参考框架（ITRF）的IGS精密星历。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WGS-84地球参照系：若测量定位时采用的是广播星历，则结果属于WGS-84系。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WGS-84地球参照系是一个协议地球参照系，是一个地心地固右手正交坐标系。其定义的准则如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.&nbsp; 为地心系，原点位于包括海洋和大气在内的整个地球的质心</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 尺度在局部地球框架下，遵守相对论原理</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 初始定向由国际时间局（BIH）1984.0的定向给定</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.&nbsp; 定向中的时变不会使地壳产生残余的全球性旋转</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据上述准则，WGS-84协议地球参照系的定义如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.&nbsp; 原点位于地球质心（Earth's Center of Mass）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.&nbsp; Z轴与IERS(国际地球自转及参照系服务-----International Earth
Rotation and&nbsp;Reference System Service)参考极（IRP---IERS Reference
Pole）指向相同，该指向与1984.0历元的BIH协议地极（CTP-----Conventional Terrestrial Pole）一致</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.&nbsp; X轴指向IERS参考子午线（IRM）与过原点且垂直于Z轴平面的交点</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.&nbsp; Y轴最终完成右手地心地固正交系</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 国际地球参照系（ITRS-----International Terrestrial Reference System）是由IERS所定义的一个协议地球参照系，其定义满足如下条件：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.&nbsp; 原点位于地球质心，地球质心为包括海洋和大气在内的整个地球的质心</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 长度尺度为国际单位制米</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 初始定向为国际时间局（BIH）所给出的1984.0定向</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.&nbsp; 定向的时变通过一个关于全球水平运动构造运动的非净旋转条件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 国际地球参考框架：是ITRS的实现，是由一组具有ITRS下坐标和速度估值的IERS观测站组成，并由IERS中心局的地球参考框架部负责建立和维护。下面仅以ITRF2000的基准定义为例说明：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.&nbsp; 尺度：通过将ITRF2000与VLBI 和所有可靠SLR解的加权平均值之间的尺度和尺度扁率设为0来实现</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 原点：（略）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 定向：（略）</p>
<p>&nbsp;&nbsp;&nbsp; 5.&nbsp; 我国常用坐标参照系</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.&nbsp; 旧1954北京坐标系（参心坐标系）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1954北京坐标系是我国目前广泛采用的大地测量坐标系。该坐标系源自于前苏联1942年普尔科夫坐标系。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;椭球：克拉索夫斯基椭球</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;长半轴a：6378245m</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 扁率f：1/298.3</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 高程：以1956年青岛验潮站的黄海平均海水面为基准</p>
<p><br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺点：（包括3个方面，后续）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.&nbsp; 1980西安大地坐标系（参心坐标系）</p>
<p>&nbsp;原因：a.&nbsp; 1954坐标系椭球参数长半轴有108m的差距与现在的精确值</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.&nbsp; 参考椭球面与我国大地水准面之间存在自西向东的系统性倾斜，东部差距达68m</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 几何大地测量和物理大地测量应用的参考面不统一。重力数据处理时采用的是赫尔默特正常重力公式，与其相应的椭球为赫尔默特椭球，这与克拉索夫斯基椭球不一致。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.&nbsp; 定向不明确：克拉索夫斯基椭球短半轴既不指向CIO也不指向我国地极原点JYD1968.0；同时其起始子午面也不是国际时间局所定义的格林尼治平均天文台子午面。这给坐标换算带来了很多麻烦。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.&nbsp; 1954坐标系还是按局部平差逐步提供大地点成果的，因此不可避免地会出现一些矛盾和不够合理的地方。</p>
<p>原则：a.&nbsp; 全国天文大地网整体平差要在新的坐标系的参考椭球面上进行。为此首先需要建立一个新的大地坐标系，并名之为1980国家大地坐标系；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 1980国家大地坐标系的大地原点定在我国中部。具体选在陕西泾阳县永乐镇</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp;
采用国际大地测量和地球物理联合会1975年推荐的四个地球椭球参数（a,J2,GM,omega），并根据这四个参数求解椭球扁率和其它参
数。（a=6378140m；GM=3.986005*pow（10，14）；J2=1.08263*pow（10，-8）；omega=7.292115*pow（10，-5））</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.&nbsp; 1980年国家大地坐标系的椭圆短半轴平行于地球质心指向我国地极原点JYD1968.0方向；大地起始子午面平行于格林尼治天文台的平均子午面</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.&nbsp; 高程方向的约束条件：椭球定位参数以我国范围内----高程异常值平方和------最小。</p>
<p>优点：a.&nbsp; 参心坐标系是在1954北京坐标系的基础上建立起来的（参见《大地测量学》162页（20-8）式）&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 椭球面同似大地水准面在我国境内最为密合，并且是多点定位</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 定向明确</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.&nbsp; 大地原点位置居中，比较适当</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.&nbsp; 大地高程基准采用1956黄海高程系&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>C.&nbsp;&nbsp;新1954北京坐标系</p>
<p>原因：由于1954旧坐标系存在时间较长，而它又与GDZ80两者之间的差距较大，所以给成果的使用带来了很大的不便。促使人们建立一个介于两者之间的新1954坐标系。</p>
<p>特点：a.&nbsp; 新BJ54是-------在GDZ80的基础上，改变GDZ80的IUGG1975椭球几何参数为克拉索夫斯基椭球参数；并将GDZ80坐标原点进行平移-------从而建立起来的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 综合GDZ80和旧BJ54建立起来的</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 采用多点定位，但椭球面与大地水准面在我国境内不是最佳拟合</p>
<p><br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.&nbsp; 定向明确。与GDZ80平行</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.&nbsp; 大地原点与GDZ80相同，但是大地起算数据不同（注意区分参考椭球中心或者坐标系原点与大地原点的区别）&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.&nbsp; 与旧BJ54相比，所采用的椭球参数相同，定位相近，但是定向不同。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.&nbsp; 旧BJ54是局部平差，新BJ54是GDZ80整体平差结果的转换值，因此，新旧BJ54之间并无全国范围内统一的转换参数，只能进行局部转换。</p>
<p>D.&nbsp; 2000国家大地坐标系</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原因：a.&nbsp;&nbsp;目前，我国实际使用的1954BJ坐标系和GDZ80坐标系，实质上都只是&#8220;参心&#8221;坐标系。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 随着科学技术的进步，越来越多的实际应用要求建立和采用&#8220;地心&#8221;坐标系</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.&nbsp; 空间定位技术的发展，使得建立高精度的&#8220;地心&#8221;坐标系称为可能</p>
<p>顺应时代的潮流和要求，我国提出并建立了2000国家大地坐标系CGCS2000（China Geodetic Coordinate System 2000）。</p>
<p>地心系CGCS2000的定义如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.&nbsp; 原点：包括海洋和大气在内的整个地球的质心</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.&nbsp; 长度单位：国际单位制m，与局部地心框架下的地心坐标时一致，通过适当的相对论模型获得</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 定向：初始定向由1984.0时的BIH 定向给出</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.&nbsp; 定向的时变：定向的时变不产生相对于地壳的残余全球旋转</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.&nbsp;
CGCS2000大地坐标系是右手地固直角坐标系（直角坐标系包括笛卡尔空间直角坐标系（X、Y、Z）和空间大地直角坐标系（B、L、H））。原点位于地
球质心；Z轴与IERS参考极（IRP）方向一致，X轴为IERS参考子午面（IRM）与垂直于Z轴的赤道面的交线，Y轴与Z轴、X轴垂直并最终形成右手
正交系。</p>
<p>参考椭球采用2000参考椭球，其相应参数为：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a=6378137m</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GM=3.986004418*pow（10，14）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J2=0.001082629832258</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; omega=7.292115*pow（10，-5）</p>
<p><strong>四、.坐标转换</strong></p>
<p>易混淆的两点：&#8220;坐标参照系和基准&#8221;、&#8220;坐标参照系和坐标系&#8221;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.&nbsp; &nbsp;首先，前面已经述及：坐标参照系包括基准和坐标系两部分。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 任一特定的基准和任一特定的坐标系的组合都形成特定地一个坐标参照系。</p>
<p><span style="font-size: 15px; color: #333333; line-height: 150%;">
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 坐标系包括空间直角(X,Y,Z)、大地坐标系(B,L,H)、站心直角(N,E,U)和站心极坐标系（R,A,EL）等,但是我们这里说的坐标系没有指定其原点位置和坐标轴指向即它只是&#8220;无根的浮萍&#8221;。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.&nbsp; 基准的作用就是给特定的坐标系进行特定的定位和定向。因此，一个坐标参照系必须同时包括基准和坐标系两个部分才完整。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原因：主要是由于不同坐标系、不同基准和不同坐标系的存在，导致常常需要在他们之间进行相互转换。转换分为两个基本类型：1.&nbsp; 坐标系转换&nbsp;&nbsp; 2.&nbsp; 基准转换</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一：坐标系转换</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
定义：指的是同一点的坐标------在相同基准--------由一种坐标系下的坐标转换为另一种坐标系下的坐标。比如，同一坐标参照系下空间直角坐标
与大地坐标之间的转换；站心地平到站心极坐标之间的转换-----共同的特点是：1.&nbsp;
坐标系转换不涉及基准转换（即不涉及椭球参数及其定位和定向的转换，也即它们不变）&nbsp; 2.&nbsp;
坐标系转换中的两种坐标实际上是同一点不同坐标表达方式间的变换，具有一一对应的关系。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二、基准转换</p>
<p>定义：就是两种坐标系由于采用的椭球参数、定位、定向或者由于尺度设置不同等原因导致两种基准之间的变换。基准变换和坐标系变换是本质上的区别。基准变换常见的是地心系与参心系之间的变换。</p>
<p>基准变换常见的使用方法有：布尔沙-沃尔夫模型和莫洛金斯基模型</p>
<p>1.&nbsp; 布尔沙-沃尔夫模型</p>
<p>在我国常被简称为布尔沙模型或者七参数模型或者七参数赫尔默特变换------三个平移参数Tx,Ty,Tz,------3个旋转参数OMEGAx,OMEGAy,OMEGAz（也称3个欧拉角）--------1个尺度参数m</p>
<p><br />
</p>
<p><br />
</p>
</span></p>
<p><br />
</p>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/299074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-20 17:18 <a href="http://www.blogjava.net/Juizes361/articles/299074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GIS：在正确的时间出现的正确技术</title><link>http://www.blogjava.net/Juizes361/articles/299069.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Tue, 20 Oct 2009 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/299069.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/299069.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/299069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/299069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/299069.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 罗杰&#8226;汤姆林森博士，《探索GIS：用地理信息系统进行规划》（《Thinking About GIS: Geographic
Information System Planning for
Managers》）一书的作者。他于1963年创建了一个由地理专业学者组成的咨询公司——汤姆林森联合有限公司。他向包括世界银行、美国和加拿大的森
林服务部门在内的诸多客户提供咨询建议。他获得了两个学士学位；从加拿大蒙特利尔的麦基尔大学获得了硕士学位；从英国伦敦大学学院获得了博士学位。他还在
世界各地成功举办了各种GIS规划方面的研讨会。
<p align="center"><img alt="" src="http://www.blogjava.net/images/blogjava_net/juizes361/RogerTomlinson.jpg" height="261" width="198" /><br />
</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作为最早提出&#8220;地理信息系统&#8221;这个名词的人，汤姆林森最近向ESRI的吉姆&#8226;波曼讲述了他在GIS领域的开创性工作，以及他对GIS未来的看法。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 波曼：您通常被称作是&#8220;GIS之父&#8221;。您能谈谈GIS发展的历史进程吗？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
汤姆林森：作为一种标准的地理分析技术，地图叠加的概念已经存在很长时间了。比如，在第二次世界大战后不久，英国的皇家规划研究所提供了一本关于地图叠加
技术的手册。其中一项技术叫做筛选叠图（sieve
mapping），在战后常被土地利用规划师用来评价一个地区是否适宜建造某项工程或者进行某项活动。这种评价首先从研究区的基础地图开始，将透明的印有
格网的薄片叠放到地图上。每一个透明的薄片代表了特定的准则。如果某块区域不适合某项活动，格网上代表该区域的方格子会被涂黑。就这样，不同的准则用不同
的透明薄片来代表，并依据相同的方法涂黑。当所有薄片一层层叠加到基础地图上后，最终可见的区域就是最适合某项工程的区域了。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 波曼：什么原因促使你对地图叠加的概念进行了改进？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
汤姆林森：1959年我到斯巴达航空服务公司工作，这是一家加拿大航空测量公司，我在那里做影像解译。这个总部设在渥太华的公司派我参与肯尼亚的一个项
目。作为国际援助项目的一部分，加拿大政府准备为肯尼亚建造一个造纸厂。我所在公司的任务是对肯尼亚进行航空摄影和森林普查，选择最适合建造纸厂的地点。
当地的树木不适合造纸浆，所以我们开始收集信息以决定哪个地方最适合种植用于纸浆生产的树木。我们用土壤图来确定用于纸浆生产的树木在哪里生长的会最好。
我们生成了坡度图来辅助分析，因为在非常陡的坡上伐树是不现实的。我们需要知道土著部落住在哪里，一些部落比其它部落更喜欢迁移，定居的部落则可以提供更
稳定的劳动力。我们还记录了大象的迁移路径，因为大象会毁坏新的林场。我们还记录猴子的栖息地，因为猴子会以幼树为食物。另外，收集不同地区的降雨量也是
非常必要的。降雨量少就会导致干旱，而太多的降雨又会导致昆虫数目增多，寄生植物增多，这对林场是致命的。标绘有道路、河流、桥梁的地图也很重要。肯尼亚
曾是英国殖民地，英国的科学家制作了非常棒的肯尼亚地图。所以，我们需要的一些数据已经有了。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
我到办公室开始分析我们收集的所有地图，方法就是前面已经描述过的将不同的地图图层进行叠加来评价不同的地块。这种依靠手动、目视的分析是非常费时费力
的。事实证明，分析的花费远比最初对整个国家进行航拍和收集数据的花费要多。我的预算是有限制的，我的老板要我找到减少支出的方法。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 波曼：你怎样用计算机来实现地图叠加的概念？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
汤姆林森：我所在的公司有小型IBM计算机和地图绘图板。因为可以接触到当时最先进的技术，我就开始思考如何对不同的地图图层赋值，然后输入到计算机中，
让计算机去做比较并绘制出结果。我们将包含一系列图层数据的地图在绘图板上进行了定向和数字化。这一工作大概用了我们一星期晚上的时间。最后，我们得到了
一张数字化地图。我认为这是加拿大的第一张由硬拷贝地图数字化得到的地图。我非常激动，这使得我开始有了这样一个想法：公司可以和其所在地的一些电脑公司
合作，发展这套方法来进行自动制图。不幸的是，从这些公司得到的回复几乎都是相同的：谢谢你，但是我们不认为这种产品有市场。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是相当令人失望的，
但是1962年一个很偶然的机会，我在飞机上正好坐在李&#8226;普拉特旁边。他刚刚被联邦政府任命为加拿大土地调查局的负责人。加拿大农民当时都比较贫穷，全国
有六十万农民，他们需要帮助。加拿大可耕种、可用于生产的土地大约有一百万平方英里。所以第一问题是，我们对这些土地了解多少？我们还需要知道，这些土地
可以被用于其它用途吗，比如娱乐或植树？人口统计调查得到的这些农民的收入是多少？他们的教育程度如何？我们能否通过教育解决农民存在的问题？我们在哪建
立学校？这对于政府来说是很重要的一个步骤，因为政府从没有做过这么深入的土地规划。李说他准备把这些信息在透明的薄片上表示，并叠加进行分析。我告诉
他，我可以用电脑来完成这项工作。我们做了一些估算，如果用手工方法要有563个地图制图专业人员花费三年的时间来完成这项工作，花费大约八百万加元。除
了花费，一个很大的问题是政府只有50到60个合格的地图制图专业人员。我分析了所有技术和经济的可行性报告，得出的结论是我们可以开发一个系统来完成这
项工作。这样不需要几年，而只需要几周时间就能完成该项工作，同时花费少于二百万加元。 我们开发了加拿大地理信息系统（Canada
Geographic Information
System），这是世界上第一个使用计算机的GIS。&#8220;地理信息系统&#8221;这一我在项目中所提出的名词，一直沿用下来了。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 波曼：在过去的10年间哪些方面的进步对当前的GIS产生了重要影响？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
汤姆林森：一个显著的进步是计算的代价降低了。在我最近的书中（《探索GIS：用地理信息系统进行规划（第三版）》）,我对充满神话色彩的罗马城进行了建
模。罗马已经建立了GIS，我们的一个练习是计算GIS投入。计算投入是基于当前的人员和硬件的价格。我们最初都是用相同的硬件配置，这样就能比较在每个
连续三年的工程周期里投入的不同。我们发现现在的硬件价格是五年前的十分之一。可见，一个对GIS非常重要的影响是硬件、软件的实际价格（产品在扣除货币
贬值影响后的价格）在持续下降。另外，软硬件功能也比原来强大多了。一般的内核或CPU性能比去年同等的电脑有40%的提升。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另一个明显的进步是数字形式的数据更容易得到了，获取的速度也更快。比如，四年前印度尼西亚发生地震和并发海啸，受灾地区的Landsat数据在灾后几天就获得了。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此外，政府的高级官员对GIS和它的能力有了更清楚地认识。在过去的10年中，高层的决策者们越来越认识到GIS是一个提高政府和经贸活动效率和效益的工具。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 波曼：你对未来10年GIS的发展有什么预期？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
汤姆林森：许多现在的趋势还会继续下去。硬件会更加便宜，功能更加强大。软件会变得更容易使用，鲁棒性更好。我希望大学继续扩展他们的GIS相关课程，满
足社会对GIS专业人才不断增长的需求。高级管理人员能够更强烈地意识到在他们的组织中利用GIS的益处。我们将会看到更多的国家通过国家政策时，GIS
将成为内阁讨论的一个重要部分。我希望经过训练的地理专业学者能够参与国家决策制定。另外，我认为高级军事人才也应当对GIS的能力和潜力有较好的了解。</p>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
我对GIS的未来是充满信心的。它是一项在正确的时间出现的正确的技术。当前我们的世界面临的一些主要问题包括：人口过多、食物短缺、农产品产量下降、不
利的气候变化、贫困，
这些都是典型的地理问题。这些问题都涉及人地关系，是GIS可以做出最大贡献的领域。GIS作为当今时代的技术，特别适合帮助我们解决当前面临的问题。<br />
<br />
<br />
<br />
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/299069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-20 16:59 <a href="http://www.blogjava.net/Juizes361/articles/299069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GeoTools, JTS , GeoAPI关系</title><link>http://www.blogjava.net/Juizes361/articles/298808.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Mon, 19 Oct 2009 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/298808.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/298808.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/298808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/298808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/298808.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;"><br />
<strong>JTS</strong><br />
<br />
&nbsp;JTS是加拿大的 Vivid Solutions 做的一套开放源码的 Java API。它提供了一套空间数据操作的核心算法,为在兼容OGC标准的空间对象模型中进行基础的几何操作提供2D空间谓词API。<br />
<br />
<strong>GeoAPI</strong><br />
<br />
GeoAPI为OpenGIS规范提供一组Java接口.<br />
<br />
<strong>Geotools</strong><br />
<br />
Geotools是一个开源的Java GIS工具包,可利用它来开发符合标准的地理信息系统。Geotools提供了OGC(Open Geospatial Consortium)规范的一个实现来作为他们的开发。<br />
<br />
<br />
<strong>它们的关系简单而言:</strong><br />
<br />
GeoTools的目标是致力于开发一个符合规范的GIS工具包，既然是工具包，那么就要有很多工具用来对付构建一个完整的地理信息系统时会碰到的问题，常见的问题比如:投影的转换，基准面的设定，空间数据对象的渲染和样式，各种数据源的支持，各种GIS文件格式支持，空间数据过滤与搜索 ... 等等的问题。<br />
<br />
在开发这些工具的时候，恰好在处理空间数据图形关系的时候，有一个非常好的解决方案，那就是JTS,JTS解决了对象与对象之间拓扑关系的判定和计算，并提供很多有用的算法来解决对象的面积，长 ... 等等的问题。这样而言，JTS就相当于GeoTools中的一个子模块。但因为这个模块本身不是GeoTools工程的，所以在javadoc中找不到JTS的API,需要到JTS官网上面另外下载。<br />
<br />
至于GeoAPI则是GeoTools符合标准的模板。它制定了地理信息系统中所有的数据类型应该是什么，投影转换的方式有哪几种诸如此类的规范。这样兼容GeoAPI接口的GeoTools才是一个符合规范的地理信息系统工具包。<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><br />
</p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="color: red; font-family: 宋体;"><br />
</span></span></p>
</span></span>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/298808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-19 10:02 <a href="http://www.blogjava.net/Juizes361/articles/298808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java new I/O 的使用</title><link>http://www.blogjava.net/Juizes361/articles/298794.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Mon, 19 Oct 2009 00:33:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/298794.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/298794.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/298794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/298794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/298794.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;"><span id="ArticleContent1_ArticleContent1_lblContent">
<p>NIO的使用</p>
<p>导读<br />
&nbsp;J2SE1.4以上版本中发布了全新的I/O类库。本文将通过一些实例来简单介绍NIO库提供的一些新特性：非阻塞I/O，字符转换，缓冲以及通道。</p>
<p>一.&nbsp;介绍NIO<br />
NIO包（java.nio.*）引入了四个关键的抽象数据类型，它们共同解决传统的I/O类中的一些问题。<br />
1．&nbsp;Buffer：它是包含数据且用于读写的线形表结构。其中还提供了一个特殊类用于内存映射文件的I/O操作。<br />
2．&nbsp;Charset：它提供Unicode字符串影射到字节序列以及逆影射的操作。<br />
3．&nbsp;Channels：包含socket，file和pipe三种管道，它实际上是双向交流的通道。<br />
4．&nbsp;Selector：它将多元异步I/O操作集中到一个或多个线程中（它可以被看成是Unix中select（）函数或Win32中WaitForSingleEvent（）函数的面向对象版本）。<br />
二.&nbsp;回顾传统<br />
在介绍NIO之前，有必要了解传统的I/O操作的方式。以网络应用为例，传统方式需要监听一个ServerSocket，接受请求的连接为其提供服务（服务通常包括了处理请求并发送响应）图一是服务器的生命周期图，其中标有粗黑线条的部分表明会发生I/O阻塞。<br />
&nbsp;<img alt="" src="http://dev.csdn.net/Develop/ArticleImages/22/22063/CSDN_Dev_Image_2003-11-102336310.gif" align="baseline" border="0" hspace="0" /><br />
&nbsp;&nbsp; 图一<br />
可以分析创建服务器的每个具体步骤。首先创建ServerSocket<br />
&nbsp;ServerSocket server=new ServerSocket（10000）；<br />
然后接受新的连接请求 <br />
&nbsp;Socket newConnection=server.accept（）；<br />
对于accept方法的调用将造成阻塞，直到ServerSocket接受到一个连接请求为止。一旦连接请求被接受，服务器可以读客户socket中的请求。<br />
InputStream in = newConnection.getInputStream();<br />
InputStreamReader reader = new InputStreamReader(in);<br />
BufferedReader buffer = new BufferedReader(reader);<br />
Request request = new Request();<br />
while(!request.isComplete()) {<br />
&nbsp; String line = buffer.readLine();<br />
&nbsp; request.addLine(line);<br />
}<br />
这
样的操作有两个问题，首先BufferedReader类的readLine（）方法在其缓冲区未满时会造成线程阻塞，只有一定数据填满了缓冲区或者客户
关闭了套接字，方法才会返回。其次，它回产生大量的垃圾，BufferedReader创建了缓冲区来从客户套接字读入数据，但是同样创建了一些字符串存
储这些数据。虽然BufferedReader内部提供了StringBuffer处理这一问题，但是所有的String很快变成了垃圾需要回收。<br />
同样的问题在发送响应代码中也存在<br />
Response response = request.generateResponse();<br />
OutputStream out = newConnection.getOutputStream();<br />
InputStream in = response.getInputStream()；<br />
int ch；<br />
while(-1 != (ch = in.read())) {<br />
&nbsp; out.write(ch);<br />
}<br />
newConnection.close();<br />
类似的，读写操作被阻塞而且向流中一次写入一个字符会造成效率低下，所以应该使用缓冲区，但是一旦使用缓冲，流又会产生更多的垃圾。<br />
传统的解决方法<br />
&nbsp;通常在Java中处理阻塞I/O要用到线程（大量的线程）。一般是实现一个线程池用来处理请求，如图二<br />
&nbsp; <img alt="" src="http://dev.csdn.net/Develop/ArticleImages/22/22063/CSDN_Dev_Image_2003-11-102336312.gif" align="baseline" border="0" hspace="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图二<br />
线程使得服务器可以处理多个连接，但是它们也同样引发了许多问题。每个线程拥有自己的栈空间并且占用一些CPU时间，耗费很大，而且很多时间是浪费在阻塞的I/O操作上，没有有效的利用CPU。<br />
三.&nbsp;新I/O<br />
1．&nbsp;Buffer<br />
传统的I/O不断的浪费对象资源（通常是String）。新I/O通过使用Buffer读写数据避免了资源浪费。Buffer对象是线性的，有序的数据集合，它根据其类别只包含唯一的数据类型。<br />
java.nio.Buffer&nbsp;类描述&nbsp;<br />
java.nio.ByteBuffer&nbsp;包含字节类型。 可以从ReadableByteChannel中读在&nbsp;&nbsp;&nbsp; WritableByteChannel中写&nbsp;<br />
java.nio.MappedByteBuffer&nbsp;包含字节类型，直接在内存某一区域映射&nbsp;<br />
java.nio.CharBuffer&nbsp;包含字符类型，不能写入通道&nbsp;<br />
java.nio.DoubleBuffer&nbsp;包含double类型，不能写入通道&nbsp;<br />
java.nio.FloatBuffer&nbsp;包含float类型&nbsp;<br />
java.nio.IntBuffer&nbsp;包含int类型&nbsp;<br />
java.nio.LongBuffer&nbsp;包含long类型&nbsp;<br />
java.nio.ShortBuffer&nbsp;包含short类型&nbsp;<br />
可
以通过调用allocate(int capacity)方法或者allocateDirect(int
capacity)方法分配一个Buffer。特别的，你可以创建MappedBytesBuffer通过调用FileChannel.map(int
mode,long position,int
size)。直接（direct）buffer在内存中分配一段连续的块并使用本地访问方法读写数据。非直接(nondirect)buffer通过使用
Java中的数组访问代码读写数据。有时候必须使用非直接缓冲例如使用任何的wrap方法（如ByteBuffer.wrap(byte[])）在
Java数组基础上创建buffer。<br />
2．&nbsp;字符编码<br />
向ByteBuffer中存放数据涉及到两个问题：字节的顺序和字符转换。ByteBuffer内部通过ByteOrder类处理了字节顺序问题，但是并没有处理字符转换。事实上，ByteBuffer没有提供方法读写String。<br />
&nbsp;Java.nio.charset.Charset处理了字符转换问题。它通过构造CharsetEncoder和CharsetDecoder将字符序列转换成字节和逆转换。<br />
3．&nbsp;通道(Channel)<br />
你可能注意到现有的java.io类中没有一个能够读写Buffer类型，所以NIO中提供了Channel类来读写Buffer。通道可以认为是一种连接，可以是到特定设备，程序或者是网络的连接。通道的类等级结构图如下<br />
&nbsp;<img alt="" src="http://dev.csdn.net/Develop/ArticleImages/22/22063/CSDN_Dev_Image_2003-11-102336314.gif" align="baseline" border="0" hspace="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;图三<br />
&nbsp;图中ReadableByteChannel和WritableByteChannel分别用于读写。<br />
GatheringByteChannel可以从使用一次将多个Buffer中的数据写入通道，相反的，ScatteringByteChannel则可以一次将数据从通道读入多个Buffer中。你还可以设置通道使其为阻塞或非阻塞I/O操作服务。<br />
为了使通道能够同传统I/O类相容，Channel类提供了静态方法创建Stream或Reader<br />
4．&nbsp;Selector<br />
在
过去的阻塞I/O中，我们一般知道什么时候可以向stream中读或写，因为方法调用直到stream准备好时返回。但是使用非阻塞通道，我们需要一些方
法来知道什么时候通道准备好了。在NIO包中，设计Selector就是为了这个目的。SelectableChannel可以注册特定的事件，而不是在
事件发生时通知应用，通道跟踪事件。然后，当应用调用Selector上的任意一个selection方法时，它查看注册了的通道看是否有任何感兴趣的事
件发生。图四是selector和两个已注册的通道的例子<br />
&nbsp; <img alt="" src="http://dev.csdn.net/Develop/ArticleImages/22/22063/CSDN_Dev_Image_2003-11-102336316.gif" align="baseline" border="0" hspace="0" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图四<br />
并不是所有的通道都支持所有的操作。SelectionKey类定义了所有可能的操作位，将要用两次。首先，当应用调
用SelectableChannel.register(Selector sel,int
op)方法注册通道时，它将所需操作作为第二个参数传递到方法中。然后，一旦SelectionKey被选中了，SelectionKey的
readyOps()方法返回所有通道支持操作的数位的和。SelectableChannel的validOps方法返回每个通道允许的操作。注册通道
不支持的操作将引发IllegalArgumentException异常。下表列出了SelectableChannel子类所支持的操作。<br />
&nbsp;&nbsp;<br />
ServerSocketChannel&nbsp;OP_ACCEPT&nbsp;<br />
SocketChannel&nbsp;OP_CONNECT, OP_READ, OP_WRITE&nbsp;<br />
DatagramChannel&nbsp;OP_READ, OP_WRITE&nbsp;<br />
Pipe.SourceChannel&nbsp;OP_READ&nbsp;<br />
Pipe.SinkChannel&nbsp;OP_WRITE&nbsp;</p>
<p>四.&nbsp;举例说明<br />
1．&nbsp;简单网页内容下载<br />
这个例子非常简单，类SocketChannelReader使用SocketChannel来下载特定网页的HTML内容。<br />
package examples.nio;</p>
<p>import java.nio.ByteBuffer;<br />
import java.nio.channels.SocketChannel;<br />
import java.nio.charset.Charset;<br />
import java.net.InetSocketAddress;<br />
import java.io.IOException;</p>
<p>public class SocketChannelReader{<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private Charset charset=Charset.forName("UTF-8");//创建UTF-8字符集<br />
&nbsp;&nbsp;&nbsp; private SocketChannel channel;</p>
<p>&nbsp;&nbsp;&nbsp; public void getHTMLContent(){<br />
&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sendRequest();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readResponse();<br />
&nbsp;&nbsp;&nbsp; }catch(IOException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e.toString());<br />
&nbsp;&nbsp;&nbsp; }finally{<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(channel!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; channel.close();<br />
&nbsp;&nbsp;}catch(IOException e){}<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; private void connect()throws IOException{//连接到CSDN<br />
&nbsp;InetSocketAddress socketAddress=<br />
&nbsp;&nbsp;&nbsp;&nbsp; new InetSocketAddress("<a href="http://www.csdn.net%22,80/">www.csdn.net",80</a>);<br />
&nbsp;channel=SocketChannel.open(socketAddress);<br />
&nbsp;//使用工厂方法open创建一个channel并将它连接到指定地址上<br />
&nbsp;//相当与SocketChannel.open().connect(socketAddress);调用<br />
}</p>
<p>private void sendRequest()throws IOException{<br />
&nbsp;channel.write(charset.encode("GET "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +"/document"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +""r"n"r"n"));//发送GET请求到CSDN的文档中心<br />
&nbsp;//使用channel.write方法，它需要CharByte类型的参数，使用<br />
&nbsp;//Charset.encode(String)方法转换字符串。<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void readResponse()throws IOException{//读取应答<br />
&nbsp;ByteBuffer buffer=ByteBuffer.allocate(1024);//创建1024字节的缓冲<br />
&nbsp;while(channel.read(buffer)!=-1){<br />
&nbsp;&nbsp;&nbsp;&nbsp; buffer.flip();//flip方法在读缓冲区字节操作之前调用。<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(charset.decode(buffer));<br />
//使用Charset.decode方法将字节转换为字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; buffer.clear();//清空缓冲<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String [] args){<br />
&nbsp;new SocketChannelReader().getHTMLContent();<br />
&nbsp;&nbsp;&nbsp; }<br />
2．&nbsp;简单的加法服务器和客户机<br />
服务器代码<br />
package examples.nio;</p>
<p>import java.nio.ByteBuffer;<br />
import java.nio.IntBuffer;<br />
import java.nio.channels.ServerSocketChannel;<br />
import java.nio.channels.SocketChannel;<br />
import java.net.InetSocketAddress;<br />
import java.io.IOException;</p>
<p>/**<br />
&nbsp;* SumServer.java<br />
&nbsp;*<br />
&nbsp;*<br />
&nbsp;* Created: Thu Nov 06 11:41:52 2003<br />
&nbsp;*<br />
&nbsp;* @author starchu1981<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class SumServer {</p>
<p>&nbsp;&nbsp;&nbsp; private ByteBuffer _buffer=ByteBuffer.allocate(8);<br />
&nbsp;&nbsp;&nbsp; private IntBuffer _intBuffer=_buffer.asIntBuffer();<br />
&nbsp;&nbsp;&nbsp; private SocketChannel _clientChannel=null;<br />
&nbsp;&nbsp;&nbsp; private ServerSocketChannel _serverChannel=null;</p>
<p>&nbsp;&nbsp;&nbsp; public void start(){<br />
&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp; openChannel();<br />
&nbsp;&nbsp;&nbsp;&nbsp; waitForConnection();<br />
&nbsp;}catch(IOException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e.toString());<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void openChannel()throws IOException{<br />
&nbsp;_serverChannel=ServerSocketChannel.open();<br />
&nbsp;_serverChannel.socket().bind(new InetSocketAddress(10000));<br />
&nbsp;System.out.println("服务器通道已经打开");<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void waitForConnection()throws IOException{<br />
&nbsp;while(true){<br />
&nbsp;&nbsp;&nbsp;&nbsp; _clientChannel=_serverChannel.accept();<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(_clientChannel!=null){<br />
System.out.println("新的连接加入");<br />
processRequest();<br />
_clientChannel.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void processRequest()throws IOException{<br />
&nbsp;_buffer.clear();<br />
&nbsp;_clientChannel.read(_buffer);<br />
&nbsp;int result=_intBuffer.get(0)+_intBuffer.get(1);<br />
&nbsp;_buffer.flip();<br />
&nbsp;_buffer.clear();<br />
&nbsp;_intBuffer.put(0,result);<br />
&nbsp;_clientChannel.write(_buffer);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String [] args){<br />
&nbsp;new SumServer().start();<br />
&nbsp;&nbsp;&nbsp; }<br />
} // SumServer<br />
客户代码<br />
package examples.nio;</p>
<p>import java.nio.ByteBuffer;<br />
import java.nio.IntBuffer;<br />
import java.nio.channels.SocketChannel;<br />
import java.net.InetSocketAddress;<br />
import java.io.IOException;</p>
<p>/**<br />
&nbsp;* SumClient.java<br />
&nbsp;*<br />
&nbsp;*<br />
&nbsp;* Created: Thu Nov 06 11:26:06 2003<br />
&nbsp;*<br />
&nbsp;* @author starchu1981<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class SumClient {</p>
<p>&nbsp;&nbsp;&nbsp; private ByteBuffer _buffer=ByteBuffer.allocate(8);<br />
&nbsp;&nbsp;&nbsp; private IntBuffer _intBuffer;<br />
&nbsp;&nbsp;&nbsp; private SocketChannel _channel;</p>
<p>&nbsp;&nbsp;&nbsp; public SumClient() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _intBuffer=_buffer.asIntBuffer();<br />
&nbsp;&nbsp;&nbsp; } // SumClient constructor<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int getSum(int first,int second){<br />
&nbsp;int result=0;<br />
&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp; _channel=connect();<br />
&nbsp;&nbsp;&nbsp;&nbsp; sendSumRequest(first,second);<br />
&nbsp;&nbsp;&nbsp;&nbsp; result=receiveResponse();<br />
&nbsp;}catch(IOException e){System.err.println(e.toString());<br />
&nbsp;}finally{<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(_channel!=null){<br />
&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _channel.close();<br />
&nbsp;&nbsp;}catch(IOException e){}<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;}<br />
&nbsp;return result;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private SocketChannel connect()throws IOException{<br />
&nbsp;InetSocketAddress socketAddress=<br />
&nbsp;&nbsp;&nbsp;&nbsp; new InetSocketAddress("localhost",10000);<br />
&nbsp;return SocketChannel.open(socketAddress);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private void sendSumRequest(int first,int second)throws IOException{<br />
&nbsp;_buffer.clear();<br />
&nbsp;_intBuffer.put(0,first);<br />
&nbsp;_intBuffer.put(1,second);<br />
&nbsp;_channel.write(_buffer);<br />
&nbsp;System.out.println("发送加法请求 "+first+"+"+second);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private int receiveResponse()throws IOException{<br />
&nbsp;_buffer.clear();<br />
&nbsp;_channel.read(_buffer);<br />
&nbsp;return _intBuffer.get(0);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String [] args){<br />
&nbsp;SumClient sumClient=new SumClient();<br />
&nbsp;System.out.println("加法结果为 :"+sumClient.getSum(100,324));<br />
&nbsp;&nbsp;&nbsp; }<br />
} // SumClient<br />
3．&nbsp;非阻塞的加法服务器<br />
首先在openChannel方法中加入语句<br />
&nbsp;_serverChannel.configureBlocking(false);//设置成为非阻塞模式</p>
<p>重写WaitForConnection方法的代码如下，使用非阻塞方式<br />
private void waitForConnection()throws IOException{<br />
&nbsp;Selector acceptSelector = SelectorProvider.provider().openSelector();&nbsp;</p>
<p>&nbsp;/*在服务器套接字上注册selector并设置为接受accept方法的通知。<br />
&nbsp;这就告诉Selector，套接字想要在accept操作发生时被放在ready表<br />
&nbsp;上，因此，允许多元非阻塞I/O发生。*/<br />
&nbsp;SelectionKey acceptKey = ssc.register(acceptSelector, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectionKey.OP_ACCEPT);<br />
&nbsp;int keysAdded = 0;<br />
&nbsp;<br />
&nbsp;/*select方法在任何上面注册了的操作发生时返回*/<br />
&nbsp;while ((keysAdded = acceptSelector.select()) &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 某客户已经准备好可以进行I/O操作了，获取其ready键集合<br />
&nbsp;&nbsp;&nbsp;&nbsp; Set readyKeys = acceptSelector.selectedKeys();<br />
&nbsp;&nbsp;&nbsp;&nbsp; Iterator i = readyKeys.iterator();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; // 遍历ready键集合，并处理加法请求<br />
&nbsp;&nbsp;&nbsp;&nbsp; while (i.hasNext()) {<br />
&nbsp;&nbsp;SelectionKey sk = (SelectionKey)i.next();<br />
&nbsp;&nbsp;i.remove();<br />
&nbsp;&nbsp;ServerSocketChannel nextReady = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ServerSocketChannel)sk.channel();<br />
&nbsp;&nbsp;// 接受加法请求并处理它<br />
&nbsp;&nbsp;_clientSocket = nextReady.accept().socket();<br />
&nbsp;&nbsp;&nbsp;processRequest();<br />
&nbsp;&nbsp;&nbsp;_clientSocket.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>参考资料<br />
1．&nbsp;&lt;Master Merlin's new I/O classes&gt;&nbsp;&nbsp; From &lt;<a href="http://www.javawordl.com/">http://www.javawordl.com/</a>&gt;<br />
2．&nbsp;J2SE1.4.2 API Specification From &lt;<a href="http://java.sun.com/">http://java.sun.com/</a>&gt;<br />
3．&nbsp;&lt;Working with SocketChannels&gt; From &lt;<a href="http://developer.java.sun.com/developer">http://developer.java.sun.com/developer</a>&gt;<br />
&nbsp;4.&nbsp;&nbsp; NIO Examples From &lt;<a href="http://java.sun.com/">http://java.sun.com/</a>&gt;</p>
</span>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/298794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-19 08:33 <a href="http://www.blogjava.net/Juizes361/articles/298794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GIS基本功能(转)</title><link>http://www.blogjava.net/Juizes361/articles/298516.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Fri, 16 Oct 2009 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/298516.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/298516.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/298516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/298516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/298516.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;"><font size="2">记录属性的数据库，GIS可以作为数据库集成和更新的重要<a id="hl_3" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[3]);qs_show_frame(event,this,3);" onmouseout="_on_div[3]=false;_ht[3]=window.setTimeout('qs_is_on_div(3)',1000);">工具</a>之一。进行数据库的组织主要取决于数据输入的形式，以及利用数据库进行查询、分析和结果输出等方式，它包括数据库定义、数据库建立与维护、数据库操作、通讯等<a id="hl_1" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[1]);qs_show_frame(event,this,1);" onmouseout="_on_div[1]=false;_ht[1]=window.setTimeout('qs_is_on_div(1)',1000);">功能</a>。 </font>
<p style="line-height: 150%;"><strong><a name="5．4 空间查询与空间分析功能"><font color="#000000" size="2">空间查询与空间分析功能</font></a><font color="#000000" size="2">&nbsp; </font></strong> <font color="#ffffff">字串8</font> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">GIS的面向用户的应用
功能不仅仅表现在它能提供一些静态的查询、检索数据，更有意义的在于用户可以根据需要建立一个应用分析的模式，通过动态的分析，从而为评价、管理和决策服
务。这种分析功能可以在系统操作运算功能的支持下或建立专门的分析软件来实现，如空间信息量测与分析、统计分析、地形分析、<a id="hl_2" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[2]);qs_show_frame(event,this,2);" onmouseout="_on_div[2]=false;_ht[2]=window.setTimeout('qs_is_on_div(2)',1000);">网络</a>分析、叠置分析、缓冲分析、决策支持等。系统本身是否具有建立各种应用模型的功能是判别它好坏的重要标志之一，因为这种功能在很大程度上决定了该系统在实际应用中的灵活性和经济效益。<br />
空间查询和空间分析是从GIS目标之间的空间关系中获取派生的信息和新的知识，用以回答有关空间关系的查询和应用分析。 </font> <font color="#ffffff">字串5</font> </p>
<p style="line-height: 150%;"><font color="#000000"><font size="2"><strong>&nbsp;拓扑空间查询</strong> </font></font> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">在此操作中，用户将地图
当作查询工具，而不仅仅是数据载体。空间目标之间的拓扑关系可以有两类：一种是几何元素的结点、弧段和面块之间的关联关系，用以描述和表达几何元素间的拓
扑关系；另一种是GIS中地物之间的空间拓扑关系，可以通过关联关系和位置关系隐含表达，用户需通过特殊的方法查询。</font> 字串9 </p>
<p style="line-height: 150%;"><font color="#000000" size="2">这些空间关系主要有以下
几项：面与面的关系，如检索与某个面状地物相邻的所有多边形及属性；线与线的关系，如检索与某一主干河相关联的所有支流；点与点的关系，如检索到某点一定
距离内的所有点状地物；线与面的关系，如检索某公路所经过的所有县市或某县市内的所有公路；点与线的关系，如某河流上的所有桥梁；点与面的关系，如检索某
市所有银行分布点。 </font> </p>
<p style="line-height: 150%;"><font color="#000000"><font size="2"><strong>&nbsp;缓冲区分析</strong> </font></font> <font color="#ffffff">字串1</font> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">缓冲区用以确定围绕某地要素绘出的定宽地区，以满足一定的分析条件。点的缓冲区是个圆饼，线的缓冲区是个条带状，多边形的缓冲区则是个更大的相似多边形。缓冲区分析是GIS中<a id="hl_0" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[0]);qs_show_frame(event,this,0);" onmouseout="_on_div[0]=false;_ht[0]=window.setTimeout('qs_is_on_div(0)',1000);">基本</a>的空间分析功能之一，尤其对于建立影响地带是必不可少的。如道路规划中建立缓冲区以确定道路两边若干距离内的土地利用性质。 </font> </p>
<p style="line-height: 150%;"><font color="#000000"><font size="2"><strong>叠加分析</strong> </font></font> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">叠加分析提供根据两幅或
两幅以上图层在空间上比较地图要素和属性的能力，通常有合成叠加和统计叠加之分，前者是根据两组多边形边界的交点建立具有多重属性的多边形，后者则进行多
边形范围的属性特征统计分析（如图1-3所示）。合成叠加得到一张新的叠加图，产生了许多新多边形，每个多边形都具有两种以上的属性。统计叠加的目的是统
计一种要素在另一种要素中的分布特征。 </font> </p>
<p style="line-height: 150%;"><font color="#000000"><font size="2"><strong>距离分析及相邻相接分析</strong></font></font></p>
<p style="line-height: 150%;"><font color="#000000" size="2">距离分析提供了在地图上
距离的功能，相邻分析确定哪些地图要素与其它要素相接触或相邻，而相接分析则结合距离和相邻分析两者的针对性，提供确定地图要素间邻近或邻接的功能。相邻
和相接分析广泛应用于环境规划和影响评价的公共部门。大多数GIS软件目前不能直接进行相邻相接分析，而是通过先建立一定要求的缓冲区，再与其它图形要素
进行叠置分析的间接方法解决。<br />
<br />
<strong><a name="5．5 地形分析功能">地形分析功能</a>&nbsp;&nbsp; </strong></font> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">通过数字地形模型DTM，以离散分布的平面点来模拟连续分布的地形，再从中内插提取各种地形分析数据，地形分析包括以下内容：</font> 字串4 </p>
<p style="line-height: 150%;"><strong><font color="#000000" size="2">等高线分析</font></strong> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">等高线图是人们传统上观测地形的主要手段，可以从等高线上精确地获得地形的起伏程度，区域内各部分的高程等。</font> </p>
<p style="line-height: 150%;"><strong><font color="#000000" size="2">透视图分析</font></strong> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">等高线虽然精确，但不够直观，用户往往需要从直观上观察地形的概貌，所以GIS通常具有绘制透视图的功能，有些系统还能在三维空间格网上着色，使图形更为逼真。</font> <font color="#ffffff">字串1</font> </p>
<p style="line-height: 150%;"><strong><font color="#000000" size="2">坡度坡向分析</font></strong></p>
<p style="line-height: 150%;"><font color="#000000" size="2">在DTM中计算坡度和坡向，派生出坡度坡向图供地形分析（如日照分析、土地适宜性分析等）。</font> </p>
<p style="line-height: 150%;"><strong><font color="#000000" size="2">5．5．4 断面图分析</font></strong> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">用户可以在断面图上考察该剖面地形的起伏并计算剖面面积，以便用于工程设计和工程量算。</font> </p>
<p style="line-height: 150%;"><strong><font color="#000000" size="2">&nbsp;地形表面面积和填挖方体积计算&nbsp; </font></strong> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">利用DTM数据，可以比较容易地求出所需要地区的地形表面面积以及施工区域内填挖方的体积（土石方量）。 </font> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">制图功能、地理数据库、空间查询与空间分析能力是GIS最具有独特吸引力所在。而系统是否具有良好的用户接口和各种应用分析程序的支持也是至关重要的，但是应由GIS开发人员和用户来共同完成的。</font> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">地理信息系统技术广泛应用于农业、林业、国土资源、地矿、军事、交通、测绘、水利、广播电视、通讯、电力、公安、社区管理、教育、能源等几乎所有的行业，并正在走进人们日常的工作、学习和生活中。</font> <font color="#ffffff">字串2</font> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">地理信息系统的主要任务是对与地理空间位置或区域有关的社会经济、人文景观、自然资源及环境等多种信息进行综合管理和分析，主要任务有以下三个方面</font> </p>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/298516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-16 10:43 <a href="http://www.blogjava.net/Juizes361/articles/298516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GIS的组成(转)</title><link>http://www.blogjava.net/Juizes361/articles/298513.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Fri, 16 Oct 2009 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/298513.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/298513.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/298513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/298513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/298513.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<font size="2"><strong><br />
系统的硬件环境<font color="#000000">&nbsp; </font></strong></font>
<p style="line-height: 150%;"><font color="#000000" size="2">地理信息系统的硬件环境主要由计算机及一些外围设备联接形成的，主要包括以下几个部分：<br />
（1） 计算机系统。它是系统操作、管理、加工和分析数据的主要设备，包括优良的CPU、键盘、屏幕终端、鼠标等。可以单机，也可以组成计算机网络（包括局域网和广域网）系统来应用。<br />
（2） 数据输入设备。它用于将各种需要的数据输入计算机，并将摸拟数据转换成数字数据。其他一些专用设备，如数字化仪、扫描仪、解析测图仪、数字摄影测量仪器、数码相机、遥感图象处理系统、机助制图系统、GPS等，均可以通过数字接口与计算机相联接。<br />
（3） 数据存贮设备。主要指存贮数据的磁盘、磁带及光盘驱动器等。<br />
（4） 数据输出设备。它包括图形终端显示设备、绘图机、打印机、磁介质硬拷贝机、可擦写光盘，以及多媒体输出装置等。它们将以图形、图象、文件、报表等不同形式显示数据的分析处理的结果。<br />
（5） 数据通讯传输设备。如果GIS是处于高速信息公路的网络系统中，或处于某些局域网络系统中，还需要架设网络连线、网卡及其它网络专用设施。</font></p>
<p style="line-height: 150%;"><font color="#000000" size="2">由于计算机技术的迅猛发展，硬件的有效生命期较短，设备的淘汰率较高，而且价格昂格，因此对GIS硬件环境的选择，必须根据系统的需求、系统所担负的任务与投资情况，进行系统总体设计，要考虑软、硬件环境整体配套、协调一致。<br />
</font>
</p>
<p style="line-height: 150%;"><strong><a name="4．2 系统的软件环境"><font color="#000000" size="2">系统的软件环境</font></a></strong> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">为了实现复杂的空间数据管理功能，GIS需要有与硬件环境相配套的多种软件功能模块。在软件层次上需要有系统软件、基础软件、基本功能软件、应用软件等多层次体系。根据GIS的功能可划分为以下几个子系统：</font> <font color="#ffffff">字串6</font> </p>
<p style="line-height: 150%;"><strong><font color="#000000" size="2">计算机系统软件和基础软件</font></strong> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">由计算机厂家提供操作系统及各种维护使用手册、说明书等，以及某些基础软件（如C，C++等）。系统软件和基础软件是系统开发的一切软件基础，是GIS日常工作所必备的。</font> <font color="#ffffff">字<font color="#000000"><font size="2"><strong><br />
</strong></font></font></font></p>
<p style="line-height: 150%;"><strong><font color="#000000" size="2">数据输入子系统</font></strong> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">它通过各种数字化设备（如数字化仪、扫描仪等）将各种已存在的地图数字化，或者通过通讯设备或磁盘、磁带的方式录入遥感数据和其他系统已存在的数据，也包括用其它方式录入的各种统计数据，野外数据和仪器记录的数据。<br />
输入的数据应进行校验，即通过观察、统计分析和逻辑分析，检查数据中存在的错误，并通过适当的编辑方式加以修正。<br />
输入的数据应进行存贮和管理，它包括空间景物的位置，相互间联系以及它们的地理意义（属性）的结构和组合，以及数据格式的选择和转换、数据压缩编码、数据的联接、查询、提取等。对应不同的数据输入、存贮和管理方式，系统都应配备有相应的支持软件。</font> </p>
<p style="line-height: 150%;"><strong><font color="#000000" size="2">数据编辑子系统</font></strong> <font color="#ffffff">字串5</font> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">GIS应具有较强的图形编辑功能，以便对原始数据输入错误进行编辑和修改。同时还需要进行图形修饰，为图形设计线型、颜色、符号、注记等，并建立拓扑关系，组合复杂地物，输入属性数据等。一般说来，GIS软件应具有以下编辑功能：<br />
（1）图形变换：开窗、放大、缩小、屏幕滚动、拖动等。<br />
（2）图形编辑：删除、增加、剪切、移动、拷贝等。<br />
（3）图形修饰：线型、颜色、符号、注记等。<br />
（4）拓扑关系：结点附合、多边形建立、拓扑检验等。<br />
（5）属性输入：属性联接、数据库实时输入、数据编辑修改等。</font></p>
<p style="line-height: 150%;"><strong><font color="#000000" size="2">空间数据库管理系统&nbsp;</font></strong> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">在GIS中既有空间定位数据，又有说明地理的属性数据。对这两类数据的组织与管理并建立二者联系是至关重要的。为保证GIS有效的工作，保持空间数据的一致性和完整性，需要设计良好的数据库结构和数据组织方法，一般采用数据库技术来完成该项工作。</font> </p>
<p style="line-height: 150%;"><strong><font color="#000000" size="2">空间查询与空间分析系统</font></strong> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">这是GIS面向应用的一个核心部分，也是GIS区别其它系统（如MIS）的一个重要方面，它应具有以下三方面的功能：<br />
（1）检索查询：包括空间位置查询、属性查询等。<br />
（2）空间分析：能进行地形分析、网络分析、叠置分析、缓冲区分析等。<br />
（3）数学逻辑运算：包括函数运算、自定义函数运算、以及驱动应用模型运算。</font> </p>
<p style="line-height: 150%;"><font color="#000000" size="2">GIS通过对空间数据及属性的检索查询、空间分析、数学逻辑运算，可以产生满足应用条件的新数据，从而为统计分析、预测、评价、规划和决策等应用服务。</font> <font color="#ffffff">字串5</font></p>
<p style="line-height: 150%;"><font color="#ffffff"></font><strong><font color="#000000" size="2">数据输出子系统</font></strong></p>
<p style="line-height: 150%;"><font color="#000000"><font size="2">功能是将检索和分析处理的结果按用户要求输出，其形式可以是地图、表格、图表、文字、图象等表达，也可在屏幕、绘图仪、打印机或磁介质上输出。</font></font> <font color="#ffffff">字串2</font> </p>
<p style="line-height: 150%;"><font color="#000000"><font size="2">以上六个子
系统是GIS软件系统必备的功能模块。一个优秀的GIS软件系统还应备有较强功能的用户接口模块和适宜的应用分析程序的支持。用户接口模块是保证GIS成
为接收用户指令和程序，实现人－－机交互的窗口，使GIS成为开放式系统。有良好的应用程序的支持，将使GIS的功能得到扩充与延伸，使更具有实用性，这
是用户最为关心的真正用于空间分析的部分</font></font></p>
<p style="line-height: 150%;"></p>
<p style="line-height: 150%;"><font color="#000000"><font size="2"><br />
</font></font> </p>
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/298513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-16 10:34 <a href="http://www.blogjava.net/Juizes361/articles/298513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源GIS系统现状分析(转)</title><link>http://www.blogjava.net/Juizes361/articles/298509.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Fri, 16 Oct 2009 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/298509.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/298509.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/298509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/298509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/298509.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;"><strong>平台的对峙<br />
<br />
</strong>　　开发者都希望自己的软件能够运行在尽可能多的计算机上。然而事与愿违，摆在GIS开发
者面前的仍然是对峙的平台。J2EE随着Java5。0的发布，已经正式更名为JavaEE，
而微软也正式发布了。NET2。0以及集成开发环境利器Visual Studio 2005。到底是。NET还是Java?
面对旗鼓相当的Java和。NET阵营，其实GIS平台开发商的答案早已揭晓，那就是都要！由于。NET和Java比较起来并无明显的优劣之分，只是随应
用的需要和习惯的差别而略有不同，因此提供Java和。NET的双份开发接口来满足不同的需求也就不难理解了。可实际中，若要同时支持Java和。NET
谈何容易！要知道GIS的出现是上个世纪60年代的事，在当代众多IT缩写词出现之前，GIS就已经在城市规划、土地<a id="hl_1" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[1]);qs_show_frame(event,this,1);" onmouseout="_on_div[1]=false;_ht[1]=window.setTimeout('qs_is_on_div(1)',1000);">管理</a>、军事等行业得到了应用。几十年的积累，很多代码已经成为了固化的资产。GIS平台开发商经历过二次开发语言的繁荣和凋敝，组件时代的兴起和衰落，而今又要面对平台对峙的挑战。也经历许我们应该考虑一些更好的、更彻底的解决办法，能够让我们在这个多变的时代找到相对<a id="hl_2" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[2]);qs_show_frame(event,this,2);" onmouseout="_on_div[2]=false;_ht[2]=window.setTimeout('qs_is_on_div(2)',1000);">稳定</a>的
支点。事实上，这个问题已经有了比较好的答案，办法其实也很简单，那就是重回C/C++的荣耀之都，实现GIS内核和外壳分离，以适应不断变化的外部世
界。其实这个办法也不是GIS一家的专利，使用C/C++编写程序，实现一次编写，到处编译。这也是很多软件采取的跨平台策略。相比之下，无论是在
Java组件和COM之间架桥还是在Linux和Windows之间修路，总显得有些不够优雅。不出意外，平台的对峙在未来的几年还会持续下去，在这对峙
的平台下开发，也许最能彰显我们开发者智慧。<br />
<br />
<div>
<p><strong>全球的数据  <br />
<br />
</strong>　　数据是GIS的重要基石，无论何种行业应用，离开了数据都是无源之水，无本之木。空间数据不同于其他信息系统中的业务数据，能够在系统运行<a id="hl_0" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[0]);qs_show_frame(event,this,0);" onmouseout="_on_div[0]=false;_ht[0]=window.setTimeout('qs_is_on_div(0)',1000);">过程</a>中
自然产生，它需要专门的人员采集、编辑、更新，空间数据生产本身就是一个不断壮大的行业。遥感技术的飞速发展，使我们能够获得的GIS数据不断膨胀，单是
这些数据的存储管理就是一个很大的问题。GIS需要管理管理的数据是全球范围的，面对如此庞大的数据，使用数据库是自然的选择。我们很难将地理信息技术和
数据库分割开来，从来都没有人对使用数据库有过怀疑，问题的焦点是如何使用。应用是多样的，工程、摄影测量和其他技术或行业都有其利用空间数据的特定方
式，如果我们试图把多样的需求统一到一种空间数据库的解决方案中，这种努力很可能是无益的。也许我们需要的是一种开放、灵活和可扩展的结构，能够动态适应
变化。<br />
<br />
海量影像数据的建库和发布技术在2005年形成了一轮高潮。GIS、遥感等领域的多家厂商都推出了各具特色的产品。现在我们可
以在各种设备、各种环境下轻松浏览高分辨率的遥感影像。影像库的规模也非常庞大，几十G的数据有时候都不好意思和人家说，建TB级影像库的大有人在。然而
各种影像发布技术在Google
Earth所表现出的震撼人心的效果面前都显得黯然失色，一家从事搜索的企业做出来的产品一下子让在GIS行业浸淫多年的正规军们觉得很没面子。其
实，GIS企业和Google这样的网络公司有着不同的盈利模式，GIS企业可能都具备显示三维地球的技术实力，但是它们不可能仅仅是为了好看好玩来开发
产品，必须要根据市场的需要，为那些真正买单的人开发产品。如果开发一个全球三维浏览的产品只是用来<a id="hl_5" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[5]);qs_show_frame(event,this,5);" onmouseout="_on_div[5]=false;_ht[5]=window.setTimeout('qs_is_on_div(5)',1000);">广告</a>的话，那这笔广告费未免也过于昂贵了。所幸的是有Google这样的新贵，非常大手笔地做足了遥感和GIS的科普工作，也提升了大家对地理信息系统的三维表现技术的热情。 <font color="#ffffff">字串1</font> <br />
<br />
<strong>大众地理信息服务</strong><br />
<br />
GIS业界人士一直都期望融入IT主流，让GIS走进千家万户，让GIS成为人们日常生活的一部分，就像我们每天都会收发E-mail，每天都要使用字
处理软件那样。大家有这个想法不是偶然的。毕竟我们无论旅游、约会、购物，只要和出行相关，都免不了求助于地图。手机通话中使用频率最高的语句除了&#8220;喂，
你好&#8221;之外，恐怕就是&#8220;你在哪里&#8221;了。大众地理信息服务就是希望为人们的日常生活提供位置信息，解决大家最常问的&#8220;在哪里&#8221;，&#8220;怎么去&#8221;的问题，这方面典
型的业务就是以Google，百度，新浪本地搜索为代表的公众地图服务。在GIS开发者的眼里，也许公众地图服务技术并不复杂，有经验的开发者也许都考虑
过这个颇有诱惑力的市场。事实上，公众地图服务除了要做的简单易用功能强大之外，还有数据的获取和更新途径，以及最重要的问题：如何从公众地图服务中赚
钱？赢利模式是GIS企业在公众地图服务的门槛外看了又看，却始终裹足不前的根本原因。无法清楚地看到利润的增长点，而前期的高投入和大量的公关协调工作
使得这项有巨大潜力的业务理所当然地被Google这样有雄厚财力和丰富IT赢利经验的大公司所占领。<br />
<br />
应当注意的是，大众地理信息服务的范围远非提供一个本地搜索业务，我们日常中的各种软件都可能和GIS沾点关系。比如可以在即时通信<a id="hl_6" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[6]);qs_show_frame(event,this,6);" onmouseout="_on_div[6]=false;_ht[6]=window.setTimeout('qs_is_on_div(6)',1000);">工具</a>如MSN
Messenger，
QQ中增加地图聊天功能，方便网友会面；再比如在手机等移动设备上提供和位置信息相关的商业广告。这些由于都是和位置信息相关的增值业务，所以它们就有一
个共同的名字——基于位置的服务(LBS)。LBS看上去市场很大，机会很多，但实际运行起来却很不容易。除了需要运营商的大力支持外，赢利模式仍然是最
重要的因素。<br />
<br />
<strong>移动的地图</strong><br />
<br />
移动开发由于其庞大的终端数量形成了一个潜在的巨大市场，并已形成了一条比较清晰的产业链。最上端是集成电路、通信器件等手机电子器件生产商，下游是应用软件开发商，而连接应用软件开发和硬件制造商的是操作系统供应商。<br />
<br />
和网络<a id="hl_4" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[4]);qs_show_frame(event,this,4);" onmouseout="_on_div[4]=false;_ht[4]=window.setTimeout('qs_is_on_div(4)',1000);">游戏</a>类
似，手机上的地图服务业务也主要掌握在运营商手中。如果中移动或联通有意提供这种业务，那我们对着电话大喊&#8220;喂，你在哪里&#8221;的这种&#8220;定位基本靠吼&#8221;的日子
就可以一去不复返了。目前，中国移动增值业务有SMS，彩信/彩E，WAP，Java/BREW和IVR五块。移动运营商提供的服务主要集中在<a id="hl_3" class="qs_highlight1" style="font-size: 1em;" href="javascript:void(0)" onmouseover="window.clearTimeout(_ht[3]);qs_show_frame(event,this,3);" onmouseout="_on_div[3]=false;_ht[3]=window.setTimeout('qs_is_on_div(3)',1000);">短信</a>、WAP和KJAVA这三块。移动应用市场尽管在全球范围内已达到了几十亿美金，但商机周围也密布着风险，因此手机上的地图服务能否成为现实还是个未知数。<br />
<br />
GIS移动开发领域还包括很多其他的重要方向。比较典型和成熟的业务是野外数据采集，车载导航等和定位系统的集成应用。事实上，谈到移动GIS开发，我
们就不能不说到无线定位技术。大家所熟知的GPS是一种定位手段，其实还有很多其他的定位方法。比如利用无线局域网定位，移动通信基站定位，有线电视台网
也能提供位置信息。这些定位方法可以弥补GPS在室内环境中无法应用的不足，从而为移动地理信息服务业务提供了更广阔的空间。<br />
<br />
<strong>开源的追求</strong><br />
<br />
和充满金钱气息的商业GIS开发领域相比，开源GIS的世界则显得朴素沉静，是技术爱好者的乐园。打开Source
Forge网站，在下载排行榜Top10上，我们会赫然发现一个GIS门类的软件——World
Wind。这个由NASA策划，用C#编写，调用微软SQL Server影像库Terrain
Server来进行全球地形三维显示的软件和Google
Earth非常相似。由于三维地球仿真具有强大的视觉冲击力，令人百看不厌，爱不释手，所以使得World
Wind这个相当专业的软件能够跻身充斥着电驴、电骡等BT下载客户端软件的Source Forge Top10排行榜。<br />
<br />
不同于商
业GIS软件，开源GIS软件不用背负数据兼容、易用性等问题的包袱，开发者能够集中精力于功能的开发，因此开源GIS软件普遍功能很强，技术也非常先
进，其背后是来自技术狂热者和学院研究生的大力支持。开源GIS软件目前已经形成了一个比较齐全的产品线。打开www.freegis.org网站，我们
会发现众多各具特色的GIS软件。老牌的综合GIS软件GRASS，数据转换库OGR、GDAL，地图投影算法库Proj4、Geotrans，也有比较
简单易用的桌面软件Quantum GIS，Java平台上有Map Tools，Map Server则是优秀的开源Web
GIS软件。各种空间分析，模型计算尤其是开源GIS领域的强项。动态语言如Python在开源世界中颇受宠爱，开源GIS软件也不例外，很多GIS工具
都提供了Python接口，以便于系统集成。Python优雅的语法和超强的粘合能力实在是一种挡不住的诱惑。 </p>
<br />
开源GIS世界虽然繁荣，但其影响还是很小，其身份在外人眼里看来是高深莫测的专业工具，现有的Linux发行版中也没有哪个集成了开源GIS工具。开
源GIS技术虽然先进，但是缺乏良好的能够满足商用的发行版本，因此涉足开源GIS领域的多是技术爱好者和科学家，而少有商业人士问津。如果能够提供一个
比较系统的、达到商用要求的开源GIS解决方案，并能获得稳定的发行版，如同Linux-Apache-MySQL-PHP那样，开源GIS前途将是不可
限量。<br />
<br />
<strong>开放、集成、标准和互操作</strong><br />
<br />
我们可以把GIS看作是一个和众多高新技术
相关的综合性，交叉性的技术群。它涉及面广，牵扯的东西多，技术发展的趋势也是见仁见智。那么，这纷纭复杂现象背后的密义是什么呢？其实不难发现，GIS
的要旨是开放。包括体系结构的开放，数据模型的开放，以及我们开发者思想观念的开放。只有开放，才能最大限度地提供扩展能力和灵活性，只有开放才能和应用
领域充分融合，也只有开放才能让我们有更多的创新机会。和开放相应的，是GIS在应用中表现出来的重要特点——集成。GIS自从走出实验室，成为一项服务
于信息化建设的技术工具，就没离开过各种集成。GIS可以集成到业务数据中，可以集成到数据表现中，可以集成到办公软件中&#8230;&#8230;
集成能力是GIS的活力所在，如果失去了和各种业务系统的集成能力，GIS就只能孤芳自赏，失去生命力了。那么，如何保证GIS的开放和集成能力呢？关键
是标准。标准以及它的派生物互操作，是GIS行业中一个非常重要的问题。对于任何地理信息技术或市场，一致和有效的标准的使用，能够创造机会，激发创新，
增加价值，缩短投资周期，并降低风险。不仅如此，标准还是控制市场的制高点，是GIS厂商的必争之地，因此我们就不难理解大家为何如此热衷于制定标准了。<br />
<br />
GIS发展的另一个重要趋势是从软件向服务的转变。尤其是
2001年以来网格计算概念的爆发，在学术界和信息技术领域掀起了一股网格的热潮。针对网格在GIS中的应用，有很多深入的研究和讨论。我们姑且不管伴随
网格计算的那一长串难懂的IT缩写词，先看看网格之父Ian
Foster对网格概念的三点说明：协同非集中管理的资源，使用标准的协议，提供高质量的服务。GIS作为一个与生俱来的分布式系统，在标准和互操作方面
一直没有停止过努力。在网格热浪来临的时候，GIS业界人士也许更多地是会心一笑，因为我们心里很明了Foster所说的三个要点，其实一直都是GIS开
发者追求的目标。&nbsp;
<li>空间数据库，采用PostgreSQL/PostGIS。在windows平台采用PostgreSQL的8.0 win32版，可从<a href="http://www.postgresql.org/">www.postgresql.org</a>上获取。该版本已经包含PostGIS。安装过程中postgis一项要选中。PostGIS实现了OpenGIS简单特征规范，并且提供了空间索引。PostGIS的官方站点：<a href="http://postgis.refractions.net/">http://postgis.refractions.net/</a>。 </li>
<li>GIS中间件，采用GeoTools，GeoTools是比较成熟的开源GIS中间件，有近10年的历史了，并且还有一定的OpenGIS官方背景。可从<a href="http://www.geotools.org/"><font color="#3f3d3d">www.geotools.org</font></a>获取。geotools采用java实现，架构非常优秀，容易扩展。geotools中采用了另一个著名的开源软件JTS（java拓扑套件）。JTS封装了常用的geo算法，并且实现了OpenGIS的简单特征规范，也提供了基于内存的空间索引。 </li>
<li>Web Map Server，采用GeoServer。可从<a href="http://geoserver.sourceforge.net/"><font color="#3f3d3d">http://geoserver.sourceforge.net</font></a> 下载。GeoServer实现了OpenGIS WMS规范和WFS规范。安装GeoServer需要安装Apache或者Tomcat。 </li>
<li>GIS Editor，采用另一个著名的GIS开源软件JUMP。可从<a href="http://www.jump-project.org/"><font color="#3f3d3d">http://www.jump-project.org/</font></a>下载。JUMP基于Java，采用插件机制，容易扩展。另一个网站<a href="http://jump-pilot.sourceforge.net/"><font color="#3f3d3d">http://jump-pilot.sourceforge.net/</font></a>提供有JUMP的插件。 </li>
<li>GRASS </li>
<li>MapTools </li>
<li>浏览器端 Client，可以采用javascript实现，也可以用flash实现，也可以用java applet实现。我选择javascript方式，网上有很多开源实现，我在其中一个最简单的基础上改进了一下。 </li>
</div>
<br />
<br />
<br />
</span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/298509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-16 10:23 <a href="http://www.blogjava.net/Juizes361/articles/298509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSON介绍(转)</title><link>http://www.blogjava.net/Juizes361/articles/298443.html</link><dc:creator>残叶舞风</dc:creator><author>残叶舞风</author><pubDate>Thu, 15 Oct 2009 11:45:00 GMT</pubDate><guid>http://www.blogjava.net/Juizes361/articles/298443.html</guid><wfw:comment>http://www.blogjava.net/Juizes361/comments/298443.html</wfw:comment><comments>http://www.blogjava.net/Juizes361/articles/298443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Juizes361/comments/commentRss/298443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Juizes361/services/trackbacks/298443.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;"><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="text-indent: 20.65pt;"><strong><span style="font-size: 10.5pt;">JSON</span></strong><span style="font-size: 10.5pt;">(JavaScript Object Notation) </span><span style="font-size: 10.5pt;">是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式，但是也使用了类似于C语言家族的习惯（包括C, C++, C#, Java, JavaScript, Perl, Python等）。这些特性使JSON成为理想的数据交换语言。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;">尽管有许多宣传关于 XML 如何拥有跨平台，跨语言的优势，然而，除非应用于 Web Services，否则，在普通的 Web 应用中，开发者经常为 XML 的解析伤透了脑筋，无论是服务器端生成或处理 XML，还是客户端用 JavaScript 解析 XML，都常常导致复杂的代码，极低的开发效率。实际上，对于大多数 Web 应用来说，他们根本不需要复杂的 XML 来传输数据，XML 的扩展性很少具有优势，许多 AJAX 应用甚至直接返回 HTML 片段来构建动态 Web 页面。和返回 XML 并解析它相比，返回 HTML 片段大大降低了系统的复杂性，但同时缺少了一定的灵活性。 </span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;">现在， JSON 为 Web 应用开发者提供了另一种数据交换格式。让我们来看看 JSON 到底是什么，同 XML 或 HTML 片段相比，JSON 提供了更好的简单性和灵活性。 </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><br />
</strong></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong>JSON</strong><strong>的优点</strong></p>
<ol type="1">
    <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: small;">轻量级的数据交换格式</span></li>
    <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: small;">人们读写更加容易</span></li>
    <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: small;">易于机器的解析和生成</span></li>
    <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: small;">能够通过JavaScript中eval()函数解析JSON</span></li>
    <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: small;">JSON支持多语言。包括：ActionScript, C, C#, ColdFusion, E, Java, JavaScript, ML, Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Lua.</span></li>
</ol>
<p style="margin: 0cm 0cm 0pt;"><a name="N10072"><strong><br />
</strong></a></p>
<p style="margin: 0cm 0cm 0pt;"><a name="N10072"><strong>JSON </strong></a><strong>数据格式解析</strong></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;">和 XML 一样，JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的，因此，JSON 的数据格式非常简单，您可以用 JSON 传输一个简单的 String，Number，Boolean，也可以传输一个数组，或者一个复杂的 Object 对象。 </span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><br />
</strong></p>
<p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong>JSON</strong><strong>建构于两种结构：</strong></p>
<ul type="disc">
    <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: small;">&#8220;名称/值&#8221;对的集合（A collection of name/value pairs）。不同的语言中，它被理解为<em>对象（object）</em>，纪录（record），结构（struct），字典（dictionary），哈希表（hash table），有键列表（keyed list），或者关联数组 （associative array）。</span></li>
    <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: small;">值的有序列表（An ordered list of values）。在大部分语言中，它被理解为数组（array）。</span></li>
</ul>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left"><span style="font-size: small;">这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。</span></p>
<p><strong><span style="font-size: small;"><br />
</span></strong></p>
<p><strong><span style="font-size: small;">JSON具有以下这些形式：</span></strong></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Times New Roman;">1</span>）对象是一个无序的<span style="font-family: Times New Roman;">&#8220;&#8216;</span>名称<span style="font-family: Times New Roman;">/</span>值<span style="font-family: Times New Roman;">&#8217;</span>对<span style="font-family: Times New Roman;">&#8221;</span>集合。一个对象以<span style="font-family: Times New Roman;">&#8220;{&#8221;</span>（左括号）开始，<span style="font-family: Times New Roman;">&#8220;}&#8221;</span>（右括号）结束。每个<span style="font-family: Times New Roman;">&#8220;</span>名称<span style="font-family: Times New Roman;">&#8221;</span>后跟一个<span style="font-family: Times New Roman;">&#8220;:&#8221;</span>（冒号）；<span style="font-family: Times New Roman;">&#8220;&#8216;</span>名称<span style="font-family: Times New Roman;">/</span>值<span style="font-family: Times New Roman;">&#8217; </span>对<span style="font-family: Times New Roman;">&#8221;</span>之间使用<span style="font-family: Times New Roman;">&#8220;,&#8221;</span>（逗号）分隔。</span></p>
<p><span style="font-size: 10.5pt;">如：</span></p>
</span></span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><span style="color: rgb(0, 0, 0);">{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">city</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Beijing</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">street</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;Chaoyang&nbsp;Road&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">postcode</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">100025</span><span style="color: rgb(0, 0, 0);">}</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Times New Roman;">2</span>）数组是值（<span style="font-family: Times New Roman;">value</span>）的有序集合。一个数组以<span style="font-family: Times New Roman;">&#8220;[&#8221;</span>（左中括号）开始，<span style="font-family: Times New Roman;">&#8220;]&#8221;</span>（右中括号）结束。值之间使用<span style="font-family: Times New Roman;">&#8220;,&#8221;</span>（逗号）分隔。</span></p>
<p><span style="font-size: 10.5pt;">如：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">[<br />
{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">UserID</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">11</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Name</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">FirstName</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Truly</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">LastName</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Zhu</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">},&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Email</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">zhuleipro@hotmail.com</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">},<br />
{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">UserID</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">12</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Name</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">FirstName</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Jeffrey</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">LastName</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Richter</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">},&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Email</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">xxx◎xxx.com</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">},<br />
{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">UserID</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">13</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Name</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">FirstName</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Scott</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">LastName</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Gu</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">},&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Email</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">xxx2◎xxx2.com</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">}<br />
]<br />
</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Times New Roman;">3</span>）值（<span style="font-family: Times New Roman;">value</span>）可以是双引号括起来的字符串（<span style="font-family: Times New Roman;">string</span>）、数值<span style="font-family: Times New Roman;">(number)</span>、<span style="font-family: Times New Roman;">true</span>、<span style="font-family: Times New Roman;">false</span>、<span style="font-family: Times New Roman;"> null</span>、对象（<span style="font-family: Times New Roman;">object</span>）或者数组（<span style="font-family: Times New Roman;">array</span>）。这些结构可以嵌套。</span></p>
<p><span style="font-size: 10.5pt;">如：</span></p>
</span></span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><span style="color: rgb(0, 0, 0);">{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">UserID</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">13</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Name</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">FirstName</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Scott</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">LastName</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Gu</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">},&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Email</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">xxx2◎xxx2.com</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">}</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Times New Roman;"><br />
</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Times New Roman;">4</span>）字符串（<span style="font-family: Times New Roman;">string</span>）是由双引号包围的任意数量<span style="font-family: Times New Roman;">Unicode</span>字符的集合，使用反斜线转义。一个字符（<span style="font-family: Times New Roman;">character</span>）即一个单独的字符串（<span style="font-family: Times New Roman;">character string</span>）。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">字符串（<span style="font-family: Times New Roman;">string</span>）与<span style="font-family: Times New Roman;">C</span>或者<span style="font-family: Times New Roman;">Java</span>的字符串非常相似。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Times New Roman;">5</span>）数值（<span style="font-family: Times New Roman;">number</span>）也与<span style="font-family: Times New Roman;">C</span>或者<span style="font-family: Times New Roman;">Java</span>的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。</span></p>
<p>如：</p>
</span></span><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;"><span style="font-size: small;">这与绝大多数编程语言的表示方法一致，例如：{12345，-12345}</span></span></span><span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<pre><span style="font-size: 8.5pt; color: black;">&nbsp;</span></pre>
<pre><span style="font-size: 8.5pt; color: black;">&nbsp;</span></pre>
<p style="margin: 0cm 0cm 0pt;"><a name="N1010D"><strong>JavaScript </strong></a><strong>处理 JSON 数据 </strong></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;">上面介绍了如何用 JSON 表示数据，接下来，我们还要解决如何在服务器端生成 JSON 格式的数据以便发送到客户端，以及客户端如何使用 JavaScript 处理 JSON 格式的数据。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;">我们先讨论如何在 Web 页面中用 JavaScript 处理 JSON 数据。我们通过一个简单的 JavaScript 方法就能看到客户端如何将 JSON 数据表示给用户：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);">&nbsp;handleJson()&nbsp;{&nbsp;<br />
&nbsp; </span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;j</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">name</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Michael</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">address</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">city</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Beijing</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">street</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;Chaoyang&nbsp;Road&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">postcode</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">100025</span><span style="color: rgb(0, 0, 0);">}<br />
&nbsp;};&nbsp;<br />
&nbsp; document.write(j.name);&nbsp;<br />
&nbsp; document.write(j.address.city);&nbsp;<br />
&nbsp;}</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">假定服务器返回的 JSON 数据是上文的：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">{</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">name</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Michael</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">address</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:<br />
&nbsp;&nbsp;&nbsp; {</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">city</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Beijing</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">street</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;Chaoyang&nbsp;Road&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">postcode</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">100025</span><span style="color: rgb(0, 0, 0);">}<br />
}</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">只需将其赋值给一个 JavaScript 变量，就可以立刻使用该变量并更新页面中的信息了，相比 XML 需要从 DOM 中读取各种节点而言，JSON 的使用非常容易。我们需要做的仅仅是发送一个 Ajax 请求，然后将服务器返回的 JSON 数据赋值给一个变量即可。有许多 Ajax 框架早已包含了处理 JSON 数据的能力，例如 Prototype（一个流行的 JavaScript 库：http://prototypejs.org）提供了 evalJSON() 方法，能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Ajax.Request(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">http://url</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;{<br />
&nbsp;method:&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">get</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,<br />
&nbsp;onSuccess:&nbsp;</span><span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);">(transport)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;json&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;transport.responseText.evalJSON();<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;TODO:&nbsp;document.write(json.xxx);</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;}<br />
&nbsp;});</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><a name="N1012F"><strong><br />
</strong></a></p>
<p style="margin: 0cm 0cm 0pt;"><a name="N1012F"><strong>服务器端输出 JSON 格式数据</strong></a></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;">下面我们讨论如何在服务器端输出 JSON 格式的数据。以 Java 为例，我们将演示将一个 Java 对象编码为 JSON 格式的文本。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">将 String 对象编码为 JSON 格式时，只需处理好特殊字符即可。另外，必须用 (") 而非 (') 表示字符串：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;static&nbsp;String&nbsp;string2Json(String&nbsp;s)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; StringBuilder&nbsp;sb&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;StringBuilder(s.length()</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">20</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp; sb.append('</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">');<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">s.length();&nbsp;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">&nbsp;c&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;s.charAt(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">switch</span><span style="color: rgb(0, 0, 0);">&nbsp;(c)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;'</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(</span><span style="color: rgb(0, 0, 0);">""""""</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;'</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(</span><span style="color: rgb(0, 0, 0);">""""""</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;'</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(</span><span style="color: rgb(0, 0, 0);">"""</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;'</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">b':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(</span><span style="color: rgb(0, 0, 0);">"""</span><span style="color: rgb(0, 0, 0);">b</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp;'</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">f':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(</span><span style="color: rgb(0, 0, 0);">"""</span><span style="color: rgb(0, 0, 0);">f</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;'</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">n':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(</span><span style="color: rgb(0, 0, 0);">"""</span><span style="color: rgb(0, 0, 0);">n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp;'</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">r':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(</span><span style="color: rgb(0, 0, 0);">"""</span><span style="color: rgb(0, 0, 0);">r</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">case</span><span style="color: rgb(0, 0, 0);">&nbsp;'</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">t':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(</span><span style="color: rgb(0, 0, 0);">"""</span><span style="color: rgb(0, 0, 0);">t</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; sb.append('</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">');<br />
&nbsp;&nbsp;&nbsp; return&nbsp;sb.toString();<br />
&nbsp;} <br />
</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><br />
</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">将 Number 表示为 JSON 就容易得多，利用 Java 的多态，我们可以处理 Integer，Long，Float 等多种 Number 格式：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;static&nbsp;String&nbsp;number2Json(Number&nbsp;number)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;number.toString();<br />
&nbsp;} <br />
</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><br />
</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">Boolean 类型也可以直接通过 toString() 方法得到 JSON 的表示：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);"> static&nbsp;String&nbsp;boolean2Json(Boolean&nbsp;bool)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;bool.toString();<br />
&nbsp;}<br />
</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><br />
</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">要将数组编码为 JSON 格式，可以通过循环将每一个元素编码出来：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;static&nbsp;String&nbsp;array2Json(Object[]&nbsp;array)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(array.length</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">[]</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;StringBuilder(array.length&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp; sb.append('[');<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(Object&nbsp;o&nbsp;:&nbsp;array)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(toJson(o));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(',');<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;将最后添加的&nbsp;','&nbsp;变为&nbsp;']':</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; sb.setCharAt(sb.length()</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,&nbsp;']');<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;sb.toString();<br />
&nbsp;} <br />
</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><br />
</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">最后，我们需要将 Map&lt;String, Object&gt; 编码为 JSON 格式，因为 JavaScript 的 Object 实际上对应的是 Java 的 Map&lt;String, Object&gt; 。该方法如下：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">static&nbsp;String&nbsp;map2Json(Map</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String,&nbsp;Object</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;map)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(map.isEmpty())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">{}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;StringBuilder(map.size()&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp; sb.append('{');<br />
&nbsp;&nbsp;&nbsp; Set</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;keys&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;map.keySet();<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(String&nbsp;key&nbsp;:&nbsp;keys)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object&nbsp;value&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;map.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append('</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append('</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(':');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(toJson(value));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(',');<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;将最后的&nbsp;','&nbsp;变为&nbsp;'}':</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; sb.setCharAt(sb.length()</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,&nbsp;'}');<br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;sb.toString();<br />
&nbsp;} <br />
</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><br />
</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">为了统一处理任意的 Java 对象，我们编写一个入口方法 toJson(Object)，能够将任意的 Java 对象编码为 JSON 格式：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;public&nbsp;static&nbsp;String&nbsp;toJson(Object&nbsp;o)&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(o</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">null</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(o&nbsp;</span><span style="color: rgb(0, 0, 255);">instanceof</span><span style="color: rgb(0, 0, 0);">&nbsp;String)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;string2Json((String)o);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(o&nbsp;</span><span style="color: rgb(0, 0, 255);">instanceof</span><span style="color: rgb(0, 0, 0);">&nbsp;Boolean)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;boolean2Json((Boolean)o);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(o&nbsp;</span><span style="color: rgb(0, 0, 255);">instanceof</span><span style="color: rgb(0, 0, 0);">&nbsp;Number)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;number2Json((Number)o);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(o&nbsp;</span><span style="color: rgb(0, 0, 255);">instanceof</span><span style="color: rgb(0, 0, 0);">&nbsp;Map)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;map2Json((Map</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String,&nbsp;Object</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">)o);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(o&nbsp;</span><span style="color: rgb(0, 0, 255);">instanceof</span><span style="color: rgb(0, 0, 0);">&nbsp;Object[])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;array2Json((Object[])o);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;RuntimeException(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Unsupported&nbsp;type:&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;o.getClass().getName());<br />
&nbsp;} <br />
</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp; 我们并未对 Java 对象作严格的检查。不被支持的对象（例如 List）将直接抛出 RuntimeException 。此外，为了保证输出的 JSON 是有效的，Map&lt;String, Object&gt; 对象的 Key 也不能包含特殊字符。细心的读者可能还会发现循环引用的对象会引发无限递归，例如，精心构造一个循环引用的 Map，就可以检测到 StackOverflowException：</span></p>
</span></span><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);"> @Test(expected</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">StackOverflowError.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">)<br />
&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;testRecurrsiveMap2Json()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String,&nbsp;Object</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;map&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;HashMap</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String,&nbsp;Object</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">key</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;JsonUtil.map2Json(map);<br />
&nbsp;}<br />
</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;">
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><br />
</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;">好在服务器处理的 JSON 数据最终都应该转化为简单的 JavaScript 对象，因此，递归引用的可能性很小。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;">最后，通过 Servlet 或 MVC 框架输出 JSON 时，需要设置正确的 MIME 类型（application/json）和字符编码。假定服务器使用 UTF-8 编码，则可以使用以下代码输出编码后的 JSON 文本：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">&nbsp;</span></p>
</span></span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);"> @Test(expected</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">StackOverflowError.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">)<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;testRecurrsiveMap2Json()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String,&nbsp;Object</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;map&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;HashMap</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String,&nbsp;Object</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">key</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;JsonUtil.map2Json(map);<br />
}</span></div>
<span style="font-family: Comic Sans MS;"><span style="font-size: 10pt;"><br />
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">&nbsp;</span></p>
</span></span></span></span>
<img src ="http://www.blogjava.net/Juizes361/aggbug/298443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Juizes361/" target="_blank">残叶舞风</a> 2009-10-15 19:45 <a href="http://www.blogjava.net/Juizes361/articles/298443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>