<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Flyingis</title>
    <description></description>
    <link>http://gis.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>AE92 SDK for Java 窗体简例</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58470" style="color:red;">http://gis.javaeye.com/blog/58470</a>&nbsp;
          发表时间: 2007年03月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; 作者：<a href="/flyingis" target="_blank">Flyingis</a><br />
<br />
&nbsp;&nbsp;&nbsp; ArcEngine开发文档中提供了另外一个开发简例HelloGlobe，它是基于JFrame窗体的一个简单应用，从窗体设计代码中我们可以看到，ArcEngine已经以JavaBean的形式封装了一些常用的窗体控件，可以直接的应用到窗体设计的开发中，并且支持跨平台，给开发者提供了另一种选择。<br />
<br />
&nbsp;&nbsp;&nbsp; 引用的包：<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.awt.BorderLayout;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.awt.event.WindowAdapter;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.awt.event.WindowEvent;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.io.IOException;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;javax.swing.JFrame;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.beans.TOC.TOCBean;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.beans.globe.GlobeBean;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.beans.toolbar.ToolbarBean;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.controls.ControlsGlobeFullExtentCommand;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.controls.ControlsGlobeNavigateTool;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.controls.ControlsGlobeOpenDocCommand;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.system.AoInitialize;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.system.EngineInitializer;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.system.esriLicenseExtensionCode;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.system.esriLicenseProductCode;</span></div>
<p>&nbsp;&nbsp;&nbsp; 关于AWT和Swing的使用可以参考相关的书籍，从引用的包中，可以看到TOC、toolbar、globe显示窗都已经封装到JavaBean中，可以直接调用，为开发者省了不少事，也帮助开发人员可以像在Visual Studio下设计UI一样来设计Java的窗体。<br />
<br />
&nbsp;&nbsp;&nbsp; 看看它的窗体设计代码：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Create&nbsp;and&nbsp;display&nbsp;the&nbsp;frame<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 128, 0);">//<br />
<img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_80_1321_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_80_1321_Open_Text.style.display='none'; Codehighlighter1_80_1321_Closed_Image.style.display='inline'; Codehighlighter1_80_1321_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_80_1321_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_80_1321_Closed_Text.style.display='none'; Codehighlighter1_80_1321_Open_Image.style.display='inline'; Codehighlighter1_80_1321_Open_Text.style.display='inline';" alt="" style="display: none;" /></span><span style="color: rgb(0, 0, 255);">private</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;display()&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;IOException&nbsp;</span><span id="Codehighlighter1_80_1321_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_80_1321_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;setSize(</span><span style="color: rgb(0, 0, 0);">500</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">400</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Create&nbsp;the&nbsp;globe,&nbsp;toolbar,&nbsp;and&nbsp;table&nbsp;of&nbsp;contents&nbsp;beans.<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;GlobeBean&nbsp;globeBean&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;GlobeBean();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;ToolbarBean&nbsp;toolbarBean&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;ToolbarBean();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;TOCBean&nbsp;tocBean&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;TOCBean();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Add&nbsp;beans&nbsp;to&nbsp;the&nbsp;content&nbsp;pane.<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;getContentPane().add(toolbarBean,&nbsp;BorderLayout.NORTH);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;getContentPane().add(globeBean,&nbsp;BorderLayout.CENTER);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;getContentPane().add(tocBean,&nbsp;BorderLayout.WEST);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Add&nbsp;commands&nbsp;and&nbsp;tool&nbsp;to&nbsp;the&nbsp;toolbar.<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;toolbarBean.addItem(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ControlsGlobeOpenDocCommand(),&nbsp;</span><span style="color: rgb(0, 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);">1</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;toolbarBean.addItem(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ControlsGlobeNavigateTool(),&nbsp;</span><span style="color: rgb(0, 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);">1</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;toolbarBean.addItem(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ControlsGlobeFullExtentCommand(),&nbsp;</span><span style="color: rgb(0, 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);">1</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Buddy&nbsp;up&nbsp;the&nbsp;globe&nbsp;with&nbsp;the&nbsp;toolbar&nbsp;and&nbsp;table&nbsp;of&nbsp;contents.<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;toolbarBean.setBuddyControl(globeBean);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;tocBean.setBuddyControl(globeBean);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Shutdown&nbsp;ArcObjects&nbsp;when&nbsp;the&nbsp;window&nbsp;closes.<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1049_1297_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1049_1297_Open_Text.style.display='none'; Codehighlighter1_1049_1297_Closed_Image.style.display='inline'; Codehighlighter1_1049_1297_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1049_1297_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1049_1297_Closed_Text.style.display='none'; Codehighlighter1_1049_1297_Open_Image.style.display='inline'; Codehighlighter1_1049_1297_Open_Text.style.display='inline';" alt="" style="display: none;" /></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;addWindowListener(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;WindowAdapter()&nbsp;</span><span id="Codehighlighter1_1049_1297_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1049_1297_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1096_1293_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1096_1293_Open_Text.style.display='none'; Codehighlighter1_1096_1293_Closed_Image.style.display='inline'; Codehighlighter1_1096_1293_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1096_1293_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1096_1293_Closed_Text.style.display='none'; Codehighlighter1_1096_1293_Open_Image.style.display='inline'; Codehighlighter1_1096_1293_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&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;windowClosing(WindowEvent&nbsp;e)&nbsp;</span><span id="Codehighlighter1_1096_1293_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1096_1293_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1108_1179_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1108_1179_Open_Text.style.display='none'; Codehighlighter1_1108_1179_Closed_Image.style.display='inline'; Codehighlighter1_1108_1179_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1108_1179_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1108_1179_Closed_Text.style.display='none'; Codehighlighter1_1108_1179_Open_Image.style.display='inline'; Codehighlighter1_1108_1179_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_1108_1179_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1108_1179_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;AoInitialize().shutdown();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1210_1287_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1210_1287_Open_Text.style.display='none'; Codehighlighter1_1210_1287_Closed_Image.style.display='inline'; Codehighlighter1_1210_1287_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1210_1287_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1210_1287_Closed_Text.style.display='none'; Codehighlighter1_1210_1287_Open_Image.style.display='inline'; Codehighlighter1_1210_1287_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(IOException&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_1210_1287_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1210_1287_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ex.getMessage());<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;setVisible(</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp; 纯粹的Java窗体设计风格，简单易用。再看看main方法中的内容，和前面一篇《<a href="/flyingis/archive/2007/03/08/102619.html" target="_blank">AE92 SDK for Java 最小示例学习</a>》稍有区别。<br />
<br />
&nbsp;&nbsp;&nbsp; main方法：<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_39_524_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_39_524_Open_Text.style.display='none'; Codehighlighter1_39_524_Closed_Image.style.display='inline'; Codehighlighter1_39_524_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_39_524_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_39_524_Closed_Text.style.display='none'; Codehighlighter1_39_524_Open_Image.style.display='inline'; Codehighlighter1_39_524_Open_Text.style.display='inline';" alt="" style="display: none;" /><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);">static</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;main(String&nbsp;args[])&nbsp;</span><span id="Codehighlighter1_39_524_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_39_524_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_47_450_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_47_450_Open_Text.style.display='none'; Codehighlighter1_47_450_Closed_Image.style.display='inline'; Codehighlighter1_47_450_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_47_450_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_47_450_Closed_Text.style.display='none'; Codehighlighter1_47_450_Open_Image.style.display='inline'; Codehighlighter1_47_450_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_47_450_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_47_450_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;EngineInitializer.initializeVisualBeans();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;AoInitialize&nbsp;aoInitializer&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;AoInitialize();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;aoInitializer.initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;aoInitializer.checkOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;HelloGlobe&nbsp;thisApp&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;HelloGlobe();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;thisApp.setTitle(</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">Hello,&nbsp;Globe!</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;thisApp.display();<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_477_522_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_477_522_Open_Text.style.display='none'; Codehighlighter1_477_522_Closed_Image.style.display='inline'; Codehighlighter1_477_522_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_477_522_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_477_522_Closed_Text.style.display='none'; Codehighlighter1_477_522_Open_Image.style.display='inline'; Codehighlighter1_477_522_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(IOException&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_477_522_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_477_522_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ex.getMessage());<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp; 由于应用程序使用了窗体，因此在原始AO组建和Java Class建立关联时，需要initializeVisualBeans方法来初始化，initializeVisualBeans和initializeEngine两者选其一，使用可视化Beans选择前者，否则选择后者。这里aoInitializer对象除了指定相应的license授权，还检查相应的应用扩展。<br />
<br />
&nbsp;&nbsp;&nbsp; AE92 SDK for Java 已经集成到Eclipse3.2中，通过ArcEngine模板建立一个HelloGlobe工程，看看运行显示的结果：<br />
<br />
<p align="center"><img src="/images/blogjava_net/flyingis/HelloGlobe.gif" border="0" height="399" alt="HelloGlobe.gif" width="560" /></p>
<p align="left">&nbsp;&nbsp;&nbsp; 基于这个模板框架，可以方便我们深入扩展Globe二次开发的功能。</p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58470#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 Mar 2007 12:41:00 +0800</pubDate>
        <link>http://gis.javaeye.com/blog/58470</link>
        <guid>http://gis.javaeye.com/blog/58470</guid>
      </item>
      <item>
        <title>AE92 SDK for Java 最小示例学习</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58471" style="color:red;">http://gis.javaeye.com/blog/58471</a>&nbsp;
          发表时间: 2007年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; 作者：<a href="/flyingis" target="_blank">Flyingis</a><br />
<br />
&nbsp;&nbsp;&nbsp; 初学ArcEngine开发，看到这么多的类和接口有点让人望而生畏，不好好整理思路容易让人发晕，其实熟悉了ArcGIS各组件的功能，了解了各种操作的设计思路，拿着各种文档顺藤摸瓜，还是可以迅速进入开发角色的。整个SDK结构组成的分析留到后面，我们先学习一个最小的开发示例，例子来源于ArcEngine开发文档（HelloCentroid）。<br />
<br />
&nbsp;&nbsp;&nbsp; 例子的功能：<br />
<br />
&nbsp;&nbsp;&nbsp; 返回某shapefile文件第一个feature质心的坐标。<br />
<br />
&nbsp;&nbsp;&nbsp; 引用的包：<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.datasourcesfile.ShapefileWorkspaceFactory;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.geodatabase.</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.geometry.</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">;<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;com.esri.arcgis.system.</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">;</span></div>
<br />
&nbsp;&nbsp;&nbsp; 每个包的具体用途与功能先不管，以后的学习中会慢慢涉及到并加以分析。<br />
<br />
&nbsp;&nbsp;&nbsp; 从文件路径中捕获shapefile特征类：<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_91_519_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_91_519_Open_Text.style.display='none'; Codehighlighter1_91_519_Closed_Image.style.display='inline'; Codehighlighter1_91_519_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_91_519_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_91_519_Closed_Text.style.display='none'; Codehighlighter1_91_519_Open_Image.style.display='inline'; Codehighlighter1_91_519_Open_Text.style.display='inline';" alt="" style="display: none;" /><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;FeatureClass&nbsp;getShapefileFeatureClass(String&nbsp;path,&nbsp;String&nbsp;name)&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;IOException&nbsp;</span><span id="Codehighlighter1_91_519_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_91_519_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;FeatureClass&nbsp;featureClass&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);">null</span><span style="color: rgb(0, 0, 0);">;<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_135_388_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_135_388_Open_Text.style.display='none'; Codehighlighter1_135_388_Closed_Image.style.display='inline'; Codehighlighter1_135_388_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_135_388_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_135_388_Closed_Text.style.display='none'; Codehighlighter1_135_388_Open_Image.style.display='inline'; Codehighlighter1_135_388_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_135_388_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_135_388_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ShapefileWorkspaceFactory&nbsp;shapefileWorkspaceFactory&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;ShapefileWorkspaceFactory();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Workspace&nbsp;workspace&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(Workspace)&nbsp;shapefileWorkspaceFactory.openFromFile(path,&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;featureClass&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;FeatureClass(workspace.openFeatureClass(name));<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_415_494_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_415_494_Open_Text.style.display='none'; Codehighlighter1_415_494_Closed_Image.style.display='inline'; Codehighlighter1_415_494_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_415_494_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_415_494_Closed_Text.style.display='none'; Codehighlighter1_415_494_Open_Image.style.display='inline'; Codehighlighter1_415_494_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(IOException&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_415_494_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_415_494_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">Could&nbsp;not&nbsp;open&nbsp;shapefile:&nbsp;</span><span style="color: rgb(0, 0, 0);">&quot;</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;name);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);">&nbsp;ex;<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;featureClass;<br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp; 调用ShapefileWorkspaceFactory工厂类的对象的方法openFromFile，将指定的路径列为工作空间，然后打开工作空间中指定名称的特征类，参数传入FeatureClass的构造方法中，返回FeatureClass对象。<br />
<br />
&nbsp;&nbsp;&nbsp; ShapefileWorkspaceFactory工厂类除了可以返回指定的工作空间外，还可以创建、移动、复制工作空间，以及得到工作空间相关的基本信息。<br />
<br />
&nbsp;&nbsp;&nbsp; 在com.esri.arcgis.geodatabase包中可以找到Workspace类，它的方法有许多，涉及和工作空间相关的许多功能，例如连接到工作空间的数据库名称、用户名称，开始/停止编辑工作空间，创建和删除注记类、特征类、特征数据集、关联类，判断工作空间中某种操作能否执行，工作空间的基本信息，判断对象是否注册为版本等等。代码中所用到的openFeatureClass用于打开已存在的特征类并返回为IFeatureClass。<br />
<br />
&nbsp;&nbsp;&nbsp; FeatureClass类的构造方法接收workspace.openFeatureClass返回的参数，将对象的引用赋给featureClass对象并返回。<br />
<br />
&nbsp;&nbsp;&nbsp; 这个方法的核心应该关注Workspace类，它把握着Geodatabase数据的整体框架与功能导向，FeatureClass是Workspace组成部分，包含了FeatureClass特定的功能与方法。<br />
<br />
&nbsp;&nbsp;&nbsp; 得到特征类的质心位置：<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_85_785_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_85_785_Open_Text.style.display='none'; Codehighlighter1_85_785_Closed_Image.style.display='inline'; Codehighlighter1_85_785_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_85_785_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_85_785_Closed_Text.style.display='none'; Codehighlighter1_85_785_Open_Image.style.display='inline'; Codehighlighter1_85_785_Open_Text.style.display='inline';" alt="" style="display: none;" /><span style="color: rgb(0, 0, 255);">private</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;printFirstFeatureCentroid(FeatureClass&nbsp;featureClass)&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;IOException&nbsp;</span><span id="Codehighlighter1_85_785_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_85_785_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Get&nbsp;the&nbsp;first&nbsp;feature&nbsp;in&nbsp;the&nbsp;feature&nbsp;class.<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;IFeature&nbsp;feature&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;featureClass.getFeature(</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Get&nbsp;the&nbsp;shape&nbsp;of&nbsp;the&nbsp;feature,&nbsp;and&nbsp;if&nbsp;the&nbsp;shape&nbsp;is&nbsp;a&nbsp;polygon&nbsp;or&nbsp;ring,&nbsp;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;get&nbsp;its&nbsp;centroid&nbsp;by&nbsp;casting&nbsp;it&nbsp;to&nbsp;the&nbsp;interface&nbsp;common&nbsp;to&nbsp;both&nbsp;of&nbsp;them&nbsp;(IArea),<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;which&nbsp;interface&nbsp;defines&nbsp;the&nbsp;getCentroid&nbsp;method.<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;IGeometry&nbsp;shape&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;feature.getShape();<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_518_634_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_518_634_Open_Text.style.display='none'; Codehighlighter1_518_634_Closed_Image.style.display='inline'; Codehighlighter1_518_634_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_518_634_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_518_634_Closed_Text.style.display='none'; Codehighlighter1_518_634_Open_Image.style.display='inline'; Codehighlighter1_518_634_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</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);">(shape&nbsp;</span><span style="color: rgb(0, 0, 255);">instanceof</span><span style="color: rgb(0, 0, 0);">&nbsp;Polygon&nbsp;</span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);">&nbsp;shape&nbsp;</span><span style="color: rgb(0, 0, 255);">instanceof</span><span style="color: rgb(0, 0, 0);">&nbsp;Ring))&nbsp;</span><span id="Codehighlighter1_518_634_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_518_634_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">Feature's&nbsp;shape&nbsp;is&nbsp;neither&nbsp;a&nbsp;polygon&nbsp;nor&nbsp;a&nbsp;ring.&nbsp;&nbsp;No&nbsp;centroid&nbsp;available.</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">;<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;IArea&nbsp;area&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(IArea)&nbsp;shape;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;IPoint&nbsp;centroid&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;area.getCentroid();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">Centroid:&nbsp;</span><span style="color: rgb(0, 0, 0);">&quot;</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;centroid.getX()&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);">&quot;</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">&quot;</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;centroid.getY());<br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp; featureClass对象的getFeature(0)方法得到特征类中第一个feature，通过判断确定该feature为区或环，将该feature所对应的shape uppercast为IArea类型，由getCentroid方法得到area对象的质心点，getX()和getY()输出该点的坐标。IGeometry、IArea、IPoint都是com.esri.arcgis.geometry包中的接口，指定了不同的几何类型。由printFirstFeatureCentroid方法，我们可以扩展学习com.esri.arcgis.geometry包中典型接口的使用，例如示例中用到的接口，其包含的方法都很简单。<br />
<br />
&nbsp;&nbsp;&nbsp; main方法：<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_39_1000_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_39_1000_Open_Text.style.display='none'; Codehighlighter1_39_1000_Closed_Image.style.display='inline'; Codehighlighter1_39_1000_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_39_1000_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_39_1000_Closed_Text.style.display='none'; Codehighlighter1_39_1000_Open_Image.style.display='inline'; Codehighlighter1_39_1000_Open_Text.style.display='inline';" alt="" style="display: none;" /><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);">static</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;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_39_1000_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_39_1000_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_65_165_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_65_165_Open_Text.style.display='none'; Codehighlighter1_65_165_Closed_Image.style.display='inline'; Codehighlighter1_65_165_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_65_165_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_65_165_Closed_Text.style.display='none'; Codehighlighter1_65_165_Open_Image.style.display='inline'; Codehighlighter1_65_165_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(args.length&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);">2</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span id="Codehighlighter1_65_165_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_65_165_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">Usage:&nbsp;HelloCentroid&nbsp;shapefilePath&nbsp;shapefileName</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">Hello,&nbsp;Centroid!</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;AoInitialize&nbsp;aoInitializer&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);">null</span><span style="color: rgb(0, 0, 0);">;<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_252_775_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_252_775_Open_Text.style.display='none'; Codehighlighter1_252_775_Closed_Image.style.display='inline'; Codehighlighter1_252_775_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_252_775_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_252_775_Closed_Text.style.display='none'; Codehighlighter1_252_775_Open_Image.style.display='inline'; Codehighlighter1_252_775_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_252_775_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_252_775_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;EngineInitializer.initializeEngine();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;aoInitializer&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;AoInitialize();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;aoInitializer.initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;HelloCentroid&nbsp;thisApp&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;HelloCentroid();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"><br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;Get&nbsp;the&nbsp;feature&nbsp;class&nbsp;for&nbsp;the&nbsp;path&nbsp;and&nbsp;name&nbsp;specified,&nbsp;<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;and&nbsp;get&nbsp;its&nbsp;first&nbsp;feature's&nbsp;centroid.<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;FeatureClass&nbsp;featureClass&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;thisApp.getShapefileFeatureClass(args[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">],&nbsp;args[</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">]);<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_706_771_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_706_771_Open_Text.style.display='none'; Codehighlighter1_706_771_Closed_Image.style.display='inline'; Codehighlighter1_706_771_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_706_771_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_706_771_Closed_Text.style.display='none'; Codehighlighter1_706_771_Open_Image.style.display='inline'; Codehighlighter1_706_771_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(featureClass&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);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span id="Codehighlighter1_706_771_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_706_771_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thisApp.printFirstFeatureCentroid(featureClass);<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_802_871_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_802_871_Open_Text.style.display='none'; Codehighlighter1_802_871_Closed_Image.style.display='inline'; Codehighlighter1_802_871_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_802_871_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_802_871_Closed_Text.style.display='none'; Codehighlighter1_802_871_Open_Image.style.display='inline'; Codehighlighter1_802_871_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(IOException&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_802_871_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_802_871_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">App&nbsp;failed.</span><span style="color: rgb(0, 0, 0);">&quot;</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_883_998_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_883_998_Open_Text.style.display='none'; Codehighlighter1_883_998_Closed_Image.style.display='inline'; Codehighlighter1_883_998_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_883_998_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_883_998_Closed_Text.style.display='none'; Codehighlighter1_883_998_Open_Image.style.display='inline'; Codehighlighter1_883_998_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">finally</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_883_998_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_883_998_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_893_931_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_893_931_Open_Text.style.display='none'; Codehighlighter1_893_931_Closed_Image.style.display='inline'; Codehighlighter1_893_931_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_893_931_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_893_931_Closed_Text.style.display='none'; Codehighlighter1_893_931_Open_Image.style.display='inline'; Codehighlighter1_893_931_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_893_931_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_893_931_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aoInitializer.shutdown();<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_960_994_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_960_994_Open_Text.style.display='none'; Codehighlighter1_960_994_Closed_Image.style.display='inline'; Codehighlighter1_960_994_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_960_994_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_960_994_Closed_Text.style.display='none'; Codehighlighter1_960_994_Open_Image.style.display='inline'; Codehighlighter1_960_994_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(IOException&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_960_994_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_960_994_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp; 从前面的四行代码可以看出，java解释器运行该类文件编译后的字节码需要两个参数，一个是featureclass所在的路径，一个是该路径下featureclass名称。需要注意的是这三行代码：<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: rgb(0, 0, 0);">EngineInitializer.initializeEngine();<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" />aoInitializer&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;AoInitialize();<br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" />aoInitializer.initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);</span></div>
<br />
&nbsp;&nbsp;&nbsp; com.esri.arcgis.system.EngineInitializer.initializeEngine()，在原始AO组件和Java Class之间建立联系，如果要使用ArcGIS Visual JavaBeans进行图形操作，则应使用initializeVisualBeans静态方法进行初始化。aoInitializer对象决定不同的授权和扩展，ESRI License Product codes参考下列表：<br />
<p align="center"><img src="/images/blogjava_net/flyingis/ESRI-License-Product-codes.gif" border="0" height="181" alt="ESRI-License-Product-codes.gif" width="646" /></p>
<p align="left">&nbsp;&nbsp;&nbsp; Eclipse运行测试，需要在&quot;运行&quot;中输入两个&quot;自变量&quot;作为参数，采用ArcGIS自带的数据，分别为<br />
<br />
&nbsp;&nbsp;&nbsp; &quot;ArcGISHome\ArcTutor\Getting_Started\project\City_share\land&quot;、&quot;parcel_1&quot;<br />
<br />
&nbsp;&nbsp;&nbsp; 测试的结果，控制台输出为：<br />
<br />
&nbsp;&nbsp;&nbsp; Hello, Centroid!<br />
&nbsp;&nbsp;&nbsp; Centroid: 479049.62060511723, 3771922.345004217<br />
<br />
&nbsp;&nbsp;&nbsp; 这个例子描述了一个最简单AE开发的整个过程，从初始化、授权，到Workspace类、FeatureClass类方法，到com.esri.arcgis.geometry包中典型接口的使用，最后得到我们需要的结果，过程清晰明了，初学者可以通过这个例子顺藤摸瓜，敲开AE开发的大门，说的有点玄乎:)</p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58471#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 Mar 2007 16:21:00 +0800</pubDate>
        <link>http://gis.javaeye.com/blog/58471</link>
        <guid>http://gis.javaeye.com/blog/58471</guid>
      </item>
      <item>
        <title>ArcGIS 坐标系统文件</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58472" style="color:red;">http://gis.javaeye.com/blog/58472</a>&nbsp;
          发表时间: 2007年03月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; 作者：<a href="/flyingis" target="_blank">Flyingis</a><br />
<br />
&nbsp;&nbsp;&nbsp; 坐标是GIS数据的骨骼框架，能够将我们的数据定位到相应的位置，为地图中的每一点提供准确的坐标。<br />
<br />
&nbsp;&nbsp;&nbsp; ArcGIS自带了多种坐标系统，在${ArcGISHome}\Coordinate Systems\目录下可以看到三个文件夹，分别是Geographic Coordinate Systems、Projected Coordinate Systems、Vertical Coordinate Systems，中文翻译为地理坐标系、投影坐标系、垂直坐标系。<br />
<br />
<p align="center"><img src="/images/blogjava_net/flyingis/coordinate-system.gif" border="0" height="408" alt="coordinate-system.gif" width="638" /></p>
&nbsp;&nbsp;&nbsp; 关于地理坐标系和投影坐标系的区别，网络上有相关的文章介绍－－<a href="http://www.cnblogs.com/jetz/archive/2005/03/29/127547.html" target="_blank">地理坐标系与投影坐标系的区别</a>，简而言之，投影坐标系＝地理坐标系＋投影过程。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>1 Geographic Coordinate Systems</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 在Geographic Coordinate Systems目录中，我们可以看到已定义的许多坐标系信息，典型的如Geographic Coordinate Systems\World目录下的WGS 1984.prj，里面所定义的坐标参数：<br />
<br />
&nbsp;&nbsp;&nbsp; GEOGCS[&quot;GCS_WGS_1984&quot;,DATUM[&quot;D_WGS_1984&quot;,SPHEROID[&quot;WGS_1984&quot;,6378137,298.257223563]],PRIMEM[&quot;Greenwich&quot;,0],UNIT[&quot;Degree&quot;,0.017453292519943295]]<br />
<br />
&nbsp;&nbsp;&nbsp; 里面描述了地理坐标系的名称、大地基准面、椭球体、起始坐标参考点、单位等。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>2 Projected Coordinate Systems</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 在Projected Coordinate Systems目录中同样存在许多已定义的投影坐标系，我国大部分地图所采用的北京54和西安80坐标系的投影文件就在其中，它们均使用高斯-克吕格投影，前者使用克拉索夫斯基椭球体，后者使用国际大地测量协会推荐的IAG 75地球椭球体。如Beijing 1954 3 Degree GK CM 75E.prj定义的坐标参数：<br />
<br />
&nbsp;&nbsp;&nbsp; PROJCS[&quot;Beijing_1954_3_Degree_GK_CM_75E&quot;,GEOGCS[&quot;GCS_Beijing_1954&quot;,DATUM[&quot;D_Beijing_1954&quot;,SPHEROID[&quot;Krasovsky_1940&quot;,6378245.0,298.3]],PRIMEM<br />
[&quot;Greenwich&quot;,0.0],UNIT[&quot;Degree&quot;,0.0174532925199433]],PROJECTION[&quot;Gauss_Kruger&quot;],PARAMETER[&quot;False_Easting&quot;,500000.0],PARAMETER<br />
[&quot;False_Northing&quot;,0.0],PARAMETER[&quot;Central_Meridian&quot;,75.0],PARAMETER[&quot;Scale_Factor&quot;,1.0],PARAMETER[&quot;Latitude_Of_Origin&quot;,0.0],UNIT[&quot;Meter&quot;,1.0]]<br />
<br />
&nbsp;&nbsp;&nbsp; 可以看出，参数里除了包含地理坐标系的定义外，还有投影方式的信息。<br />
<br />
&nbsp;&nbsp;&nbsp; 北京54和西安80是我们使用最多的坐标系，在ArcGIS文件中，对于这两种坐标系统的命名有一些不同，简单看去很容易让人产生迷惑。在此之前，先简单介绍高斯-克吕格投影的基本知识，了解就直接跳过，我国大中比例尺地图均采用高斯-克吕格投影，其通常是按6度和3度分带投影，1:2.5万－1:50万比例尺地形图采用经差6度分带，1:1万比例尺的地形图采用经差3度分带。具体分带法是：6度分带从本初子午线开始，按经差6度为一个投影带自西向东划分，全球共分60个投影带，带号分别为1－60；3度投影带是从东经1度30秒经线开始，按经差3度为一个投影带自西向东划分，全球共分120个投影带。为了便于地形图的测量作业，在高斯-克吕格投影带内布置了平面直角坐标系统，具体方法是，规定中央经线为X轴，赤道为Y轴，中央经线与赤道交点为坐标原点，x值在北半球为正，南半球为负，y值在中央经线以东为正，中央经线以西为负。由于我国疆域均在北半球，x值均为正值，为了避免y值出现负值，规定各投影带的坐标纵轴均西移500km，中央经线上原横坐标值由0变为500km。为了方便带间点位的区分，可以在每个点位横坐标y值的百千米位数前加上所在带号，如20带内A点的坐标可以表示为Y<sub>A</sub>=20 745 921.8m。<br />
<br />
&nbsp;&nbsp;&nbsp; 在Coordinate Systems\Projected Coordinate Systems\Gauss Kruger\Beijing 1954目录中，我们可以看到四种不同的命名方式：<br />
<br />
&nbsp;&nbsp;&nbsp; Beijing 1954 3 Degree GK CM 75E.prj<br />
&nbsp;&nbsp;&nbsp; Beijing 1954 3 Degree GK Zone 25.prj<br />
&nbsp;&nbsp;&nbsp; Beijing 1954 GK Zone 13.prj<br />
&nbsp;&nbsp;&nbsp; Beijing 1954 GK Zone 13N.prj<br />
<br />
&nbsp;&nbsp;&nbsp; 对它们的说明分别如下：<br />
<br />
&nbsp;&nbsp;&nbsp; 三度分带法的北京54坐标系，中央经线在东75度的分带坐标，横坐标前不加带号<br />
&nbsp;&nbsp;&nbsp; 三度分带法的北京54坐标系，中央经线在东75度的分带坐标，横坐标前加带号<br />
&nbsp;&nbsp;&nbsp; 六度分带法的北京54坐标系，分带号为13，横坐标前加带号<br />
&nbsp;&nbsp;&nbsp; 六度分带法的北京54坐标系，分带号为13，横坐标前不加带号<br />
<br />
&nbsp;&nbsp;&nbsp; 在Coordinate Systems\Projected Coordinate Systems\Gauss Kruger\Xian 1980目录中，文件命名方式又有所变化：<br />
<br />
&nbsp;&nbsp;&nbsp; Xian 1980 3 Degree GK CM 75E.prj<br />
&nbsp;&nbsp;&nbsp; Xian 1980 3 Degree GK Zone 25.prj<br />
&nbsp;&nbsp;&nbsp; Xian 1980 GK CM 75E.prj<br />
&nbsp;&nbsp;&nbsp; Xian 1980 GK Zone 13.prj<br />
<br />
&nbsp;&nbsp;&nbsp; 西安80坐标文件的命名方式、含义和北京54前两个坐标相同，但没有出现&ldquo;带号+N&rdquo;这种形式，为什么没有采用统一的命名方式？让人看了有些费解。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>3 Vertical Coordinate Systems</strong><br />
<br />
&nbsp;&nbsp;&nbsp; Vertical Coordinate Systems定义了测量海拔或深度值的原点，具体的定义，英文描述的更为准确：<br />
<br />
&nbsp;&nbsp;&nbsp; A vertical coordinate system defines the origin for height or depth values. Like a horizontal coordinate system, most of the information in a vertical coordinate system is not needed unless you want to display or combine a dataset with other data that uses a different vertical coordinate system.<br />
<br />
&nbsp;&nbsp;&nbsp; Perhaps the most important part of a vertical coordinate system is its unit of measure. The unit of measure is always linear (e.g., international feet or meters). Another important part is whether the z values represent heights (elevations) or depths. For each type, the z-axis direction is positive &quot;up&quot; or &quot;down&quot;, respectively. <br />
<br />
&nbsp;&nbsp;&nbsp; One z value is shown for the height-based mean sea level system. Any point that falls below the mean sea level line but is referenced to it will have a negative z value. The mean low water system has two z values associated with it. Because the mean low water system is depth-based, the z values are positive. Any point that falls above the mean low water line but is referenced to it will have a negative z value.<br />
<br />
&nbsp;&nbsp;&nbsp; 需要注意的是，大家经常希望能够通过坐标转换，将北京54或西安80中的地理坐标系转换到WGS84，实际上这样做是不准确的，北京54或西安80的投影坐标可以通过计算转换到其对应的地理坐标系，但由于我国北京54和西安80中的地理坐标系到WGS84的转换参数没有公开，因此无法完成其到WGS84坐标的精准计算。其他公开了转换参数的坐标系都可以在ArcToolbox中完成转换。<br />
<br />
&nbsp;&nbsp;&nbsp; 参考资料：<br />
<br />
&nbsp;&nbsp;&nbsp; 蔡孟裔等.新编地图学教程.高等教育出版社<br />
&nbsp;&nbsp;&nbsp; ArcGIS 9.2 Desktop Help<br />
<br />
&nbsp;&nbsp;&nbsp; 感谢<a href="http://bbs.esrichina-bj.cn/ESRI/index.php" target="_blank">ESRI中国社区</a>版主isnotnull的帮助</font>
          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58472#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 02 Mar 2007 09:04:00 +0800</pubDate>
        <link>http://gis.javaeye.com/blog/58472</link>
        <guid>http://gis.javaeye.com/blog/58472</guid>
      </item>
      <item>
        <title>地震为什么没有影响到 Google</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58473" style="color:red;">http://gis.javaeye.com/blog/58473</a>&nbsp;
          发表时间: 2007年01月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" face="Verdana">原文链接：<a href="http://news.mydrivers.com/pages/20070120074305_14081.htm" target="_blank">http://news.mydrivers.com/pages/20070120074305_14081.htm</a><br />
<br />
2006年底，台湾海域地震，让人们深刻感觉到互联网的脆弱。在这次地震中，中美海缆、亚太一号、亚太二号海缆、FLAG海缆、亚欧海缆、FNAL海缆等多条国际海底通信光缆中断。一时间，台湾，韩国，日本，菲律宾，甚至印度的呼叫中心都受牵连；中国用户几乎无法访问所有的美国网站以及网络服务，有些网站虽然可以勉强登入，但速度也让人无法忍受。<br />
<br />
不过，与平时经常被&ldquo;屏蔽&rdquo;相反，Google在此期间几乎没有受到影响，搜索引擎、Gmail以及Google旗下的其他服务都能够在国内正常访问。<br />
<br />
事实上，连接中国与亚洲、美国以及欧洲的电缆有多个系统。台湾地震只损害了一部分海底电缆，但并不是所有的电缆都出现了问题。这个时间段内，从中国接入国际互联网的服务，就取决于提供该服务的这个互联网公司或者ISP购买的是哪些电缆系统，在地震中是否受到损害。<br />
<br />
不过，还有另外一种情况存在：一些国际连接虽然没有受到地震的影响，但是过多地负载了从其它损害的电缆转道而来的信息流量，导致交通堵塞。<br />
<br />
Google使用了多网络连接系统，如果某个数据中心出了访问障碍，系统会自动选择其它的网络路径，由其它数据中心无缝地提供服务。<br />
<br />
在设计和实施时，Google在中国的服务网络充分考虑了冗余要求，不会因为其它线路的拥挤而变得缓慢。因此，Google中国用户感觉不到任何地震引起的变化。<br />
<br />
为什么Google成为此次地震事件中的特例？<br />
<br />
时间追溯到2002年2月，Google的一个数据中心的主电源跳闸，导致Google瘫痪了将近1个小时。有了这次教训，Google便彻底改变了自己的文件系统分布。<br />
<br />
改进后的Google文件分布系统，即便一个拥有80台电脑的支架被断开连接，也能迅速完成再一次的备份，而且，并不中断正常的服务。实际上，按照霍茨勒的说法，Google的&ldquo;每台服务器都有50个备份&rdquo;。除此之外，多网络连接模式应用，也为服务稳定提供了有效的硬件基础。</font>
          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58473#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 20 Jan 2007 14:54:00 +0800</pubDate>
        <link>http://gis.javaeye.com/blog/58473</link>
        <guid>http://gis.javaeye.com/blog/58473</guid>
      </item>
      <item>
        <title>shapefile 和 MapGIS 文件格式之间的转换</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58474" style="color:red;">http://gis.javaeye.com/blog/58474</a>&nbsp;
          发表时间: 2007年01月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; 作者：<a href="/flyingis/" target="_blank">Flyingis</a><br />
<br />
&nbsp;&nbsp;&nbsp; 这篇文章比较老了，还是在ArcGIS 8.3平台下做的，这段时间一些朋友经常问到这个问题，现在大家早已进入ArcGIS 9.x时代，但还是可以参考一下，是否适用尚不知道，如有什么变化，欢迎大家写在后面分享一下经验。<br />
<br />
&nbsp;&nbsp;&nbsp; 假如在ArcGIS中存在一个Coverage图层cover，只包含线的信息没有点，我们用 ArcTools先将它转换为E00格式，命名为 cover.e00，在用MapGIS65的文件转换模块将E00文件转换为MapGIS自己默认的格式WL、WP，这时，原来的一个文件在 MapGIS 中就变成了两个，分别是点文件和线文件，经过一些匹配定位等处理后，我们将WL、WP文件重新转换为E00格式，但是在MapGIS中不能同时将点文件和线文件都转换为同一E00文件，所以就出现了cover_l.e00和cover_p.e00两个文件，在 ArcTools中转换为Coverage格式，也是两个文件。这时问题出现了，我们需要将两个Coverage文件合并，一般来说步骤很简单，但是这里却不能完成合并，因为，原始的cover图层根本就不存在点文件，在MapGIS转换过程中自动生成了一个WP点文件，而实际上这个点文件也是空的，所以将两个Coverage文件合并，如果有一个是空信息文件，将不能完成合并，本来那个空图层就是多余的，没有任何实际用途，干脆将其舍去，不会丢失任何信息，至于为什么MapGIS65会自动产生一个点文件，为什么不产生区（WT）文件呢？我就不清楚了。还有就是ArcGIS Workstation 8.3 中图层命名的最大长度不能超过13位，否则不能保存！不知道9中怎样，好像也是一样的吧。<br />
<br />
&nbsp;&nbsp;&nbsp; 顺便说一下，在将MapGIS的区文件WT转换为Coverage的时候，首先要用MapGIS编辑子系统中的其它--&gt;生成Label点文件（WP），然后分别将原来的区文件和后面生成的点文件转换为shapefile，再转为Coverage格式，在Workstation中打开点文件，在arc编辑状态下get线文件，即原始区文件转为Coverage后的文件，最后重新拓扑 clean并且save，这样才能保存完整的原始图层信息。是麻烦了一点，但是我也只知道这种办法，如果有其它方法希望和大家讨论。现在GIS数据格式都没有一个标准，不同软件的数据格式之间的转换的确存在很多问题，什么时候能有真正的标准出现呢？</font>
<pre>		</pre>
          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58474#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 19 Jan 2007 09:17:00 +0800</pubDate>
        <link>http://gis.javaeye.com/blog/58474</link>
        <guid>http://gis.javaeye.com/blog/58474</guid>
      </item>
      <item>
        <title>全套 ArcGIS 软件安装（Windows 平台）</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58475" style="color:red;">http://gis.javaeye.com/blog/58475</a>&nbsp;
          发表时间: 2007年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;作者：</font> 		<a href="/flyingis/" target="_blank"> 				<font size="2" face="Verdana">Flyingis</font> 		</a> 		<br />
<br />
<font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; 最近将ArcGIS主要的几个软件重新安装了一次，虽然全部都是在Windows平台下完成的，但过程中还是碰到一些问题，可惜安装过程中没有将关键的步骤截屏，只能在这里简单记录一下。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>Oracle 安装</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 最开始准备安装Oracle10gR2，但是安装文件出了问题没有安装成功，还是老老实实折腾到常用的Oracle9iR2下，具体的版本号是9.2.0.1。我准备安装SDE9.2，ESRI推荐的Oracle安装版本是9.2.0.7，但最后发现在9.2.0.1下没有任何问题。大家在搭建应用的时候，建议先到ESRI官方网站上去看看各种软件的系统需求，毕竟这样比较保险。<br />
<br />
&nbsp;&nbsp;&nbsp; Oracle安装是个老生常谈的话题，在Google中搜索总是会发现海量的搜索结果向你扑来，不管是新手还是老鸟，不管是在Unix、Linux还是Windows，时常会碰到这样那样的安装问题，如监听器没有运行起来，Net Configuration没有正常配置，OMS无法登陆，没有办法了就重新安装，注意最好是先停掉所有Oracle相关服务再卸载，特别是准备重新安装不同版本的Oracle时。具体如何在各种平台下装Oracle有许多专门的帖子可以参考，为SDE做准备我们需要注意以下问题：<br />
<br />
&nbsp;&nbsp;&nbsp; 1.为SDE专门创建一个表空间，大小不小于400M。<br />
&nbsp;&nbsp;&nbsp; 2.为SDE数据库用户增加Resource权限。<br />
&nbsp;&nbsp;&nbsp; 3.记录作为空间数据库的SID，在D:\oracle\ora92\network\ADMIN目录下可以找到相应的tnsnames.ora配置文件。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>ArcGIS Desktop 安装</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 这个过程就比较简单了，先插上软件锁，再安装Desktop Administrator，输入授权文件，最后安装软件，按照提示一步步完成即可。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>ArcIMS 安装</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 自从9.0版本以后，ArcIMS安装的成功率就大大提高，只需要按照规定的步骤完成就行了，作为IIS+Servlet的配置，安装过程如下：<br />
<br />
&nbsp;&nbsp;&nbsp; 1.安装JRE，版本最好在1.4.0.6以上，否则有些功能会因此安装不全。<br />
&nbsp;&nbsp;&nbsp; 2.机器上配置好IIS，版本要求IIS5.1以上。<br />
&nbsp;&nbsp;&nbsp; 3.安装ServletExec,在ArcIMS9.2中有两个文件，分别是ServletExec_ISAPI_50013和ServletExec_AS_50013，后者可以在不需要IIS的环境下单独运行，这个我没有试过，一般我安装的是前者，安装过程中要求输入管理员帐号和密码，整套系统的安装多处需要输入密码，自己开发研究可以统一这些帐号。<br />
&nbsp;&nbsp;&nbsp; 4.正式安装，一步步往下走，最后能通过Diagostics两步测试就行了。<br />
<br />
&nbsp;&nbsp;&nbsp; 大家看了这些安装步骤就知道是在.net平台下进行二次开发了，至于Java平台下ArcIMS二次开发，可以参考这篇文章，图文并茂，比较详细，Web服务器和Servlet容器的配置为Apache2.0.52+Tomcat5.5.4+JDK5.0：<br />
&nbsp;&nbsp;&nbsp; </font> 		<a href="http://www.info-collect.com/post/254.html"> 				<font size="2" face="Verdana">http://www.info-collect.com/post/254.html</font> 		</a> 		<br />
<br />
<font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; <strong>ArcSDE for Oracle9i 安装</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 这两篇文章讲的比较详细：<br />
&nbsp;&nbsp;&nbsp; </font> 		<a href="http://www.gissky.cn/blog-113.html"> 				<font size="2" face="Verdana">http://www.gissky.cn/blog-113.html</font> 		</a> 		<br />
<font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; </font> 		<a href="http://blog.csdn.net/fengfeiyang/archive/2005/12/14/552478.aspx"> 				<font size="2" face="Verdana">http://blog.csdn.net/fengfeiyang/archive/2005/12/14/552478.aspx</font> 		</a> 		<br />
<br />
<font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; <strong>ArcGIS Server 安装</strong><br />
<br />
&nbsp;&nbsp;&nbsp; ArcGIS Server 9.2之前的安装过程可以参考：<br />
&nbsp;&nbsp;&nbsp; </font> 		<a href="http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3891&amp;extra=page%3D1"> 				<font size="2" face="Verdana">http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=3891&amp;extra=page%3D1</font> 		</a> 		<br />
<br />
<font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; 据说ArcGIS Server 9.2中不再需要调整Windows自带防火墙的设置，但我还是按照上述方法将端口和程序添加到了例外中。如果大家觉得ArcGISSOC、ArcGISSOM、ArcGISWebServices这些用户名太多太麻烦，可以将这些帐号统一归纳为一个帐号，添加agsadmin、agsusers、administrator权限。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>ArcEngine 安装</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 安装过程就是加入运行时环境、控件动态链接库，还有VS2005/Java帮助文档，按照提示进行就能完成。</font> 		<font size="2" face="Verdana"> 				<br />
<br />
&nbsp;&nbsp;&nbsp; Windows平台下安装软件，最容易出问题的地方是服务产品的配置，当认为自己每一个环节都没有问题，最后还是不能正常使用时，在干净的系统上重装是个最笨的好办法。</font>
          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58475#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 17 Jan 2007 15:03:00 +0800</pubDate>
        <link>http://gis.javaeye.com/blog/58475</link>
        <guid>http://gis.javaeye.com/blog/58475</guid>
      </item>
      <item>
        <title>GeoTools 2.3.0 release available for download</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58476" style="color:red;">http://gis.javaeye.com/blog/58476</a>&nbsp;
          发表时间: 2007年01月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" face="Verdana">2 January 2007 - GeoTools 2.3.0 release brings together a lot of great improvements made over the last year. The main focus of this release is improving the raster story for GeoTools. While plug-ins for a variety of rasters existed previously, all of them were memory constrained and not really suitable for real software.<br />
<br />
GeoTools 2.3.0 is available for download at:<br />
<a href="http://geotools.codehaus.org/2.3.0" target="_blank">http://geotools.codehaus.org/2.3.0</a><br />
<br />
2.3.0 brings solid, scalable, fast support for ArcGrid, GeoTiff, GTOPO30, World Images and Image Mosaics and Pyramids. These are already in action in GeoServer 1.5.x, and will soon work their way into uDig (http://udig.refractions.net). In addition it offers:<br />
<br />
- GeoAPI filter interfaces aligned with Filter 1.1 specification<br />
- Completed providence review<br />
- More relaxed PostGIS support, able to handle older varied configurations<br />
- Scalar Vector Graphics &quot;Marks&quot; can be used as part of our SLD support<br />
- Improved plug-in visibility<br />
- Maven &quot;archtype&quot; <br />
- Numerous small bug fixes and improvements<br />
<br />
The following organizations, have contributed to this stable release: GeoSolutions </font> 		<a href="http://sourceforge.net/forum/forum.php?forum_id=648224" target="_blank"> 				<font size="2" face="Verdana">http://sourceforge.net</font> 		</a> 		<br />
<br />
<font size="2" face="Verdana">From : </font> 		<a href="http://www.gisdevelopment.net/news/viewn.asp?id=GIS:N_axrmhogkef"> 				<font size="2" face="Verdana">http://www.gisdevelopment.net/news/viewn.asp?id=GIS:N_axrmhogkef</font> 		</a>
          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58476#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 10 Jan 2007 22:25:00 +0800</pubDate>
        <link>http://gis.javaeye.com/blog/58476</link>
        <guid>http://gis.javaeye.com/blog/58476</guid>
      </item>
      <item>
        <title>静态设计</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58477" style="color:red;">http://gis.javaeye.com/blog/58477</a>&nbsp;
          发表时间: 2006年12月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; 作者：<a href="/flyingis" target="_blank">Flyingis</a><br />
<br />
&nbsp;&nbsp;&nbsp; 在我们系统设计中，类方法的功能设计一般是改变对象的状态，以及返回对象的信息。然而在这两种情况之外，还存在一种类型的方法，其设计目的，是专为系统提供某种特定的功能，作为系统专用的一种工具，有的书上称之为&ldquo;工具方法&rdquo;，一般情况下，我们会将这类方法设计成静态的，保证系统中所有的代码都可以使用它。在Java API中，最典型的例子之一是java.lang.Math类，它的所有变量、方法都是静态的，专为数学计算而设计。<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;PI;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">类变量，代表圆周率</span><span style="color: rgb(0, 128, 0);"><br />
<img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;abs(</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;a);&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">类方法，取双精度浮点类型参数的绝对值</span></div>
<br />
&nbsp;&nbsp;&nbsp; 经过关键字static修饰后，对象中的实例变量或实例方法就成为了类变量、类方法，使用静态的好处是，在代码中，我们可以不用创建对象而直接使用类变量和类方法，这样可以简化我们的代码，减少系统的内存开销。例如，在多处需要使用这些方法所提供的功能时，如果使用实例方法，就需要我们创建多个对象来调用这些方法，对于一个规模庞大的系统来说，这通常是不理智的，使用静态方法，可以保证该静态方法仅会存在于系统内存中的一个地址段内。从这里也可以看出，静态方法内应该尽量使用类变量代替实例变量，否则在多次调用静态方法的过程中，会创建多个实例变量，增加系统占用的内存空间。<br />
<br />
&nbsp;&nbsp;&nbsp; Java虚拟机第一次加载类的时候，会初始化静态的代码块，这和实例变量和实例方法的加载时间不一样。静态的代码可以存放在一个static代码块中，在类加载的时候一起初始化，但是在static代码块中不能抛出异常：<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_7_89_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_7_89_Open_Text.style.display='none'; Codehighlighter1_7_89_Closed_Image.style.display='inline'; Codehighlighter1_7_89_Closed_Text.style.display='inline';" alt="" /><img src="/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_7_89_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_7_89_Closed_Text.style.display='none'; Codehighlighter1_7_89_Open_Image.style.display='inline'; Codehighlighter1_7_89_Open_Text.style.display='inline';" alt="" style="display: none;" /><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_7_89_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_7_89_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;java.lang.Math.random();<br />
<img src="/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;time&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;System.currentTimeMillis();<br />
<img src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp; 现在来理解&ldquo;静态&rdquo;，简而言之，就是一旦在系统中生成，其地址就不再改变的变量或方法，因此，静态设计可以为我们提供如下方便：<br />
<br />
&nbsp;&nbsp;&nbsp; 1.简化或优化代码。<br />
&nbsp;&nbsp;&nbsp; 2.减少系统的内存开销。<br />
&nbsp;&nbsp;&nbsp; 3.分离出系统中的工具类。<br />
<br />
&nbsp;&nbsp;&nbsp; 世上少有鱼与熊掌兼得得事，如果漫无目的地使用静态，也会出现一些意外情况。<br />
<br />
&nbsp;&nbsp;&nbsp; 静态变量在内存中只会存在一份拷贝，而静态设计的目的之一是要为系统提供一系列通用的工具，因此所有的代码都可以对静态变量进行访问或改变它的值，这样容易使设计者对当前变量所存储的值产生疑惑，不知道是谁动了我的&ldquo;奶酪&rdquo;。<br />
<br />
&nbsp;&nbsp;&nbsp; 如果在程序上面静态导入相应的包、类，在程序中可以不使用类名，这样会给代码阅读者带来混淆。静态导入的格式：<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;com.sun.staticClassTools.CommonTool;</span></div>
<br />
&nbsp;&nbsp;&nbsp; 静态变量（类变量）的生命周期是从类的第一次加载到应用程序的结束，使用静态变量存储集合通常会带来巨大的内存开销，因为Java垃圾回收不会回收在以静态方式存在的集合对象，直到应用程序终止，哪怕这些集合对象已经不再使用。<br />
<br />
&nbsp;&nbsp;&nbsp; 静态设计违反OO设计原则，它是非面向对象的，类似于C语言中的全局函数，以过程的思想处理我们的代码。<br />
<br />
&nbsp;&nbsp;&nbsp; 因此，过度的静态设计会给我们的程序带来包括内存泄漏在内的多种问题，一般情况下，如果可以不使用静态，应该尽量避免，保证系统中的每一处静态设计都有其明确的存在的意义。</font>
          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58477#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Dec 2006 16:16:00 +0800</pubDate>
        <link>http://gis.javaeye.com/blog/58477</link>
        <guid>http://gis.javaeye.com/blog/58477</guid>
      </item>
      <item>
        <title>初学 Eclipse RCP</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58478" style="color:red;">http://gis.javaeye.com/blog/58478</a>&nbsp;
          发表时间: 2006年12月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; 作者：<a href="/flyingis" target="_blank">Flyingis</a><br />
<br />
&nbsp;&nbsp;&nbsp; 以前一直做WebGIS方面的工作，对桌面关心甚少。桌面开发让人第一个想到的是VB6的快速开发，以及VC++平台中对效率的追求，VB.NET似乎找不到一个合适的定位。自己以后想逐步转向桌面，毕竟桌面才是GIS的天下，在效率、可扩展性、开发速度以及平台可持续发展中权衡，让我选择了Eclipse RCP。<br />
<br />
&nbsp;&nbsp;&nbsp; 说向桌面转型而选择Eclipse RCP有些片面，因为桌面开发仅仅是Eclipse RCP开发的一个子集，用Eclipse RCP进行Web开发同样可以。Eclipse RCP是一个基础应用平台，在这个平台上，我们可以方便的扩展自己的应用、快速开发自己的程序、统一应用程序的界面等等，按照官方的话来说，Eclipse RCP开发的特点在于：<br />
<br />
&nbsp;&nbsp;&nbsp; 1.组件式的架构：所有的业务功能都可以设计为可以重用的插件，插件之间的相互访问与重组，就构成了系统的业务模块。其中最典型的应用，就是通过插件来增强Eclipse Java IDE的功能。<br />
<br />
&nbsp;&nbsp;&nbsp; 2.将程序关注的重点集中在业务领域：Eclipse RCP本身就基于Eclipse插件体系结构，基于这个统一的架构，程序员可以很方便的开发出自己的客户端应用，将主要精力放在业务逻辑的实现。<br />
<br />
&nbsp;&nbsp;&nbsp; 3.适应需求的变化：Eclipse就是由插件搭建而成的，通过增减插件，我们可以很容易的实现业务功能的变更。为Eclipse加入中文包就是最好的例子，通过.link文件对中文包文件的引用，可以实现Eclipse的中文本地化，当我们需要将语言恢复为英文时，只需删除对应的.link文家即可。<br />
<br />
&nbsp;&nbsp;&nbsp; Eclipse体系的核心是插件，3.0版本以后Eclipse开始采用OSGI作为其插件体系结构实现的基础，OSGI是一套开放的标准，这样可以增强网络范围内的互操作性，每个Eclipse插件就是一个OSGI的模块。OSGI模块中最重要的是Bundle和Service，Bundle是插件管理器，Service是这个模块可以暴露对外的服务对象。每个Bundle拥有自己的ClassLoader以及context，通过context可进行服务的注册、卸载等。启动时Eclipse核心会检查所有的插件并注册，但是直到被调用，该插件才会被实例化，这个过程就是懒加载。<br />
<br />
&nbsp;&nbsp;&nbsp; 在OSGI之上的是Runtime，它提供了Application模型和扩展机制。<br />
<br />
&nbsp;&nbsp;&nbsp; 和OSGI框架和JVMs一样，Eclipse Runtime需要知道做什么。运行Eclipse，首先需要构建一个Application，它和Java程序中的main方法类似，Runtime启动后，程序需要找到指定的Application，Application通过扩展来定义，该扩展指定一个类（扩展点）作为主程序的入口。Application必须实现IplatformRunable接口，由此接口提供的run方法接管Eclipse平台的控制权，当Application结束时，Eclipse平台也会退出。<br />
<br />
&nbsp;&nbsp;&nbsp; Products运行于Application之上，它主要提供典型应用程序的基本界面的实现，例如闪屏、windows图标等。一个Eclipse安装中可能存在多个Application和Product，但是在同一时刻只能运行一个Application和一个Product。<br />
<br />
&nbsp;&nbsp;&nbsp; 各种插件添加到Eclipse RCP是通过扩展来实现的，扩展的创建必须遵循扩展点（Extension Point）定义的规范进行明确的声明，我们可以使用Eclipse提供的现成的扩展点，还可以定义新的扩展点，并在此基础上进行扩展。Eclipse平台上常见的扩展点有：actionSets、editor、popUpMenu、views、perspectives、propertyPages等等。<br />
<br />
&nbsp;&nbsp;&nbsp; 关于Eclipse中的插件类型：<br />
<br />
&nbsp;&nbsp;&nbsp; Eclipse是各种插件的集合，但总体而言，插件开发有两种提供方式，一种是插件集构建的应用，拥有自己的程序入口，如Eclipse平台在Windows下通过点击eclipse.exe可以进入。另一种是以扩展的方式提供的插件集，它们通常不是完整的，也没有自己的程序入口，仅用以加入到已存在的平台中进行辅助性的开发，如GEF、EMF、CDT等。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 参考资料：<br />
<br />
&nbsp;&nbsp;&nbsp; 《Eclipse Rich Client Platform:Designing,Coding,and Packaging Java<sup>TM</sup> Applications》<br />
&nbsp;&nbsp;&nbsp; 《程序员》2006年5月刊<br />
&nbsp;&nbsp;&nbsp; <a href="http://www.eclipseworld.org/">http://www.eclipseworld.org/</a></font>
          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58478#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 13 Dec 2006 19:22:00 +0800</pubDate>
        <link>http://gis.javaeye.com/blog/58478</link>
        <guid>http://gis.javaeye.com/blog/58478</guid>
      </item>
      <item>
        <title>乱谈 GIS 中小型应用</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58479" style="color:red;">http://gis.javaeye.com/blog/58479</a>&nbsp;
          发表时间: 2006年11月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2" face="Verdana">&nbsp;&nbsp;&nbsp; 作者：<a href="/flyingis/" target="_blank">Flyingis</a><br />
<br />
&nbsp;&nbsp;&nbsp; 半月前<a href="http://www.esri.com/" target="_blank">ESRI</a>在ESRI中国用户大会上发布了ArcGIS9.2系列产品，自己因为出差的原因错过了这次大会，刚刚看到<a href="/zkjbeyond/" target="_blank">zkjbeyond</a>写的《<a href="/zkjbeyond/archive/2006/11/17/81869.html?Pending=true#Post" target="_blank">说说ArcGISServer9.2</a>》，道出了ESRI产品现在的软肋，但是作为业界的老大，其数据格式和市场份额具有不可撼动的地位，即使在中国这个特殊的市场，有着政府对国产GIS软件（MapGIS、SuperMap等）的强力支持，也丝毫没有动摇ESRI在中国的影响力。<br />
<br />
&nbsp;&nbsp;&nbsp; ESRI目前的拳头产品是ArcEngine和ArcSDE，今后的目标是ArcGIS Server，ESRI的风格就是要把产品做大做全，中国的企业用户也爱买大买全，其实国内不少项目根本用不着ArcEngine+ArcIMS+ArcSDE+Oracle这种豪华配置，不仅浪费财力，还要相当的人力资源。（感兴趣的朋友可以参考一下ESRI9.0系列产品的<a href="http://www.gis8.net/Article/arcgis/200611/376.htm" target="_blank">官方报价</a>）<br />
<br />
&nbsp;&nbsp;&nbsp; 目前国内应用中，不少MIS+WebGIS的系统，如果采用Java平台，<a href="http://docs.codehaus.org/display/GEOS/Home" target="_blank">GeoServer</a>+Java Web开发框架+其他相关开源软件的配置就足够了。也许有人会对开源GIS软件没有信心，毕竟现在应用的少，但是Java企业级应用不正是在开源的支持下开展的如火如荼么，就我对ArcIMS的认识来看，速度可以，但在Windows2003平台下IMS服务运行却不是很稳定，也存在一些问题（整合Ajax应用等）。基本为0的软件成本（如果数据库也开源），加上成熟的Java开源平台的支持，小型的企业应用，及中小型的政府工程还是可以考虑的，功能的要求复杂么？一般还不是放大、缩小、搜索、定位、业务属性查询、鹰眼、分级、简单统计（饼图、柱状图）、生成Excel等等。<br />
<br />
&nbsp;&nbsp;&nbsp; 如果是C/S的应用呢？一般也只涉及到GIS最基本的一些功能，稍复杂一点的可能会有缓冲区分析、拓扑分析、路径分析等等，如果没有更多的复杂要求，大家钻研ArcEngine的时间花在这些基本算法上面，参考开源软件的实现方法，找找相关资料，加上一两位老大的代领，就足以解决这些问题了。在C#的开源GIS软件中，<a href="http://sharpmap.iter.dk/" target="_blank">SharpMap</a>实现的就比较完善，相比学习ArcEngine一堆的类库而言，学习基本算法应该更能让大家了解GIS的核心。<br />
<br />
&nbsp;&nbsp;&nbsp; 乱评了一会，并不是要鼓励大家放弃ArcGIS，不管其架构设计如何，它的产品毕竟都是久经沙场的老将，数据、GIS理念在业界都是领先的，在中大型的企业应用中，有不少方案可以参考。和一般软件开发一样，一切取决于你的项目需求，不要盲目的追求大而全的产品。如果想做WebGIS地图发布，作为整个系统的数据访问入口或是调料，ArcIMS还是不错的。<br />
<br />
&nbsp;&nbsp;&nbsp; 欢迎拍砖:)</font>
          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58479#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 28 Nov 2006 22:14:00 +0800</pubDate>
        <link>http://gis.javaeye.com/blog/58479</link>
        <guid>http://gis.javaeye.com/blog/58479</guid>
      </item>
      <item>
        <title>ArcSDE 中空间数据的备份与恢复 [转载]</title>
        <author>flyingis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://gis.javaeye.com">flyingis</a>&nbsp;
          链接：<a href="http://gis.javaeye.com/blog/58480" style="color:red;">http://gis.javaeye.com/blog/58480</a>&nbsp;
          发表时间: 2006年11月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          
		<p>
				<font size="2" face="Verdana">原文链接：<a href="http://www.gis8.net/Article/arcgis/200611/362.htm">http://www.gis8.net/Article/arcgis/200611/362.htm</a><br /><br />随着GIS应用系统在复杂性、集成性、并发性等方面的要求不断增加，系统所需的空间数据量在急剧地增长，同时用户对空间数据并发访问的需求也越来越突出。以传统的文件形式存储和表示空间数据的方法显然已经无法满足这些需求。由于ArcSDE本身所具有的海量数据存储、多用户并发访问、版本管理、长事务处理等强大优势，在GIS应用系统中引入ArcSDE作为空间数据存储和管理引擎，变得越来越普遍。ArcSDE作为空间数据库引擎，在ArcGIS 8.1系列软件中属于服务器端的产品，在整个产品框架中，处于数据中心的重要地位，它利用Oracle、DB2、SQL Server、Informix等关系型数据库在数据存储、数据完整性等方面的先进技术手段，将海量空间数据（包括矢量数据和栅格数据）有机地组织和管理起来，通过其内部异步缓冲、空间索引等先进的机制，提供对空间数据的多用户高效并发访问。</font>
		</p>
		<p>
				<font size="2" face="Verdana">除了存储空间数据并提供访问，对于空间数据的备份和恢复，是空间数据管理中最重要的工作环节之一，也是保障空间数据安全的重要方式。首先，空间数据本身在应用过程中不断地被更新变动，所以经常会需要备份不同时期，不同的空间数据版本；第二，存储介质的意外损坏会导致严重的空间数据丢失，因此需要定期对空间数据对象的整体进行完全备份；第三，有时出于调整的必要，需要在不同服务器、甚至不同数据库管理系统之间进行空间数据的移植和转换。<br /><br />在采用文件形式空间数据的时代，空间数据的备份仅仅是操作系统中的文件拷贝、备份和归档的过程；而空间数据的恢复也不过是复制、覆盖的操作；在基于ArcSDE和关系型数据库的空间数据库时代，空间数据的备份更多的依赖于关系型数据库的备份和恢复技术，当然也不能缺少ArcSDE所提供的备份工具。按照备份的方式和对象，ArcSDE中空间数据的备份和恢复可以分为如下两类：指定空间数据对象的备份恢复，和整体空间数据库的备份恢复。</font>
		</p>
		<p>
				<font size="2" face="Verdana">一、 指定空间数据对象的备份和恢复<br />这种方式主要用于备份指定的空间数据对象，比如某个图层和要素类、其中的某些满足特定条件的记录、甚至特定的版本。实现这种备份方式的方法主要是利用ArcSDE提供的管理工具：sdeexport和sdeimport命令。它们的位置在%ArcSDEHOME%\bin\中。其中，sdeexport用于将空间数据从ArcSDE Server上备份为单独的数据文件，而sdeimport用于将经由sdeexport备份的数据文件恢复到ArcSDE Server中。</font>
		</p>
		<p>
				<font size="2" face="Verdana">这一方式的缺点在于不能一次备份完整的空间数据库。但是也有个明显的优点，在于通过sdeexport和sdeimport工具，可以将空间数据在不同的关系型数据库管理系统（RDBMS）之间进行移植。</font>
		</p>
		<p>
				<font size="2" face="Verdana">1． 备份全部记录<br />使用sdeexport命令的缺省方式即可，比如：<br />（1） 将指定的图层备份到备份文件<br />sdeexport -o create -l dcxq,shape -f d:\dcxq.exp -i jerry_oracle -u sde -p sde<br />就是将名为jerry_oracle的sde服务（ArcSDE for Oracle8i）中的指定图层“dcxq”按缺省方式备份到文件d:\dcxq.exp中。<br />（2） 利用操作系统命令，拷贝备份文件到目标服务器上<br />（3） 将备份文件恢复至目标RDBMS中<br />sdeimport -o create -l newDcxq,shape -f d:\dcxq.exp -i jerry_sqlsvr -u sde -p sde<br />此操作将备份文件恢复到名为jerry_sqlsvr的sde服务（ArcSDE for SQLServer）中，图层名为：newDcxq。</font>
		</p>
		<p>
				<font size="2" face="Verdana">2． 备份部分记录<br />sdeexport命令中添加-w参数和一个条件选择表达式即可，比如：<br />（1） 将指定图层中满足条件的记录备份到备份文件<br />sdeexport -o create -l dcxq,shape -f d:\dcxq.exp -w xzqy = '徐汇区' -i jerry_oracle -u sde -p sde<br />就是将名为jerry_oracle的sde服务（ArcSDE for Oracle8i）内的指定图层“dcxq”中所有"徐汇区"的人口调查小区备份到文件d:\dcxq.exp中。<br />（2） 利用操作系统命令，拷贝备份文件到目标服务器上<br />（3） 将备份文件恢复至目标RDBMS中<br />sdeimport -o create -l XHDcxq,shape -f d:\dcxq.exp -i jerry_sqlsvr -u sde -p sde<br />此操作将备份文件恢复到名为jerry_sqlsvr的sde服务（ArcSDE for SQLServer）中，图层名为：XHDcxq。</font>
		</p>
		<p>
				<font size="2" face="Verdana">3． 备份特定数据版本<br />sdeexport命令中添加-v参数和一个版本名称即可，比如：<br />（1） 将指定图层的特定版本备份到备份文件<br />sdeexport -o create -l dcxq,shape -f d:\dcxq.exp -V verAPR -i jerry_oracle -u sde -p sde<br />此操作将名为jerry_oracle的sde服务（ArcSDE for Oracle8i）内的指定图层“dcxq”的verAPR版本备份到文件d:\dcxq.exp中。<br />（2） 利用操作系统命令，拷贝备份文件到目标服务器上<br />（3） 将备份文件恢复至目标RDBMS中<br />sdeimport -o create -l APRdcxq,shape -f d:\dcxq.exp -i jerry_sqlsvr -u sde -p sde<br />此操作将备份文件恢复到名为jerry_sqlsvr的sde服务（ArcSDE for SQLServer）中，图层名为：APRDcxq。</font>
		</p>
		<p>
				<font size="2" face="Verdana">二、 整体空间数据库的备份和恢复<br />ArcSDE空间数据库的整体备份和恢复，实质上很大程度上是其所在的数据库或者数据库对象的备份和恢复问题。当然完整的ArcSDE数据备份应当还包括dbtune.sde，giomgr.defs，dbinit.sde和services.sde等文件。</font>
		</p>
		<p>
				<font size="2" face="Verdana">数据库的备份和恢复有很多种类。在不同的数据库管理系统中，更是千差万别。总体上，大都可以分为静态转储和动态转储两个类型。静态转储是在系统中无事务处理时进行的转储操作，因而这种方式得到的一定是一个数据一致性的副本。静态转储的优点是操作简单，保证数据一致性，但是缺点也很明显，转储操作必须等待用户事务结束才能进行，而新的事务必须等待转储操作结束才能执行，因此会降低数据库的可用性。动态转储是指转储操作与用户事务并发进行，转储期间允许数据库进行存取和修改操作，它不必等待所有运行的事务结束，也不会影响新事务的运行，但是无法保证副本中的数据正确、有效、完整。所以在动态转储期间，往往会建立日志文件。后备文件加上日志文件就可以把数据库恢复到正确的状态。</font>
		</p>
		<p>
				<font size="2" face="Verdana">1． Oracle数据库<br />（1） 两种归档模式（archive mode）<br />Oracle有两中归档模式：NO ARCHIVELOG和ARCHIVELOG。在NO ARCHIVELOG模式（该模式为缺省模式）下的数据库操作不归档在线日志重做文件。当存储介质损坏时，NO ARCHIVELOG模式的数据库只能恢复到上一次的备份点上。ARCHIVELOG模式的数据库可以通过上一次的备份和归档日志重做文件相结合的方式，恢复到介质损坏之前的点上。<br />以NO ARCHIVELOG模式创建的Oracle数据库可以切换至ARCHIVELOG模式。<br />（2） 多种备份与恢复方式<br />Oracle中的数据备份和恢复方式包括：脱机备份与恢复、逻辑备份与恢复、热备份与恢复。<br />* 脱机备份与恢复：脱机备份是一种静态转储技术，备份在数据库关闭、不工作的状态下进行。脱机备份包括两种实现方式：第一种是使用Oracle提供的工具Backup/Recover；第二种是利用操作系统的复制功能，复制数据文件，即：冷备份。<br />* 逻辑备份与恢复：逻辑备份与恢复是指将数据库、用户和表等对象的内容整个转出到一个二进制文件，然后在需要的时候通过转入恢复到原来的形式。这种方式可以备份整个数据库，指定用户和指定表的内容。<br />* 热备份与恢复：脱机备份和逻辑备份通常是用户不访问数据库时的静态备份操作。这些备份只保证数据备份前的一致性和完整性，不保证备份期间的数据一致性。为了保证数据的即时一致性，在备份数据的同时还需要备份日志文件。数据库运行在ARCHIVELOG方式下，同时作数据和日志文件的备份称为热备份。<br />（3） 实现步骤<br />选择使用何种备份方式，由具体的数据备份需求所决定。具体的Oracle数据库备份实现步骤需要参考Oracle相关文档，比如《Oracle8 Backup and Recovery Guide》。本实例采用Oracle中的逻辑备份，使用了exp和imp工具，以sde用户方式备份和恢复整体空间数据。<br />* 备份数据库：使用Oracle中的exp命令，以sde用户方式备份所有相关数据。<br />* 恢复数据库：使用Oracle中的imp命令，以sde用户方式恢复后备数据文件。<br />* 恢复ArcSDE系统文件：如果有必要，在恢复oracle数据之后，需要恢复安装ArcSDE的程序文件；另外还需要从备份机器上恢复dbtune，giomgr.defs，dbinit.sde，和services.sde文件。</font>
		</p>
		<p>
				<font size="2" face="Verdana">2． SQLServer数据库<br />（1）备份和恢复方式<br />在MS SQL Server中，ArcSDE利用单独的用户数据库SDE（缺省名）来管理和组织空间数据。<br />SQLServer不仅可以在同一台服务器上备份和恢复数据库，还允许通过备份和恢复的方式在不同服务器之间很轻松地移动数据库。MS SQL Server也允许将一个服务器上的数据库备份恢复到另外一台服务器上。<br />如果要将数据库备份恢复到另外一台服务器上，两台服务器上的code page和排序方式必须相同。比如，不能把用二进制排序方式（Binary Sort Order，BSO）建立的数据库恢复到一个配置为缺省排序方式（字典顺序，dictionary）的服务器上。当然，可以通过在master数据库中运行'sp_helpsort'存储过程设定服务器的排序方式。<br />数据库的备份操作同时备份了数据库的系统表，包括sysusers。当在不同的服务器上执行备份和恢复操作时，备份数据库中所包含的用户可能会和新的服务器上master数据库中sysxlogins表中包含的用户不同。这样的话，就无法登录到恢复后的数据库，知道更正并统一master数据库中sysxlogins表和恢复数据库中sysusers表的登录映射。要使上述两个表同步，需要运行"sp_change_users_login"存储过程。<br />（2）实现步骤<br />* 备份SDE数据库到备份文件：既可以使用T-SQL中的BACKUP语句，也可以使用企业管理器中的备份工具向导来完成SDE和其他空间数据库的备份。<br />* 将备份文件复制到目标服务器<br />* 将备份文件恢复到目标服务器：可以使用企业管理器中的恢复还原工具向导来完成SDE和其他空间数据库的恢复。<br />* 统一SDE用户登录映射<br />A. 两个服务器上都有SDE用户，但是两者的SDE用户具有不同的标识<br />当恢复SDE数据库至新的服务器后，sde数据库中的sde用户的SID与master数据库中dbo.sysxlogins表中的sde登录名的SID不同，比如：<br />Use sde<br />go<br />Select SID from sysusers where name = 'sde'<br />Use master<br />go<br />select SID from sysxlogins where name = 'sde'</font>
		</p>
		<p>
				<font size="2" face="Verdana">SID<br />-----------------------------------------------------------<br />0x76695419BFAED41184FD00C04F8D0451<br />（1 row（s） affected）</font>
		</p>
		<p>
				<font size="2" face="Verdana">SID<br />-----------------------------------------------------------<br />0xEDDFCA8E56B0D411850000C04F8D0451<br />（1 row（s） affected）<br />此时必须统一两个表中sde用户的SID标识，运行"sp_change_users_login" 存储过程，示例如下：<br />    Use sde<br />go<br />sp_change_users_login 'update_one','sde','sde'<br />运行上述的SID查询来验证修改结果：<br />0xEDDFCA8E56B0D411850000C04F8D0451<br />0xEDDFCA8E56B0D411850000C04F8D0451<br />可以看出修改后两个表中sde用户的SID标识完全一致，此时就可以启动ArcSDE for SQLServer的服务来使用了。<br />B. 目标服务器上还没有SDE用户<br />这种情形是指目标服务器上还没有sde登录用户，此时执行上述的SID查询，结果如下：<br />Use sde<br />go<br />Select SID from sysusers where name = 'sde'<br />Use master<br />go<br />select SID from sysxlogins where name = 'sde'<br />SID<br />-----------------------------------------------------------<br />0x76695419BFAED41184FD00C04F8D0451<br />（1 row（s） affected）<br />SID<br />-----------------------------------------------------------<br />（0 row（s） affected）<br />要矫正这种情况，需要首先到目标服务器中添加sde登录用户，但是不要将sde数据库的权限授予sde用户。添加登录用户，使用"sp_addlogin"存储过程和在企业管理器中使用登录管理工具。比如：<br />sp_addlogin 'sde','go','sde'<br />然后需要运行 "sp_change_users_login" 存储过程来统一master内dbo.sysxlogins表和恢复后用户数据库内sysusers表中的sde用户SID标识。<br />use sde<br />go<br />sp_change_users_login 'update_one','sde','sde'<br />最后，可以执行SID查询来验证SID的一致性：<br />Use sde<br />Go<br />Select SID from sysusers where name = 'sde'<br />Use master<br />Go<br />select SID from sysxlogins where name = 'sde'<br />SID<br />-----------------------------------------------------------<br />0xF6DFCA8E56B0D411850000C04F8D0451<br />（1 row（s） affected）<br />SID<br />-----------------------------------------------------------<br />0xF6DFCA8E56B0D411850000C04F8D0451<br />（1 row（s） affected）<br />经过SDE用户的SID的统一之后，就可以启动ArcSDE服务或者使用直接连接（direct connection）方式使用恢复后的空间数据了。</font>
		</p>

          <br/>
          <span style="color:red;">
            <a href="http://gis.javaeye.com/blog/58480#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul c