Tag Archives: ArcGIS Server

ArcGIS Server网站发布后地图显示空白的原因之一

        一般来说,在地图网站发布后,如果地图区域显示为空白,但可以看到其他控件,可能是因为:1、引用的service运行不正常;2、通过local方式连接而没有添加arcgis identity;3、Web Server机器名中含有下划线“_”。但实际情况可能不止这些,碰到这个问题后只能耐心寻找原因来解决问题。
        今天刚好碰到了这个情况:用模板程序发布一个网站,mapresource manager中添加了一个经过cache的map service,本机浏览正常,但通过外网浏览的时候,界面显示正常,地图区域空白;如果引用一个没有经过cache的服务的话,外网和本机浏览都正常。网络是这样的,web server和gis server都在本机上,本机处于局域网中,通过路由的转发规则设置外网访问网络ip时自动转到本机ip上来。cache和非cache的服务区别就在于显示地图时,前者是直接获取服务器上的图片,而后者是gis server动态生成图片然后发送到客户端。那么可以看出是在获取缓存图片时出问题了,而本机可以访问到,外网却访问不到,那么估计可能和虚拟路径有关。在外网机器上查看http请求,发现如图情况:

        可以看出,在获取其他控件的图片时,使用了网络的对外ip,而获取cache图片时使用的确实本机名。毫无疑问是cache路径的虚拟目录设置不对。一般安装完ags后,设置cache,job,output所对应的虚拟路径时,习惯用hostname作为域名,这和iis设置相符,但如果要对外发布的话,要考虑到这个情况。更改了cache路径的虚拟目录后,外网浏览就程序就正常了。

任务管理器中arcsom.exe和arcsoc.exe的个数问题

        安装了ArcGIS Server的机器,当打开任务管理器的时候,会看到里面有arcsom.exe和arcsoc.exe进程,但它们的数量具体是如何决定的呢?以下的分析仅针对单机配置的情况(假定所有部件都安装在一台机器上),对于分布式的安装,可以此类推。
        GIS Server是由一个SOM(Server Object Manager)和若干个SOC(Server Object Container)机器组成。SOM会在机器里以arcgissom账户启动一个ArcSOM.exe的进程,这个进程负责管理(启动和停止)其他SOC进程(ArcSOC.exe),SOC进程虽然是由SOM启动,但是以arcgissoc账户运行的。arcsom.exe启动时,会自动启动两个arcsoc.exe,一个用于记录AGS的日志,一个用于清空特定的工作目录。这两个arcsoc.exe在任务管理器中可以根据所占用的内存数与其他arcsoc.exe区分开来,如图,占用内存较少的两个arcsoc.exe便是由SOM进程自动启动的,而其他的arcsoc.exe则是由具体service启动的。

        插入一些概念。用户请求一个service时,是和该service的一个instance打交道。service有pooled和non pooled两种。对于pooled service来说,一个用户(或者应用程序)请求该服务时,会随机获得一个该服务已经创建的instance的引用,由该instance对请求做出响应;请求完成后,用户会立即释放该instance的引用,使其返回假想的instance pool中,用户发出另一个请求,重复上面的过程。如果是non pooled service,用户第一次发出请求时,也会随机获得该service已经创建的一个instance引用,但请求处理完成后,该用户继续持有对该instance的引用,直到用户断开与服务器的连接(结束程序),该instance会被销毁,然后SOM会创建一个新的instance来维持数量。对于pooled service,又有low isolation和high isolation两种。high isolation是指service的每个instance都会独占一个进程(arcsoc.exe),low isolation则是指一个进程内可保有多个(默认是8哥,最多可达256个)instance(就是所谓的多线程)。low isolation的好处是可以启动相对少的arcsoc.exe来维持同样数量的instance,节约服务器的内存资源;但如果一个arcsoc.exe崩溃,那么里面的所有instance都会被销毁,即使用户正在使用它们。high isolation的优缺点则与之相反。一般来说,对于pooled service使用high isolation设置。non pooled service的instance总是独占一个进程(同high isolation)。另外可以指定一个服务的最小和最大instance数目,服务启动时会自动创建最小数目的instance等待调用;当创建的instance数目达到最大数量时,所有的请求都会进入等待队列。
        至此,可以来分析一个具体的案例了。现在机器上总共有2个服务:
World:pooled,low isolation(8 instance per process),min-instance:9, max-instance:16 ,随机启动
China: non pooled ,min-instance:2, max-instance:4,手动启动。
        开机,SOM启动一个arcsom.exe,随后启动两个arcsoc.exe;World服务启动,创建9个instance,其中8个instance公用一个arcsoc.exe,剩下一个instance启动另外一个arcsoc.exe。此时机器中共有1个arcsom.exe,4个arcsoc.exe。此时手动启动China服务,创建2个instance,每个instance会启动一个arcsoc.exe。此时,机器中共有1个arcsom.exe,6个arcsoc.exe。
        观察统计可知,最小instance数量为1的服务启动时间平均在17秒左右(cpu:Intel T7200)。可以看出,对于经常不用的服务,我们可以将它设置成手动启动,一来节约内存,二来加快机器启动速度。

ArcGIS Server中使用多个地图服务时的注意事项

        作为网络应用中的地图数据,通常有不同的来源,或者用途不同,经常被组织并发布成不同的服务,在一个应用程序中使用多个地图服务是常有的事情。
        如果一个web app中使用了多个地图服务,那么就需要将其中的一个服务设置成为Map控件的Primary Map Resource,之后,该服务变决定了整个地图的coordinate system和zoom levels。比如说有一个服务world,使用WGS84坐标系,做了4个比例尺的cache,将它设置成了Primary Map Resource。以下的情况会发生:
1、如果另有一个使用Xi’an 1980坐标系的名为China的dynamic service要和world叠加:
        web app的zoom level只有4级,与world服务一致;在呈现时,world的数据是去取cache的,而China的数据是在服务器上经过动态投影,然后与world叠加起来;

2、如果另有一个使用Xi’an 1980坐标系的名为China的cached service(做了3级缓存,其中有两个比例尺与world中的两个比例尺一致)要和world叠加:
        如下图:

        A是China服务,B是world服务。那么web app的zoom level还是4级,这是world决定的。呈现时,world服务是取cache,而China服务不管是哪级比例尺,都是经过服务器动态投影成WGS84坐标系后,动态生成图片进行叠加(到这里,China服务的所有cache已经是白做了);而且,China只能在比例尺缩放到2、3、4时看到,这是因为,比例尺1 world服务没有,所以web app中没有,而比例尺5超过了China cache时的最大比例尺,即使是动态生成图片也不会创建。对于cached service,因为比例尺级别不符,动态生成图片显示时,超过cache时最大、最小比例尺级别的比例尺是不会显示的;

3、同2类似,cached service,还是3个级别,不过这回China的坐标系也是WGS84:
        那么在缩放到比例尺2、4的时候,两个服务都是取cache;比例尺3的时候,world取cache,China动态创建,不过不用动态投影了;比例尺5的时候China不可见;

4、China在做cache时,与world比例尺完全相同,坐标系相同:
        那么,这种情况是最理想的,呈现数据时均取cache,速度最快。

        所以,如果要将自己的数据与ArcGIS online的数据叠加使用,那么:1、应该选择后者为Primary Map Resource(有一种情况下,可以将自己的服务作为Primary Map Resource,就是自己数据的坐标系与ArcGIS Online或Google Map的坐标系相同,但cache的比例尺级别只是它们其中一个子集。);2、对于自己数据的地图文档,在data frame中将坐标系选择成Predefined > Geographic Coordinate Systems > World > WGS 1984,ArcMap会将你的数据动态投影到该坐标系下;3、做cache的时候选择load an existing tiling scheme from ArcGIS Online Services,这样能保证比例尺级别与其相同,ArcGIS Online默认有十几级cache,对于自己的数据,可以创建其中的几级,但可能出现的情况请参照前面的分析。对于要和Google Map叠加的数据,步骤也是上面的1、2、3,注意在2中要选择:Predefined > Projected Coordinate Systems > World > WGS 1984 Web Mercator。
        如果在步骤3中,点击load an existing tiling scheme时出错,那很有可能是你跳过了步骤2。