2013年9月16日星期一

在Portal for ArcGIS中设置Federated Servers时请求报500错误的解决办法

Portal for ArcGIS 10.2版本开始,可在Portal的组织管理中设置Federated Servers即联合服务器,从而通过Portal for ArcGIS来托管与之联合的ArcGIS for Server站点的安全性,使得两者的单点登录,以及后续使联合服务器变成Hosting Server(托管服务器),并在其上发布托管服务成为可能。关于两者的介绍和具体操作步骤请参考相关文档。这里说一下设置联合服务器时一个常见问题的解决办法。
在Portal的组织管理页面中,添加联合服务器时,有可能会出现如下错误:image

image
具体请求是Portal的代理页面通过https方式访问要关联的ArcGIS for Server站点token服务时服务器端报500 internal error。
image
直接通过https方式访问上述token服务地址:
image
发现此证书不受信任,有安全警告;而如果通过https方式访问Portal,
image

证书是已经导入机器的受信任根证书颁发机构的,所以证书可信,没有安全警告。你可能还发现,上面两个证书的颁发者,颁发对象均不一样,说明这是两个完全不同的证书。这是因为第一个没有受信的证书是ArcGIS for Server自带的tomcat中6443端口使用的证书,此证书是在安装完ArcGIS for Server后,第一次创建站点时就会自动生成的,存放在config-store中该机器文件夹下的key stroe中;而后面的证书是我在IIS中自己创建的域证书,是IIS中的443端口使用的证书。如果你在联合服务器时遇到同样错误,很可能会发现两个证书的颁发者和颁发对象是同名的(大小写不一样),这是通常情况,我这里不同名是因为装完ArcGIS for Server之后,安装Portal之前修改了机器名。修改机器名为full qualified domain name步骤是必须的,应该在装ArcGIS for Server之前完成。
经过与同事讨论及实验得知,最初那个500错误是因为ArcGIS for Server站点6443端口安全证书不受信任引起的。所以解决办法有以下几种:

  • 同Portal的443端口(其实Portal是7443端口,通过443是Web Adaptor的端口)所使用证书的处理办法一样,将6443端口的证书也导入机器的受信区域。如果导入成功,浏览器访问ArcGIS for Server的6443端口应该不再有警告信息,如此在Portal中联合服务器时就不会报500错误了;
  • 既然IIS中自己创建的证书已经设为可信了,那么可以指定ArcGIS for Server的6443端口使用同样的证书,则通过https访问6443端口时自然也不会报警告信息。大致步骤是,从iis中导出证书,在ArcGIS for Server中通过admin rest api将证书导入到机器中,然后编辑机器资源,指定该机器使用该证书。具体可参考相关的admin api帮助。

此处我遇到的错误是通过第二个办法解决的。补充:如果你和我一样,6443使用的证书的颁发对象与当前机器名不同,建议使用admin rest api,重新生成一个颁发对象与当前机器名相同的自签名证书,之后再将其导入机器的受信区域。

2013年8月23日星期五

ArcMap加载WMTS服务后显示空白的可能原因

在ArcMap(10.1/10.2)中,加载一个WMTS服务后,如果显示空白,但用fiddler查看请求,已经下载了正确的图片,那么很可能是WMTS规范中要求的WMTSCapabilities.xml文件输出了错误的图片格式所导致的。
比如在ArcMap中,添加由Portable Basemap Server输出的WMTS服务时,Google Map街道图无法显示(空白),
image  用Fiddler查看,其实已经下载了正确的切片,
image 而产生此问题的原因正如上图两处红框所示,目前版本(3.0)的PBS输出的WMTS服务,将在线地图的切片格式在WMTSCapabilities.xml文件中统一指定成了JPG格式,而Google街道图的切片实际上是PNG格式的。对于Google影像图来说,切片格式是JPG,所以在ArcMap中可以正常显示:
image 有网友反映QGIS中也无法加载PBS的部分WMTS服务, 原因也是如此。下个版本的Portable Basemap Server会将图片格式选项留在CustomOnlineMaps.xml文件中由用户自己指定,所以会修复此bug。
当然PBS还将继续加入更多实用功能,敬请期待。

2013年5月10日星期五

Portable Basemap Server发布3.0版本

更新内容:

~添加以Windows服务方式运行功能,即使不登陆系统,也可通过REST Admin API对PBS进行管理;
~发布的缓存服务增加对OGC WMTS规范的支持。详见这里
~数据源增加对OGC WMS服务的支持。详见这里
~数据源增加对高德本地缓存文件的支持。详见这里
~预览界面中可显示切片来源(动态生成/文件缓存/内存缓存,以不同底色区分);
~添加日志功能;
~修复已知bug;

下载地址:https://geopbs.codeplex.com/
详见:http://blog.newnaw.com/?p=890

2013年4月25日星期四

在ArcGIS Server REST API中的Export Map操作里进行空间查询

使用ArcGIS API for Javascript/Flex/Silverlight有一段时间的朋友应该知道,客户端动态地图服务的显示是由服务器端ArcGIS Server REST API中的Export Map操作完成的。而Export Map这个操作中有一个layerDefs参数,允许传入sql语句进行属性过滤。如果想在出图时,除了属性过滤,同时也进行空间过滤该怎么办(类似query的geometry空间查询,注意和bbox参数区别)?
乍一看export操作并没有像服务子图层query操作一样的geometry参数,而我遇到的地图服务也只有一个点图层。一开始想首先用子图层的query进行空间查询,设置returnIdsOnly为true,之后将这些符合空间条件要素的ids写到layerDefs里,类似”0:objectid IN (1,2,3,4…)”。但最后发现,layerDefs这个参数是接受空间SQL语句的,所以只需构造好空间查询的SQL语句,写入layerDefs进行过滤即可获得想要的结果。
比如想在出图时,限定只输出某个矩形范围内的要素,则可用类似”0:sde.st_within (shape, sde.st_geometry ('polygon ((12818466 4196179,13308886 4196179,13308886 4499482,12818466 4499482,12818466 4196179))', 3857)) = 't'”的语句作为空间过滤条件即可。
image 同样ArcMap中,图层对话框的Definition Query标签页,也接受空间SQL语句。
image  背景:这是在使用动态缓存图层时遇到的问题。

2013年2月21日星期四

此刻,无法自抑

阿琳的病情却在逐步地恶化。1945年6月16日,她去世了,那时他们结婚才三年,离第一次核爆炸只有一个月了。理查德陪她度过了生命的最后一刻,可是他很麻木,仿佛失去了知觉。他对自己的缺乏感情感到很吃惊。几个星期以后,当他路过一家商店的时候,看到了一件连衣裙,他想要是阿琳穿上一定很美。这时他才突然悲从中来,他失声痛哭,无法自抑。

此刻,无法自抑

出处:the whole universe is in a glass of wine
更多:百度百科:理查德·费曼

2013年1月27日星期日

ArcGIS 10.1 for Server加入站点时报错Unable to access the config store on …

在一台Windows Server 2003 R2 X64 SP2机器上装好ArcGIS 10.1 for Server后,加入已有site时,Manager报错:

Failed to join the site 'http://esri-wzf:6080/arcgis/admin/'. Server machine 'http://esri-wzf:6080/arcgis/admin//machines/register' returned an error. 'Failed to register the server machine 'WIN03'. Server machine 'http://WIN03:6080/arcgis/admin' returned an error. 'Unable to access the config store on '\\esri-wzf\arcgisserver\config-store'.''

排查和解决办法:

  1. 确保config-store目录的权限正确:文件夹属性中“共享”和“安全”两个标签页中都需要让系统账户(默认为“arcgis”)具有读写权限;
  2. 确保ArcGIS Server的Windows服务的登陆账户为ArcGIS的系统账户(默认为“arcgis”),而不是localsystem。因为以localsystem启动的Windows服务进程对局域网共享位置没有访问权限。正确设置如下:
    image

这回问题出在第二点,ArcGIS 10.1 for Server的安装进行过一次修复,之后Windows服务的启动账户就变成localsystem了。改回默认的arcgis账户即可。