【转】ArcGIS Server10.1安装常见问题及解决方案

  由于网站项目需要上传和下载资源,资源大小有几M到几百M不等,传输的效率暂不考虑,所以先搭建FTP服务器供项目使用。

  SQL Server的补丁版本检查不如Windows
补丁版本检查直接,一个系统管理员,如果不了解SQL
Server版本对应的补丁号,可能也会遇到一点麻烦,因此在这说明一下,通过这样的办法判别机器是安全的办法,不会对系统产生任何影响。

一、补丁安装过程中常见问题
如果在安装补丁的时候遇到如下类似错误:
1、安装过程中出现“以前进行的程序创建了挂起的文件操作,运行安装程序前,必须重新启动”,请按照下面步骤解决:
a、重启机器,再进行安装,如果发现还有该错误,请按下面步骤
b、在开始->运行中输入regedit
c、到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager
位置
d、选择文件->倒出,保存
e、在右边窗口右击PendingFileRenameOperations,选择删除,然后确认
f、重启安装,问题解决
如果还有同样问题,请检查其它注册表中是否有该值存在,如有请删掉。
 
2、在安装SQL Server
SP3,有时候会出现:无论用windows认证还是混和认证,都出现密码错误的情况,这时查看临时目录下的sqlsp.out,会发现以下描述:
[TCP/IP Sockets]Specified SQL server not found.
[TCP/IP Sockets]ConnectionOpen (Connect()).
其实这是SQL Server
SP3的一个小bug,在安装sp3的时候,没有监听tcp/ip端口,可以按照以下步骤进行:
1、打开SQL
server客户器网络实用工具和服务器网络工具,确保启用的协议中包含name
pipe,并且位置在第一位.
2、确保[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerClientConnectTo]
“DSQUERY”=”DBNETLIB”.
如果没有,请自己建立
3、停止mssql.
4、进行安装.
这样就可以进行正确安装了。
二、SQL Server补丁版本的检查
SQL Server的补丁版本检查不如Windows
补丁版本检查直接,一个系统管理员,如果不了解SQL
Server版本对应的补丁号,可能也会遇到一点麻烦,因此在这说明一下,通过这样的办法判别机器是安全的办法,不会对系统产生任何影响。
 
1、用Isql或者SQL查询分析器登录到SQL
Server,如果是用Isql,请在cmd窗口输入isql -U
sa,然后输入密码,进入;如果是用SQL查询分析器,请从程序中启动,输入sa和密码(也可以用windows验证)。
 
2、在ISQL中输入:
Select @@Version;
go
或者SQL查询分析器中输入(其实如果不想输入,只要打开帮助的关于就可以了:))
Select @@Version;
然后按执行;
这时会返回SQL的版本信息,如下:
Microsoft SQL Server 2000 – 8.00.760 (Intel X86) Dec 17 2002 14:22:05
Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on
Windows NT 5.0 (Build 2195: Service Pack 3)
其中的8.00.760就是SQL Server的版本和补丁号。对应关系如下:
8.00.194 -――――――SQL Server 2000 RTM
8.00.384 -――――――(SP1)
8.00.534 -――――――(SP2)
8.00.760 -――――――(SP3)
这样我们就能看到SQL Server的正确版本和补丁号了。
 
我们也可以用xp_msver看到更详细的信息。

转载自:

同样摘自ESRI公司网站。

  下载Filezilla Server后安装,没特殊要求,下一步直至结束。

  一、补丁安装过程中常见问题

最近因为更换系统的原因,重新安装了ArcGISServer
10.1。过程中遇到了几个小问题,虽然都一一解决了,但也耗费了不少时间。这里选了两个常见的问题和解决方案一并共享出来,以供参考。

内容摘要

  安装完成后打开程序居然报错:

  如果在安装补丁的时候遇到如下类似错误:

1.     Localhost:6080(<>:6080)无法访问

因为ArcGIS 10.1for Server 开始,Esri采用 ArcGIS Server
site 架构取代之前的SOM-SOCs 架构。所以在安装文件完成之后,初次运行ArcGIS
Server需要登录 Manager,创建站点。

但有些情况下,当我们安装完成之后,跳转时会出现链接无法访问的问题。如下图:

图片 1

这个时候我们一般会考虑,web服务器冲突或者安装问题。

简单的首先想是不是Server安装出错。但是再次安装后发现依然无法访问。这个时候只能慢慢排查了。在10.1开始Server是内置了tomcat并占有6080端口作为GIS服务器。所以安装10.1或者之后的版本无需再配置IIS或者安装Apache了。因为本机装过Apache并修改过很多配置,所以可能相互干扰了。于是将Apache关闭了,但localhost:6080依然无法访问,再开启Apache后http://localhost访问正常,http://localhost:6080则依然无法访问。这个时候可以确认是Tomcat的问题了,并且想到是不是Tomcat未启动。于是在服务中查找,发现没有Tomcat的服务项,不过终于发现ArcGIS
Server的服务项未启动。

图片 2

尝试着启动服务,终于访问正常。

解决方案:

查看服务列表,启动ArcGIS Server服务项。

本指导描述了如何配置Windows XP SP2防火墙,使得ArcGIS
Server能正常工作。为了完成下面
的过程,必须安装Windows XP Service Pack 2,下面的步骤需要为ArcGIS
Server配置Windows
防火墙。

图片 3

  1、安装过程中出现“以前进行的程序创建了挂起的文件操作,运行安装程序前,必须重新启动”,请按照下面步骤解决:

2.     登陆Server Manager时一直显示”请稍后……”

新建完成ARcGIS
ServerSite,设置用户名和密码。但是登陆时却发现一直处于等待状态,如下图:

图片 4

更换为IE浏览器后发现,已经可以登陆并且退出后再次登陆正常。经过多次尝试后发现这种问题只出现在Chrome浏览器或者使用Chrome内核的浏览器(如极速模式下的猎豹、搜狗、360等)中。

在查阅了一些文档和论坛后,终于找到原因和解决方案:问题的原因是由于ArcGIS
Server Site采用了dojo框架,但是Server
10.1所采用的Dojo版本本身存在一些Bug,所以会在Chrome浏览器中出现这个问题。在10.2或之后的版本中由于dojo更新这个问题已经修复了。所以我们只需要更换新版的dojo即可。

解决方案:

访问dojo下载地址下载新版1.6.2,如下图:

图片 5

解压缩后会得到dojo文件夹,内容如下:

图片 6

这时我们只需要将他们拷贝至Server相应目录下替换即可,具体路径为C:\Program
Files\ArcGIS\Server\framework\runtime\tomcat\webapps\arcgis#manager\js\dojo(安装的盘符自选),直接粘贴复制即可。

更新完成后Chrome访问恢复正常。

希望这篇文章能帮到各位。

过程描述

  错误提示有2个,第一个需要设置被动模式的路由,->->【Passive
mode setting】,设置成本机IP:

  a、重启机器,再进行安装,如果发现还有该错误,请按下面步骤

当升级的Windows XP
SP2,将安装Windows防火墙。其缺省的设置使得Windows阻止所有从ArcGIS

图片 7

  b、在开始->运行中输入regedit

Server的连接。解决这个问题,需要在Windows防火墙设置中打开80端口,135端口,ArcSOM.exe

  第二个是设置TLS协议,【FTP over TLS setting】->【Generate new
certificate…】:

  c、到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession
Manager 位置

和ArcSOC.exe。

图片 8图片 9

  d、选择文件->倒出,保存

1、启动Windows防火墙。开始 > 设置 > 控制面板 >
Windows防火墙。缺省情况下,防火墙是启

  设置好了之后点击【Generate
certificate】,然后回设置主界面点击左下角的,错误提示就解决了。

  e、在右边窗口右击PendingFileRenameOperations,选择删除,然后确认

用的,这是推荐的设置。

  

  f、重启安装,问题解决

2、点击“例外”选项卡。
3、点击“添加端口”。
4、添加下面的信息:
名称:Web Port(http)
端口号:80
类型:TCP
点击“确定”。
5、添加135端口,点击“添加端口”。
6、添加下面的信息:
名称:DCOM(ArcGIS Server)
端口号:135
类型:TCP
点击“确定”。
7、点击“添加程序”将ArcSOM.exe添加到例外。
8、点击“浏览”,并浏览到:
<ArcGIS Install Directory>\bin\ArcSOM.exe,例如
C:\Program Files\ArcGIS\bin\ArcSOM.exe
点击“确定”。
9、点击“添加程序”将ArcSOC.exe添加到例外。
10、点击“浏览”,并浏览到:
<ArcGIS Install Directory>\bin\ArcSOC.exe,例如
C:\Program Files\ArcGIS\bin\ArcSOC.exe
点击“确定”。
11、这些端口和程序入口现在将显示在程序和服务列表中。确保其之前的Check框被选中。
12、关闭Windows防火墙。

  如果还有同样问题,请检查其它注册表中是否有该值存在,如有请删掉。

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

  2、在安装SQL Server
SP3,有时候会出现:无论用windows认证还是混和认证,都出现密码错误的情况,这时查看临时目录下的sqlsp.out,会发现以下描述:

内容摘要

  [TCP/IP Sockets]Specified SQL server not found.

我们使用ArcGIS Server .net ADF来开发应用程序的时候,使用Map
WebControl的话,一般都是通过设置控件的属性来设定Host以及MapServerObject。那如何在程序运行过程中来动态的改变这些属性,以使得地图的内容发生相应的变化。下面是c#的代码:

  [TCP/IP Sockets]ConnectionOpen (Connect()).

过程描述

  其实这是SQL Server
SP3的一个小bug,在安装sp3的时候,没有监听tcp/ip端口,可以按照以下步骤进行:

‘Map1是地图控件
Map1.Host = “ServerName”;
Map1.ServerObject = “ServerObjectName”;
WebMap webMap = Map1.CreateWebMap();
IMapServer mapServer = webMap.MapServer;
IMapServerObjects mapServerObjects = mapServer as IMapServerObjects;
mapServerObjects.RefreshServerObjects();
webMap.Refresh ();

  1、打开SQL
server客户器网络实用工具和服务器网络工具,确保启用的协议中包含name
pipe,并且位置在第一位.

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

  2、确保[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerClientConnectTo]

内容摘要

  ”DSQUERY”=”DBNETLIB”.

提供的指导描述了如何创建一个简单的ArcGIS Server
ASP.NET网页。为了诊断,尽可能使用最小的应用,这样有助于测试ArcGIS
Server和.NET 应用开发框架(ADF)是否配置适当且工作正常。

  如果没有,请自己建立

过程描述

  3、停止mssql.

在运行这个例子前,在网络服务器上必须安装好.NET ADF,ArcGIS
Server已经安装并正常运行,达到所有的系统要求。
1.创建一个ASP.NET应用目录。可以按照下面步骤创建:
A. 在您的目录<drive>:\inetpub\wwwroot下创建一个目录。
B. 使用IIS管理器查看新建的目录的属性。
C. 在目录标签上,单击创建按钮,创建一个ASP.NET应用。
2.把下面的代码复制到文本编辑器中,存为*.aspx文件。然后对它做如下编辑:
A. 把esri:map标签中的Host属性改为运行着ArcGIS Server SOM(Server Object
Manager)的机器。
B.
把ServerObject改为一个运行着的MapServer服务器对象。记住服务器对象的名称区分大小写。’World’和’world’不一样。
<%@ Register TagPrefix=”esri”
Namespace=”ESRI.ArcGIS.Server.WebControls”
Assembly=”ESRI.ArcGIS.Server.WebControls, Version=9.0.0.2,
Culture=neutral, PublicKeyToken=8fc3cc631e44ad86″ %>

  4、进行安装.

<html>
<head>
</head>
<body>
<form id=”WebForm” method=”post” runat=”server”>
<esri:map id=”TheMap” UseMIMEData=”True” Width=”400px”
Height=”400px”
style=”LEFT: 200px; POSITION: relative; TOP: 30px” runat=”server”
BorderStyle=”Solid” BorderColor=”200,170,35″ BorderWidth=”10px”
ServerObject=”PoliticalEarthquakes” Host=”tao”
AutoFirstDraw=”True”>
</esri:map>
</form>
</body>
</html>
3.在ASP.NET应用目录下创建一个web.config文件。下面显示了一个web.config文件的例子。
使用ArcGIS Server机器上的agsusers组中的帐户配置这个文件。
把用户名和密码用明文写在web.config文件中,可能不是存储这个信息的安全方法。微软提供了加密机制。这个例子只是用来诊断的。
<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<system.web>
<!– Session state must be enabled for the map control –>
<sessionState mode=”InProc” />
<identity impersonate=”true” userName=”SomeDomain\SomeAcct”
password=”SomePassword” />
</system.web>
</configuration>
4.在浏览器中输入
来测试这个应用程序。
如果ArcGIS Server已经安装,.NET ADF工作正常,那么将显示一幅地图。
5.完成测试后,删除目录中的文件,- 特别是包含明文密码的web.config文件。

  这样就可以进行正确安装了。

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

  二、SQL Server补丁版本的检查

内容摘要

  SQL Server的补丁版本检查不如Windows
补丁版本检查直接,一个系统管理员,如果不了解SQL
Server版本对应的补丁号,可能也会遇到一点麻烦,因此在这说明一下,通过这样的办法判别机器是安全的办法,不会对系统产生任何影响。

虽然说ArcGIS
Server的开发技术当中最重要的技术是ArcOBjects。但是和在C/S模式下使用的ArcObjects还是会有一些差别,一个很重要的区别就是不能使用New方法来创建ArcObjects。

  1、用Isql或者SQL查询分析器登录到SQL
Server,如果是用Isql,请在cmd窗口输入isql -U
sa,然后输入密码,进入;如果是用SQL查询分析器,请从程序中启动,输入sa和密码(也可以用windows验证)。

过程描述

  2、在ISQL中输入:

1
web应用调用的是远程的Ao组件,这些Ao对象都运行在服务器ArcSoc.exe进程中,由服务器上下文(server
context)统一来创建(IServerContext::CreateObject),并服务器上下文来统一的管理和操作,比如Ao对象之间的交互,释放等。
2 ArcGIS Server是一个可分布式部署的软件,GIS
Server和Web应用可以部署在不同的机子上,而web应用的机子上只需要安装ADF运行包,只有ArcObjects的代理,不安装ArcObjects本身,因此web
应用没有能力来创建本地的ArcObjects对象,这也是不能使用New方式来创建ArcObjects的原因。

  Select @@Version;

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

  go

内容摘要

  或者SQL查询分析器中输入(其实如果不想输入,只要打开帮助的关于就可以了:))

使用ArcGIS
Server开发的web应用程序,有时候会需要把分析结果以graphics的方式临时添加到地图上,但是graphics会遮盖住下面的标注。设透明也无效。

  Select @@Version;

过程描述

  然后按执行;

解决办法:
打开ArcMap,把Serverobject中用到的地图文档(*.mxd)打开,
打开Labeling工具条,点击label weight ranking工具,
在弹出的label weight ranking对话框上,把<default>的feature
weight设为none,
停止并启动Serverobject。

  这时会返回SQL的版本信息,如下:

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

  Microsoft SQL Server 2000 – 8.00.760 (Intel X86) Dec 17 2002
14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise
Edition on Windows NT 5.0 (Build 2195: Service Pack 3)

内容摘要

  其中的8.00.760就是SQL Server的版本和补丁号。对应关系如下:

在设计阶段,使用Impersonation控件的属性页面设置用户、密码、域或机器的Identity属性的时候出错。

  8.00.194 -——————SQL Server 2000 RTM

过程描述

  8.00.384 -——————(SP1)

出错原因是微软的.Net框架认证在操作系统上没有必要的权限。
处理方法:
1、打开控制面板
2、打开管理工具页面
3、本地打开安全设置
4、打开本地策略
5、选择用户权利指派
6、选择“以操作系统方式操作”
7、添加“agsadmin”和“agsusers”两个组
8、确认本地策略设置复选框处于选定状态
9、确定退出界面
10、重新启动计算机

  8.00.534 -——————(SP2)

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

  8.00.760 -——————(SP3)

内容摘要

  这样我们就能看到SQL Server的正确版本和补丁号了。

下面的文章讲的是怎么样更新一个使用ESRI.net web controls和ArcGIS Server
9.0写的web应用,使得它能支持Arcgis Server 9.1版本。
这里讲的是ArcGIS Server 9.0的应用指的是在安装了全部Service
Packs的基础上的。

  我们也可以用xp_msver看到更详细的信息。

过程描述

Server的补丁版本检查不如Windows
补丁版本检查直接,一个系统管理员,如果不了解SQL
Server版本对应的补丁号,可能也会遇到一点麻烦,因…

使用下面的过程在9.1中来修改已有的9.0的web应用。
这些步骤对于仅仅把ArcGIS Server
9.0的应用运行在安装了9.1的机器上时候是不必要的。
1 在Microsoft Visual Studio .NET中打开web应用。
2 在HTML 视图中,用下面的语句替换已有的 @Register 语句。
<%@ Register TagPrefix=”esri”
Namespace=”ESRI.ArcGIS.Server.WebControls”
Assembly=”ESRI.ArcGIS.Server.WebControls, Version=9.1.0.722,
Culture=neutral, PublicKeyToken=8fc3cc631e44ad86″ %>
注意:”Version=”属性值必须和上面语句中的一样。
3 重新编译并保存应用。

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

内容摘要

很多线划图数据进ArcSDE库中都会有些对象转换不进去。这些对象有很大一部分是由于数据本身有自相交的情况。如果这些线划图数据只是用来做底图,而不需要做对象分析。则可以采用数据简单化操作后再转换入ArcSDE中。具体操作如下例子:

过程描述

Private Sub SimplifyPolyLine(pPolyline As esriGeometry.Polyline)
‘通过QI取得线对象的拓扑操作接口
Dim pTopologicalOperator As esriGeometry.ITopologicalOperator
Set pTopologicalOperator = pPolyline
‘执行简单化操作
pTopologicalOperator.Simplify
‘简单化操作完了的数据可以转换入ArcSDE中了
‘下面代码用来展示简单化后的线数据的每个部分
Dim pGeometryCollection As esriGeometry.IGeometryCollection
Set pGeometryCollection = pPolyline

Dim i As Long
For i = 0 To pGeometryCollection.GeometryCount – 1
Dim TempPolyline As esriGeometry.IGeometryCollection
Dim TempPath As esriGeometry.IPath

Set TempPolyline = New esriGeometry.Polyline
Set TempPath = pGeometryCollection.Geometry(i)

TempPolyline.AddGeometry TempPath
MapControl1.FlashShape TempPolyline

Set TempPath = Nothing
Set TempPolyline = Nothing
Next i

End Sub

备注:点、线、面都可以执行简单化操作。可以根据不同的业务需求来使用这些功能。

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

内容摘要

实现多个实体的联合,通过这种联合可以与其他几何实体进行空间关系判断,请看如下实例

过程描述

””””””””””””””””””””””””
dim I as interger
Dim SelectFeatureLineArr is Iarray
Set SelectFeatureLineArr = new Array
‘加入实体到array中,之后
Dim pTmpGeom As IGeometry
Dim pGeom As IGeometry
Dim pOutputGeometry As IGeometry
Dim pTopoOperator As ItopologicalOperator
Dim lFeature As iFeature
For i = 0 To SelectFeatureLineArr.Count – 1
Set lFeature = SelectFeatureLineArr.Element(i)
Set pGeom = lFeature.ShapeCopy
If i = 0 Then ‘ if its the first feature
Set pTmpGeom = pGeom
Set pOutputGeometry = pTmpGeom
Else ‘ merge the geometry of the features
Set pTopoOperator = pTmpGeom
Set pOutputGeometry = pTopoOperator.Union(pGeom)
Set pTmpGeom = pOutputGeometry
End If
Next i


内容摘要

提供了判断几何学之间空间关系的成员、方法。 其对如下产品有效:
ArcGIS Engine, ArcGIS Desktop, and ArcGIS Server.

过程描述

描述

判断两个空间实体之间在几何上是否有关联并返回
bool变量,对于一些关联的存在判断有限制(要求输入相同的尺寸)。
大部份的预先定义表示关系的操作员是互斥的。当使用时,关联操作是用来决定两个几何空间实体之间存在的特定的关系。
Description
Contains 包含指出是否这几何实体包含另一个几何实体
Crosses 交叉指出两个实体是否交叉.
Disjoint
脱节指出两个实体在几何上是不是没有共同的点.,来判断它们之间是否是横断关系
Equals 相等指出两个实体是否相同并定义了相同的点
Overlaps 输入的实体是否 重叠
Relation 两实体之间是否有定义关联存在.
Touches 相触与,指出两实体之间是否有相触与的关系.
Within 判断一个实体是否被另一个实体所包含
使用VB实例
Dim pRelOp As IrelationalOperator
Dim oneFeature As iFeature
Dim twoFeature As iFeature
Set pRelOp = oneFeature.ShapeCopy
If pRelOp.Touches(twoFeature.Shape) Then
End if


内容摘要

图层渲染是GIS应用之中十分常用的功能,所有基于ArcOjects组件的ArcGIS软件产品(如:
ArcGIS Desktop, ArcGIS Engine, ArcGIS Server),
还有ArcIMS和MapObjects(Windows Edition & Java
Edition)都提供了各种实用的渲染方法,详细列举如下:
ArcOjects提供了SimpleRenderer, UniqueValueMapRenderer,
ClassBreaksRenderer, DotDensityRenderer, ProportionalSymbolRenderer,
ChartRenderer;
ArcIMS提供了SimpleRenderer, SimpleLabelRenderer, ValueMapRenderer,
ValueMapLableRenderer, ScaleDependentRenderer, GroupRenderer;
MapObjects Windows Edition提供了ValueMapRenderer, ClassBreaksRenderer,
DotDensityRenderer, LabelRenderer, EventRenderer, ZRenderer,
GroupRenderer;
MapObjects JavaEdition提供了SimpleRenderer, ValueMapRenderer,
LabelRenderer, ScaleDependentRenderer, GroupRenderer;
跟一般的渲染功能有所不同,在ArcIMS和MapObjects的两个版本中都提供的GroupRender它本身并不利用任何图层的属性来对图层进行渲染,而是通过借用其他Renderer的功能,把它们组合起来,实现对同一个图层进行不同类型的渲染效果的同时展现,比如对一个包含了人口总数量,男性人口数量和女性人口数量的世界地图图层(面状)先利用人口总数量属性现实分类渲染的效果,同时利用男性人口数量和女性人口数量属性用直棒图选然展现出两个数值比较的效果。
可惜的是ArcObjects中偏偏没有实现这种渲染功能。不过基于COM技术的ArcObjects所具有的可扩展性为我们自己去实现”GroupRenderer”提供了可能。

过程描述

ArcObjects中,图层的渲染效果是通过实例化一个实现了某个渲染接口(ISimpleRenderer,
IUniqueValueMapRenderer, IClassBreaksRenderer, IDotDensityRenderer,
IProportionalSymbolRenderer,
IChartRenderer之一)的CoClass类,然后作为该渲染接口类型的变量赋给图层(IGeoFeatureLayer)的Renderer属性来实现的。这个Renderer属性是IFeatureRenderer接口类型,IFeatureRenderer中定义了一个叫做Draw的方法,其实ArcObjects中各种各样的渲染效果就是通过这个Draw方法画出来的,因为各个渲染效果CoClass都实现了IFeatureRenderer接口。所以要实现”GroupRenderer”效果,只要实现了IFeatureRenderer接口就可以了。以下提供VB和ArcGIS
Server Java API的例程供大家参考:
[VB6: CustomGroupRenderer.cls]
Option Explicit

Implements IFeatureRenderer

Private m_Renderers As Collection

Private Sub Class_Initialize()
On Error GoTo ErrHand
Set m_Renderers = New Collection
GoTo EndProc
ErrHand:
MsgBox “Class Initialize” & Err.Description
EndProc:
Exit Sub
End Sub

Private Function IFeatureRenderer_CanRender(ByVal featClass As
esriGeoDatabase.IFeatureClass, ByVal Display As esriDisplay.IDisplay) As
Boolean
On Error GoTo ErrHand
If Not featClass.ShapeType = esriGeometryNull Then
IFeatureRenderer_CanRender = True
Else
IFeatureRenderer_CanRender = False
End If
GoTo EndProc
ErrHand:
MsgBox “CanRender” & Err.Description
EndProc:
Exit Function
End Function

Private Sub IFeatureRenderer_Draw(ByVal Cursor As
esriGeoDatabase.IFeatureCursor, _
ByVal drawPhase As esriSystem.esriDrawPhase, _
ByVal Display As esriDisplay.IDisplay, _
ByVal trackCancel As esriSystem.ITrackCancel)
On Error GoTo ErrHand
Dim i As Integer
For i = 1 To m_Renderers.Count
Dim r As IFeatureRenderer
Set r = m_Renderers.Item(i)
If (TypeOf r Is ISimpleRenderer) And (drawPhase = esriDPGeography)
Then
r.Draw Cursor, drawPhase, Display, trackCancel
ElseIf (TypeOf r Is IUniqueValueRenderer) And (drawPhase =
esriDPGeography) Then
r.Draw Cursor, drawPhase, Display, trackCancel
ElseIf (TypeOf r Is IClassBreaksRenderer) And (drawPhase =
esriDPGeography) Then
r.Draw Cursor, drawPhase, Display, trackCancel
ElseIf (TypeOf r Is IDotDensityRenderer) And (drawPhase =
esriDPGeography) Then
r.Draw Cursor, drawPhase, Display, trackCancel
ElseIf (TypeOf r Is IProportionalSymbolRenderer) And (drawPhase =
esriDPAnnotation) Then
r.Draw Cursor, drawPhase, Display, trackCancel
ElseIf (TypeOf r Is IChartRenderer) And (drawPhase = esriDPAnnotation)
Then
r.Draw Cursor, drawPhase, Display, trackCancel
End If
Next i
GoTo EndProc
ErrHand:
MsgBox “Draw” & Err.Description
EndProc:
Exit Sub
End Sub

Private Sub IFeatureRenderer_PrepareFilter(ByVal pFeatClass As
esriGeoDatabase.IFeatureClass, ByVal QueryFilter As
esriGeoDatabase.IQueryFilter)
Dim i As Integer
For i = 1 To m_Renderers.Count
Dim r As IFeatureRenderer
Set r = m_Renderers.Item(i)
r.PrepareFilter pFeatClass, QueryFilter
Next i
End Sub

Private Property Set IFeatureRenderer_ExclusionSet(ByVal pIDSet As
esriCarto.IFeatureIDSet)

End Property

Private Property Get IFeatureRenderer_RenderPhase(ByVal drawPhase As
esriSystem.esriDrawPhase) As Boolean
On Error GoTo ErrHand
IFeatureRenderer_RenderPhase = True
Exit Property
ErrHand:
MsgBox “Get RenderPhase” & Err.Description
End Property

Private Property Get IFeatureRenderer_SymbolByFeature(ByVal Feature As
esriGeoDatabase.IFeature) As esriDisplay.ISymbol
On Error GoTo ErrHand
Dim pSym As ISymbol
Set pSym = m_LegendGroup.Class(0).Symbol
Set IFeatureRenderer_SymbolByFeature = pSym
GoTo EndProc
ErrHand:
MsgBox Err.Description
EndProc:
Set pSym = Nothing
Exit Property
End Property

Public Sub AddRenderer(ByVal renderer As esriCarto.IFeatureRenderer)
m_Renderers.Add renderer

End Sub

[ArcGIS Server Java API]

//IGroupRenderer.java

package com.esri.arcgis.samples.carto.renderers;

import com.linar.jintegra.AutomationException;
import java.io.IOException;
import java.io.Serializable;

public interface IGroupRenderer extends Serializable {
public static final int IID27AC33C1_506B_41F6_B2F0_D6F163CB7699 =
1;
public static final int xxDummy = 0;
public static final String IID =
“27AC33C1-506B-41F6-B2F0-D6F163CB7699”;

public void addRenderer(Object iRenderer) throws IOException,
AutomationException;
}

//CustomGroupRenderer.java

package com.esri.arcgis.samples.carto.renderers;

import java.io.IOException;
import java.util.ArrayList;
import com.esri.arcgis.server.*;
import com.esri.arcgis.carto.*;
import com.esri.arcgis.display.*;
import com.esri.arcgis.geodatabase.*;
import com.esri.arcgis.system.*;
import com.esri.arcgis.geometry.esriGeometryType;
import com.esri.arcgis.system.esriDrawPhase;
import com.linar.jintegra.AutomationException;

public class CustomGroupRenderer implements IFeatureRenderer,
IGroupRenderer {
private ILegendGroup pLegendGroup;
private IServerContext serverContext;
private ArrayList renderers = new ArrayList();

public CustomGroupRenderer(IServerContext sc) {
try {
serverContext = sc;
pLegendGroup = new
ILegendGroupProxy(serverContext.createObject(LegendGroup.getClsid()));
ILegendClass pLegendClass = new
ILegendClassProxy(sc.createObject(LegendClass.getClsid()));
pLegendGroup.addClass(pLegendClass);
pLegendGroup.setVisible(true);
pLegendGroup.setEditable(true);
} catch (AutomationException e) {
System.out.println(“AutomationException ” + e);
} catch (IOException e) {
System.out.println(“IOException ” + e);
}
}

public boolean canRender(IFeatureClass iFeatureClass, IDisplay iDisplay)
throws
IOException, AutomationException {
if (iFeatureClass.getShapeType() == esriGeometryType.esriGeometryNull)
{
return true;
} else {
return false;
}
}

public void prepareFilter(IFeatureClass iFeatureClass,
IQueryFilter iQueryFilter) throws IOException,
AutomationException {
if (renderers.size() > 0) {
for (int i = 0; i < renderers.size(); i++) {
IFeatureRenderer pFR = new IFeatureRendererProxy(renderers.get(i));
pFR.prepareFilter(iFeatureClass, iQueryFilter);
}
}
}

public void draw(IFeatureCursor iFeatureCursor, int drawPhase,
IDisplay iDisplay, ITrackCancel iTrackCancel) throws
IOException, AutomationException {
if (renderers.size() > 0) {
for (int i = 0; i < renderers.size(); i++) {
Object obj = renderers.get(i);
if (obj instanceof ISimpleRenderer && drawPhase ==
esriDrawPhase.esriDPGeography) {
IFeatureRenderer pFR = new IFeatureRendererProxy(obj);
pFR.draw(iFeatureCursor, drawPhase, iDisplay, iTrackCancel);
}
if (obj instanceof IUniqueValueRenderer && drawPhase ==
esriDrawPhase.esriDPGeography) {
IFeatureRenderer pFR = new IFeatureRendererProxy(obj);
pFR.draw(iFeatureCursor, drawPhase, iDisplay, iTrackCancel);
}
if (obj instanceof IClassBreaksRenderer && drawPhase ==
esriDrawPhase.esriDPGeography) {
IFeatureRenderer pFR = new IFeatureRendererProxy(obj);
pFR.draw(iFeatureCursor, drawPhase, iDisplay, iTrackCancel);
}
if (obj instanceof IDotDensityRenderer && drawPhase ==
esriDrawPhase.esriDPGeography) {
IFeatureRenderer pFR = new IFeatureRendererProxy(obj);
pFR.draw(iFeatureCursor, drawPhase, iDisplay, iTrackCancel);
}
if (obj instanceof IProportionalSymbolRenderer && drawPhase ==
esriDrawPhase.esriDPAnnotation) {
IFeatureRenderer pFR = new IFeatureRendererProxy(obj);
pFR.draw(iFeatureCursor, drawPhase, iDisplay, iTrackCancel);
}
if (obj instanceof IChartRenderer && drawPhase ==
esriDrawPhase.esriDPAnnotation) {
IFeatureRenderer pFR = new IFeatureRendererProxy(obj);
pFR.draw(iFeatureCursor, drawPhase, iDisplay, iTrackCancel);
}
}
}
}

public ISymbol getSymbolByFeature(IFeature iFeature) throws
IOException,
AutomationException {
ISymbol pSym = pLegendGroup.esri_getClass(0).getSymbol();
return pSym;
}

public boolean isRenderPhase(int drawPhase) throws IOException,
AutomationException {
return true;
}

public void setExclusionSetByRef(IFeatureIDSet iFeatureIDSet) throws
IOException, AutomationException {

}

public void addRenderer(Object iRenderer) throws
IOException, AutomationException {
renderers.add(iRenderer);
}
}

如果想要在TOC控件上动态的展现出渲染的效果,还需实现ILegendInfo接口,这里不做详细说明。

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图