ArcGIS+Server++开发文档.doc_第1页
ArcGIS+Server++开发文档.doc_第2页
ArcGIS+Server++开发文档.doc_第3页
ArcGIS+Server++开发文档.doc_第4页
ArcGIS+Server++开发文档.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ArcGIS Server学习2007年6月21日 by jbttmArcGIS Server产品包括两个部分,一是GIS Server,它是一个提供GIS服务的服务器软件产品,包括一系列核心AO库和一个管理这些AO组件的可缩放的运行环境;另一个是ADF,即应用程序开发框架,它有JAVA和.NET两种开发组件集,它是用来开发和部署基于GIS Server的web应用程序的产品,包括组件对象、web控件、web模板和开发帮助,它还有一个web程序的runtime,专门用于发布和部署使用ADF开发的web程序,如ASP.NET等。GIS Server是一套GIS服务器组件,专门用于管理和发布地图服务和定位服务,安装在GIS服务器上;ADF是供开发人员使用的开发组件集,安装在开发人员的机器上,这些程序包括WEB应用程序、WEB服务和桌面端程序,都可以使用ADF;ADF Runtime是专门用于部署开发人员开发的GIS web程序和GIS WEB Service的工具,安装在WEB服务器上。GIS服务器、WEB服务器和开发人员的电脑可以是同一台机器,也可以分开安装。AS的安装和配置不明白为什么那么多人都说AS的安装和配置复杂,甚至还要重装系统。其实,如果你多次安装过IMS这类的产品,对于AS,那是小菜一碟,首先是按照安装步骤一步步NEXT下去即可,在安装完毕后,程序将会要求Post Installation的设置,这是关键。当程序弹出一个对话框要用户填入SOM和SOC用户名和密码时,直接键入,如SOM为arcgissom,SOC为arcgissoc,这两个用户将来将用于管理AS,键入即可,先不用管它们。在填完用户名和密码后,再设置许可文件,这样,程序就配置完成了一大步。打开“控制面板-管理工具-计算机管理-本地用户和组-组”,我们将看到agsadmin和agsuser两个组,这两个组的用户是用于管理AS的,分别将administrator用户填入这两个组中(一般是登录用户,比如我通常用administrator登录到操作系统)。这样,administrator用户就可以用来管理和使用AS了。在IIS中新建一个虚拟目录,其实很简单,也可以通过下面的方法设置:新建一个文件夹xxx,在右键web共享属性中选择共享即可,然后在浏览器中使用http:/localhost/xxx来测试一下目录是否可以访问,如果可以,则设置成功。重启电脑,为了保证我们设置的用户及其权限能够成功。在新启动的电脑中打开ArcCatalog,这是AS管理服务的软件,注意,我们必须是使用agsadmin组中的账户登录,这样才能管理AS。点击GIS Server-Add GIS Server,会弹出个对话框,我们需要设置各种属性。Host中设置AS安装的机器名,Directory中设置我们在前面建立虚拟目录时候新建的文件夹。点击确定,这样AS服务管理器的配置设置好了。点击Add Server Object,开始新建服务对象,这些属性都很容易设置,除了一点,即“参数”中的“选择输出目录”,这个目录还必须选我们之前设置的文件夹,并且正确填写通过HTTP访问该文件夹的方式,即前面的http:/localhost/xxx。点击确定,这样一个AS的服务对象就新建好了。如果不出意外,当我们点击ArcCatalog中的Preview时,就会出现图像了。如果没有图像,我们先打开XXX文件夹,看看其中是否有图片存在,如果有,那就是服务成功,但是访问不成功,这个时候我们需要重启IIS,保证能够通过http:/localhost/xxx的方式访问到XXX文件夹。这是因为我们访问AS是通过WEB服务器进行的,而不是直接连接到服务。ArcGIS Server12006年5月26日 by jbttmArcGIS Server是用于开发基于网络的企业级服务器端程序的一套组件集,服务器端程序包括Web Service、Web 应用程序和EJB等。使用AS开发的程序,其功能可以从普通的显示地图跨越到复杂的网络分析等,即它提供的功能比ArcIMS强大得多。ESRI提供的AS包括两个部分,一是ArcGIS Server,它是AS的服务器,AS能够运行全靠它;另一个是用于客户端开发的程序ADF(Application Developer Framework)开发集,它提供了一套可视化的WEB组件和模板,用于运行在WEB页面上(在9.2中,IMS的开发手段比以前有了很大的进步,和AS差不多)。同AE一样,AS的核心组件也是AO,简单讲,它是运行在服务器端的AO组件集。开发AS的手段有两种,一是使用,NET开发,另一种是使用JAVA开发。AS的关键特征有:1. 标准的GIS框架,即它和ESRI其它的软件框架都是一样的,这样降低了开发难度。2. 降低了分布费用,由于AS是基于WEB的GIS程序,因此ADF的运行时是不需要license的,这也使得服务器端的功能可以免费被多用户使用。3. Web Control,一系列可视化控件的提供,降低开发难度4. Web程序模板5. 跨平台分布使用6. 多种开发语言7. 可以使用ArcGIS的多种高级功能,如3D分析,空间分析等8. 提供了大量的开发资源ESRI提供了一份PDF文件ArcGIS Server Administrator and Developer Guide供AS管理员和开发者使用。ArcGIS Server学习22007年6月22日 by jbttmArcGIS Server是一个三层的分布式系统,它由多个组件组成。AS的组件分为两部分,一是服务器端组件,如web服务器和GIS服务器;另一端是客户端组件,即访问AS的程序,如web浏览器和ArcGIS的桌面端和AE产品。第一层是客户端、第二层是web服务器,第三层就是GIS服务器。我们先不谈桌面端的产品,先讨论服务器端的两个组件,即web服务器和GIS服务器。WEB服务器是三层结构的第二层,它是用于构建web服务的计算机,需要安装web服务器软件,如IIS等。WEB服务器用于接收客户端请求并运行web应用程序和服务。最简单的WEB服务器可以只负责解析HTTP协议,但如果要干点别事情,如能够解析ASP、JSP等等WEB程序,就必须在WEB服务器上安装点别的组件。如ArcIMS中,我们需要在WEB服务器上安装连接器就是这个道理。同样,在AS中,我们开发的基于AS的WEB应用程序(ASP.NET网页)和web服务都在web服务器上,要运行起来还得装ADF Runtime才行,因为这些程序都使用到了AO,必须在WEB服务器上也安上必要的组件才行。因此,为了能够通过WEB服务器访问AS,我们必须在WEB服务器上安装两个软件:WEB服务器软件,如IIS,AS应用程序框架,即ADF Rumtime。GIS服务器负责管理和运行服务器对象。它包括一个Server Object Manager(SOM)、一个到多个Server Object Containers(SOC)和AS软件开发包。Server Object Manager是一个用于管理GIS资源,如地图或定位器的对象,我们在ArcCatalog中新建服务后添加的Server Object就是这个对象。它本身是一个AO组件,并且有权限来使用服务器端的其它AO组件。SOM负责管理一群SOC,即一群进程,如负责将外部访问交给某个进程处理,平衡SOC的荷载。它也是一切访问AS的程序接触到AS的总阀门。SOC是一个进程,当我们访问一个Server Object时系统会根据情况决定是否建立一个SOC,这个进程中可以容纳一个或多个Server Object的访问例程。我们可以在进程管理器中看到它。而Server Object,则是提供地图服务和定位器服务的对象,这个对象在编程中非常重要。因此,一个外部访问是这样进行的:访问连接到SOM,SOM将分配一个SOC给访问,这个SOC是一个进程通道,我们的任何访问和操作都在这个通道内完成,通过这个进程中的一个例程,我们获得了一个Server Object,这个SO,就是我们需要获取的对象,我们可以通过IMapServer接口来对其进行编程或访问了。因此,ArcGIS Server,实际上就是一个管理服务器对象的对象服务器。ArcGIS Server学习32007年6月23日 by jbttmArcGIS Server是一个服务器端的AO组件集,我们对AS的编程操作,都意味着对远端服务器上对象的操作,这是一个很大的不同。以使用AE开发成为为例,我们新建一个对象,使用的是new关键字,这是在本地机器上新建一个对象的操作,这个操作一直封装在一个进程中。而AS的开发,意味着本地的一个对象,必须调用远端的一个对象来实现某种功能,本地的操作进程与远程的操作进程实际上是两个不同的进程,如何在两个进程之间进行通讯呢?AS使用了分布式对象技术DOT来处理这个问题,ADF提供了一系列所谓的ArcObjects proxy对象,一个proxy对象就是一个远端对象在本地的引用,它的接口和方法与proxy对象的远端对象完全一致,这样,我们对proxy对象的操作,就会直接影响到它代理的远端对象。我们说过,AS是一个三层模型,其中通过浏览器访问的WEB程序和WEB服务都是放在第二层,即WEB服务器上的,为了让WEB服务器上的程序能够通过操作AO组件来与GIS服务器上的AO组件进行交互,我们需要在WEB服务器上安装ADF,如果是发布的话,安装ADF Runtime就行了。因此,AO的proxy对象都是安装在web服务器上的。WEB程序或WEB Service使用的组件是Server API,这些API分为三种:Server API,.NET WebControl和Java WebControl。当一个WEB应用程序连接到GIS服务器的时候,WEB程序使用的Server API将调用一个代理对象去访问远程服务器上的SOM对象,并通过SOM对象寻找到SOM管理的Server Object对象。它使用了分布式对象技术DOT。这个过程是这样的:IGISServerConnection pGISServerConn=new GISServerConnectionClass();pGISServerConn.Connect(nbjbt);/连接到GIS服务器IServerObjectManager SOM=pGISServerConn.ServerObjectManager;/找到GIS Server上的SOMIServerContext pServerContext=SOM.CreateServerContext(nbserver,MapServer);/通过SOM创建一个服务器对象的上下文IServerObject pSO=pServerContext.ServerObject;/从上下文对象找到服务器对象IMapServer pMapServer=(IMapServer)(pSO);/使用IMapServer接口来访问服务器对象。pServerContext.ReleaseContext();/释放服务器对象的上下文,即关闭该进程ServerContext本质上是一个GIS服务器上的进程,它也是我们服务器端编程的起点。因此,我们是通过CreateServerContext命令在服务器端上创建的,而不是使用NEW关键字在本机上创建。我们是通过这个进程在访问服务器对象nbserver。我们的工作也是在这个进程中完成的。既然是在一个进程中编程,那么,在这个进程中新建一个对象使用的关键字就不是NEW了,而是下面的方式:新建对象 pSC.CreateObject(esriGeometry.IPoint)将一个对象放入一个进程 pSC.LoadObject(pPt)将一个对象放在进程的字典中pSC.SetObject(a,pPt)将对象从进程字典取出pNewPt=pSC.GetObject(a)ServerObject的池化和非池化模式当我们访问一个服务器对象Server Object的时候,这个对象是已经存在的呢?还是在访问时新建的?都有可能,这取决于我们如何选择。如果我们选择共享池化模式,则在SOM启动的时候,SOM就建立了几个SO供外界访问,一个SO被A请求访问后,被释放回共享池中,还可以下次被B访问使用,因此,SO将可以被多个用户访问。如果是非共享池模式,当一个请求访问时,SOM专门为它新建一个SO。这样,在池化模式下,访问与SO的比例不是1:1,它支持更多的用户;而非池化模式就是1:1的,它支持的用户比池化模式少。SO放在什么地方,对,它就放在一个Server Context中,即一个进程中。一个访问连接到SO,是一个例程,这个例程是放置在一个进程中的。而对于这个进程的特征,我们还需要进一步设置,即进程的孤立性。如果Server Context是高孤立的(high isolation),那么一个进程中只能放置一个例程,这样保障了安全性;如果是低孤立的,四个访问连接的例程都可以放置在一个进程中,它的特点是节约资源。至于如何设置,就有必要考虑我们的硬件设备了。池化和非池化的设置对状态或非状态的应用程序也有影响,这些我们将在后面的blog中提到。ArcGIS Server学习42007年6月25日 by jbttm在前文中我们说道,Server Object实际上就是我们建立的地图服务和定位服务,这个服务都是必须通过一个进程来被请求访问到的,那么,这个过程是怎么样的呢?下面我们介绍在共享池模式下的连接过程:1. 客户端程序连接到SOM,要求访问一个SO; 2. SOM分配一个SOC给客户端程序的AO Proxy对象,这个SOC是AS启动时建立的,默认最少为2个,最多为4个; 3. 客户端程序通过调用远程AO对象的Proxy对象操作AO对象; 4. 执行完操作后。执行pSC.ReleaseContext,SOC返回共享池中,等待下一次请求访问。 如果是非共享池模式,这个过程不同在于:1. SOM新建一个SOC给代理对象 2. 执行执行pSC.ReleaseContext后,SOC被销毁而不是返回到共享池中。 有状态和无状态的GIS应用程序我们知道,一个web程序在每个用户访问的时候,都会产生一个session来记录访客的信息,如果所有用户的访问与session的状态无关,则我们认为这个程序是无状态的,否则就是有状态。例如my google这些站点,每个人登录后的信息都是不同的,我们则认为这是一个有状态的程序。对于AS的Server Object而言,状态state也是非常重要的。一个SO如果是有状态的,那么它的属性就能改变,否则,非状态的SO的属性是不能被修改的。一个SO的状态如何暗示了它是否能够被跨session共享使用。如果一个SO是无状态的,那么它就是共享的,否则就是独占式的。SO是否使用状态与SO是否是共享池模式有密切个关系。这是因为,一个池式的SO是不能被改变的,不能被用于有状态的程序中;一个非池式的SO的属性是能够改变的,它能够用于有状态的程序中。一个池式的Server Object是默认为无状态使用的,这是因为这个SO可能会给多个用户访问,而且它用完后是会放回共享池中的,如果改变了它的状态,则意味着不同的访问者访问它时获得的信息不一致,这本身是一种非状态的行为。而我们要求的是保证不同的人都是一样的结果的一种无状态模式,因此,保证本身具有“共享”特征的池式SO的无状态使用才是到达目的的方法。因此,共享池模式的SO的无状态使用,是有效率满足访问的方式。如果要做无模式的程序,共享池式的SO是首选。如果是建立有模式的程序,那么使用非共享池式的SO是首选,由于这种情况下访问请求与SO数量是1:1,这就使得一个人对SO的改变不会影响另一个人的使用。下面是一个无状态的代码:ServerConnection pServerConn=new ESRI.ArcGIS.Server.WebControls.ServerConnection(nbjbt);pServerConn.Connect();IServerObjectManager pSOM=pServerConn.ServerObjectManager;IServerContext pSC=pSOM.CreateServerContext(nbserver,MapServer);IServerObject pSO=pSC.ServerObject;IMapServer pMapServer=(IMapServer)pSO;IMapServerInfo pMapServerInfo=pMapServer.GetServerInfo(pMapServer.DefaultMapName);IMapDescription pMapDesc=pMapServerInfo.DefaultMapDescription;IImageType it=(IImageType)pSC.CreateObject(esriCarto.ImageType);it.Format =esriImageFormat.esriImageJPG;it.ReturnType =esriImageReturnType.esriImageReturnURL;IImageDisplay idisp=(IImageDisplay)pSC.CreateObject(esriCarto.ImageDisplay);idisp.Height =400;idisp.Width =400;idisp.DeviceResolution=150;IImageDescription pID=(IImageDescription)pSC.CreateObject(esriCarto.ImageDescription);pID.Display =idisp;pID.Type =it;IImageResult pImgResult=pMapServer.ExportMapImage(pMapDesc,pID);this.Label1.Text =pImgResult.URL;pSC.ReleaseContext();代码执行完毕后,在Label1中将出现一张图片的地址,我们在AS服务器的输出目录看看,会发现已经生成了一张JPG的图片。ArcGIS Server学习52007年6月26日 by jbttm有状态和无状态的应用程序2我们继续讨论web程序的状态问题。其实写过诸如asp jsp的人都知道,类似session、cookie等东西在web页面程序中应用的非常广泛,因为这是我们让程序记住一个用户标志的方法,唯有使用这些对象,我们才能区分不同的用户。事实上,有状态的web程序是极其常见的,许多我们根本没有意识到的“无状态”操作都依赖有状态的方法来实现,这种方法我们称为“浅状态程序”,例如下面这个例子,我们启动一个页面,然后点击一个“固定放大”按钮去放大地图,看起来似乎与状态无关,但是仔细想想,这种固定放大是依赖地图放大前一次的范围的,这意味着我们必须记录前一次的地图状态,这其实就是一种状态程序。我们下面写这个代码:页面启动:private void Page_Load(object sender, System.EventArgs e)/ 在此处放置用户代码以初始化页面if(!Page.IsPostBack)if(Session.IsNewSession)ESRI.ArcGIS.Server.WebControls.ServerConnection pServerConn=new ESRI.ArcGIS.Server.WebControls.ServerConnection(nbjbt);pServerConn.Connect();IServerObjectManager pSOM=pServerConn.ServerObjectManager;/将SOM保存到全局变量区Application.Set(som,pSOM);IServerContext pSC=pSOM.CreateServerContext(nbserver,MapServer);IServerObject pSO=pSC.ServerObject;IMapServer pMapServer=(IMapServer)pSO;IMapServerInfo pMapServerInfo=pMapServer.GetServerInfo(pMapServer.DefaultMapName);IMapDescription pMapDesc=pMapServerInfo.DefaultMapDescription;/将pMapDesc序列化为一个字符串,保存到一个session中string ss=pSC.SaveObject(pMapDesc);Sessionmd=ss;/显示启动时默认地图this.Image1.ImageUrl=this.CreateImage(pMapDesc,pSC);/释放进程pSC.ReleaseContext();下面是按下固定放大时候的代码:private void Button1_Click(object sender, System.EventArgs e)IServerObjectManager pSom=(IServerObjectManager)Application.Get(som);IServerContext pSC=pSom.CreateServerContext(nbserver,MapServer);IMapServer pMapServer=(IMapServer)pSC.ServerObject;/从session中取出上一次地图的描述对象string smd=(string)Sessionmd;IMapDescription pMapDesc=(IMapDescription)pSC.LoadObject(smd);IMapArea ma=pMapDesc.MapArea;IEnvelope pEnv=ma.Extent;pEnv.Expand(0.9,0.9,true);IMapExtent mx=(IMapExtent)ma;mx.Extent =pEnv;pMapDesc.MapArea =ma;/改变地图this.Image1.ImageUrl=this.CreateImage(pMapDesc,pSC);/将改变后的地图描述对象存入同名的session中string ss=pSC.SaveObject(pMapDesc);Sessionmd=ss;pSC.ReleaseContext();有“浅状态程序”,也就有相应的“深状态程序”了,后者必须是一种独占式的SO才行,因为深状态程序做的内容可能包括删除地图中的一个图层等操作,如果是非独占式的SO,显然不行,这就是说我们在深状态程序中,必须使用非池化SO才行。最后还需要记住的一点是,如果访问非共享池模式的SO时产生了session,需要在Session_End事件中手工将这些session清除,这是因为服务器的空间和性能是有限的,产生太多的session会对服务器的性能有影响,而且对于非共享池模式的session而言,反正是独占式享用SO,在退出时保留session是浪费资源而已。ArcGIS Server学习62007年6月26日 by jbttmWEB服务使用Server API和web控件既可以开发供用户直接交互的Web应用程序,也可以开发供程序使用的Web Service。AS支持的WEB Service分为两种,即Application Web Service和ArcGIS Server Web Service。Application Web ServiceApplication Web Service是我们见过的最普通的WEB SERVICE编写形式,它的编写方法同ASP.NET WEB SERVICE并无二致,同样,由于web service也是放在web服务器上的,我们的程序写法同样是前面介绍的方法,这里就不多讲我个人的学习体会了。ArcGIS Server Web Service这是使用ADF提供的模板将我们在GIS服务器上建立的Server Object通过WEB Service的方式发布的方式,由于MapServer和GeoCoder同样支持SOAP协议,因此我们也可以通过SOAP API来展示服务器上的SO。这样即是通过web service的方式来访问GIS服务器上的SO对象。其过程如下:在ArcGIS Server Project中选择Web Service Catalog,建立项目为nbservice,然后键入主机名,获得所要发布为web service的SO对象,点击确定即可。这样就自动建立了web service了。如我有个SO为nbserver被添加了服务。新建一个项目,添加web引用,键入http:/nbservice/nbserver.aspx?wsdl,将WEB引用名改为NBS,然后在WEB页面中写下如下代码:private void Page_Load(object sender, System.EventArgs e)/ 在此处放置用户代码以初始化页面NBS.nbserver map=new NBS.nbserver();NBS.MapServerInfo mapi=map.GetServerInfo(map.GetDefaultMapName();NBS.MapDescription mapdesc=mapi.DefaultMapDescription;NBS.ImageType it=new NBS.ImageType();it.ImageFormat=NBS.esriImageFormat.esriImageJPG;it.ImageReturnType =NBS.esriImageReturnType.esriImageReturnURL;NBS.ImageDisplay idisp=new NBS.ImageDisplay();idisp.ImageWidth =400;idisp.ImageHeight =400;idisp.ImageDPI =200;NBS.ImageDescription pID=new NBS.ImageDescription();pID.ImageDisplay =idisp;pID.ImageType =it;NBS.MapImage pMI=map.ExportMapImage(mapdesc,pID);this.Image1.ImageUrl=pMI.ImageURL;编译执行,同样会出现一幅地图。我们可以看到,使用这种方式编码真的是非常简单,使用SOAP API和Server API达到了同样的效果。1. Application Web Service做的web service是放在WEB SERVER上的,请问 ,ArcGIS Server Web Service做的web service也是在WEB SERVER上吗,还是做好的服务放在GIS Server上,因为,如果是局域网访问的化,如果说它存在于WEB SERVER 上,我们直接连接到SOM 上(GIS SERVER)上,但是就不通过WEB SERVER了,所以里面存在的矛盾,请您解释一下可以吗?2007-9-19 11:34:22 2. jbttmSays1.所谓web service,是运行在web服务器上的,这点没有异议,而所谓的ArcGIS Server Web Service无非是使用了ArcGIS Server组件制作的web service,当然也放在web服务器上。2.ArcGIS Server使用了多种方法让我们连接地图服务,既可以直接连接SOM,也可以通过TCP/IP协议访问ASP.NET等页面,还能够通过SOAP协议访问webservice。只能说去一个地方有三条路可以走,毫无矛盾存在。2007-9-19 22:00:50 ArcGIS92之后GISer的学习方向2007年9月13日 by jbttm这一篇东西是我上周四去杭州参加“ESRI中国巡展”后的一些想法。ESRI的这次巡展,主题是“熔 享地理之道”,说白点,就是最近很火的MashupCSDN上有一天的主题就是它,所谓Mashup,就是共享共用,将功能作为Web服务或其它公开格式发布出来,能够被人所共用。“mashup作为一个建立web应用的新方式,它在单一页面中合并了来自多个源站点的程序和数据服务。通称,通过将javascript作为各个源页面之间的“粘合剂”使这些组件和连接被乖巧地布局在同一个页面里,这样并无需昂贵的花费就生产出有价值的“新产品”。”当然,Mashup天生的社会性缺点是版权,没有人会将自己的东西白白给人融合链接到一块儿,给别人做东西,所以嘞,当天发言的ESRI中国的技术总监、浙大的教授和浙江地理信息中心主任都说啦,由于缺乏必要的法律基础和现实的部门利益,别说在全国,就是在全市范围内实现数据和功能共享,都是不现实的。谁没有自己的部门利益和单位利益的,凭啥自己单位辛辛苦苦搞的东西白白给人用哩,虽然这些东西都是国家的。不发牢骚,谈点技术的东西,作为一个成熟的软件产品,ESRI的ArcGIS推出的速度是越来越快了,新出现的东西带给我们更多的惊喜,有一些功能是过去我们二次开发者得自己编码实现的,现在ArcGIS已经将它们包装成新的功能。ArcGIS最混蛋的地方是不提供向下兼容,你只有不停跟着它飞跑,微软虽然也混蛋,但好歹不会强迫你升级,ESRI就不同了,现在你就买不到9.1的产品了,要买,请用最新版本9.2。在9.2上,ArcGIS Desktop的东西显然已经发展到极致了,当然,我说的是纯粹桌面端的一些功能,即不依赖服务器端的。而ArcGIS9.2的闪光点显然在服务器端上,从数据到功能,都在以WEB Service的形式发布推出,ArcGIS Server将逐渐占据ArcGIS家族的核心地位,连ArcSDE都没了,ArcIMS俨然已经是Basic版本的AS。所以,大家还是把精力多放在点ArcGIS Server上没错。还有一个闪光点是脚本语言Python的大力推荐,这个东西可以直接调用ArcToolbox的一些功能,这在最新一期的ArcUser里面有大篇幅讲到。我的blog中很早也有几篇关于python的东西。学习Python2006年7月7日 by jbttm在我学习使用ArcGIS的时候,我常常需要面对一个曾经迷惑不解到过程,在安装这个庞大的程序的时候,为一个叫Python的东西指定安装目录。当时我忙于GIS的学习,没有时间来看这个所谓的“脚本”的具体内容,而脚本的概念,使得我在曾经学习JavaScript的时候得以了解,一般而言,大家都不太在意脚本语言的东西,因为它的功能太弱了,有些脚本语言甚至连基本的debugger都没有,未免太让人泄气。有一天无意在网上浏览的时候,发现有人介绍Python是一种能够编写从操作系统到web应用的面向对象脚本语言,世界上还有这种奇特的东西?真是“腰里挂着BB机,见谁逮谁吹牛B”。Python的意思是“大蟒蛇”,据说这个名字来源于一个无聊的后现代的英国电视剧。Python这种语言更是被称为“不复杂但非常健壮,既具备传统编译型语言的强大功能,又具备比较简单的脚本和解释型程序设计语言的易用性”,甚至还冒出来一句“人有多大胆,Python就有多大产”(见于Python核心编程)。让我们先对Python的创始人顶礼膜拜一下,Guido van Rossum先生于1989年下半年开始这项工作,并在1991年初公开发表。虽然已经15年来,但不得不说,这是一种好新的语言,以致相当多的人压根就没有注意到它。Python是一种什么样的语言呢?我们来列举一些疯狂的爱好者们的说法:l 一种高级的OOP语言l 适应性强,可扩展的语言l 一种可以移植的语言,这种语言有两种解释器,一是使用C语言编写的CPython形式解释器;另一种是使用Java语言编写的JPython解释器。C语言编写的东西的扩展性自然不用说咯,在JPython脚本环境中,还可以调用java对象,访问java类以进行交互,就好像java是Python的一个组成部分一样。l 便于学习、理解和维护的语言l 有异常机制,是一种健壮的语言,而且内存管理还是由机器本身控制的l 既可以解释运行,也可以以内存中的字节码的形式编译运行,和java相似我们编写Python语言,需要安装它,这个东西嘛,我使用的Python的版本是2.1。Python的执行方式有:交互式执行,即在命令行形式下写一句执行一句;交互式脚本执行,执行一个已经编写好的脚本文件,以py为后缀名;使用IDE执行,它需要有一个支持Python但GUI软件。在UNIX中的这个IDE是IDLE,其发明人正是我们刚才膜拜过的人物Guido先生,它是基于Tkinter的,因此使用它系统中必须安装Tcl/Tk。我没有使用过这个东西,原因是我没有学习过UNIX的东西,而且也不敢把自己的电脑随随便便装上UNIX。我们大部分人使用的Windows平台上支持Python语言的接口是PythonWin,这个好玩意也是ArcGIS自己安装的,使用MFC编写而成的。它的发行版本中还包括API、COM、OLE,使用起来非常方便,请大家装好PythonWin后再看。在Win平台上也有IDLE使用哦,大家可以在Python安装目录/tools/idle目录中找到一个叫idle的文件,什么?有三个这样名字的文件存在?而且两个图标睁开眼睛,一个是闭上眼睛的。点击最后一个好了,效果一样,呵呵。当然咯,安装了PythonWin后,也有这个工具的快捷方式同样可以找到。Python特点2006年7月9日 by jbttm这几天在继续看Python方面的资料,果然比较容易上手,粗略有点感性认识,随便写下来。Python是一种自由的开放的语言,具备其它语言所没有的特点:它是开源软件运动的产物,有许多人为它编写了数量众多的模块和库,这些库的内容非常丰富,从图形图象到科学计算都有,这意味我们不必去购买一些昂贵的专业库;Python是一种被解释器包裹的语言,即它需要通过解释器来运行,而它的解释器是使用C语言编写而成的,这使得它可以运行在大部分的操作系统上,除此以外,还有一种使用java语言编写而成的解释器JPython,它可以运行在有jre的os上,这种扩展性是无与伦比的。Python是一种良好的粘合语言,它可以调用c和java编写的库,这个比较猛哦,可不是一般的脚本语言可以实行的功能。Python的语法非常单纯,没有那些所谓的“灵活性”,事实上,我们也知道,越灵活动语法,带给我们的苦恼和麻烦越多,如果到达一个地方有n条道路,我们将不会欣喜若狂,而是会对不同道路所遇到的问题犯嘀咕。语法简单,对我们程序员其实是最简单的。Python有丰富的内置数据类型,除了一般的数字,字符串以外,它还提供了注入复数、列表list,表列tuple,字典dictionary这些高级数据结构,比起C语言来,这真是一种天堂般的享受;除了数据类型,还有大量的操作函数,提供标准的字符串操作,数字操作,文件操作等功能。Python的功能可以无限扩展,这种扩展是通过导入模块来完成的,模块就是一个个单个py文件,它使用import关键字被导入。模块是相当重要的,当我们打开解释器的时候,实际上是在运行一个模块“_main_”,这个模块自己有相当多的方法,它就表现为Python的内置方法,诸如abs,open等,同时我们也可以导入其它的模块,如math,string等,就可以完成一些高级任务了。如何判断这个情况,使用下面的代码: import _main_ _main_.sys.stdout.write(msg)上面就是一个内置方法write。Python内置类型12006年7月19日 by jbttmPython的基本数据类型非常丰富,而且有复数这些高级的数据类型,足够让我们轻松完成许多别的语言花费大力气才能完成的工作:l 整型intl 长整型,这个需要在数字后面加上一个L才行,如666666666666666666666Ll 浮点型上面的三种数字类型可以使用多种运算符和工具进行计算,如+-*/ pow abs rand math等等。这些运算符包括表达式操作符、内置函数和外置模块:如何查看内置函数? dir()_builtins_, _doc_, _name_, a, b, pywin dir(_builtins_)l 复数(这个比较猛,别的语言没有见过)l 字符串l 列表listl 表列tuplel 字典dictionary,就是hash tablel 文件变量的类型设置是极其松散的,这是一个Python的优点,当然,有人不喜欢这点: x=1 x1 x=china xchina看到了吧,变量x是可以随便赋给不同类型的值的,究其原因,x不过是个指向值得内存地址的引用而已。如何知道一个变量的具体数据类型呢,使用type关键字即可: type (china) type (2) type (5+5j)Python还可以寻找到一个变量、值或者对象的ID,这是变量在内存中的唯一标识号,每个变量和对象都有个,如: id(x)13283888 id(y)13436656我们来看一个问题,如果两个变量的内容是一样的,这两个变量是否是指向同一个内存中的内容呢,抑或是两个对象,即: a=1 b=1 id(a)231456 id(b)231456看到了吧,它们的确是指向同一个内容。Python的模块2006年7月23日 by jbttmPython的模块是一种代码的组织方式,用户可以将它和别的语言的类库相比,在Python中,程序的运行都是以模块为结构进行的。模块有两种运行方式,一是作为文件被载入,二是在解释器中以命令行的方式运行,实际上,当我们运行解释器的时候,就是在运行一个名为_main_的模块。这就是为什么当我们运行解释器后键入dir()会出现下列语句的原因:_builtins_, _

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论