Tag Archives: ArcGIS Server

ArcGIS for Server中PublishingTools启动后又崩溃的解决办法

  • 现象:ArcGIS for Server安装完成后,会自动创建并启动系统级别的几个GP服务,比如用于生成缓存切片的CachingTools服务,用于发布所有服务的PublishingTools服务等。这次安装完ArcGIS for Server后,发布一个服务失败。去Manager里查看,发现PublishingTools的GP服务是停止状态,启动之,提示成功,但几分钟该服务又停止了。在日志中看到如下信息:Service containing process crashed for ‘System/PublishingTools.GPServer’.

image

  • 原因:Google搜到了这个帖子,发现是注册表中记录的ArcGIS for Server所使用的64位Python安装路径出错引起的。在注册表中查找HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore2.7这个位置,

image发现记录的64位Python安装路径是C:Python271408420255115ArcGISX6410.3,这个路径是之前用脚本安装Server时的遗留路径,新的有效路径已经改为C:Python27_x64ArcGISX6410.3了。产生这个错误的原因可能有所不同,我这里是因为使用了自定义的脚本重新安装ArcGIS for Server导致的。

  • 解决:将HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore2.7注册表路径下所有包含安装路径的键值修改成当前的有效安装路径之后,就可以成功启动PublishingTools的GP服务了。

快速实现ArcGIS缓存切片线性偏移的办法

  来自客户的需求:某省范围创建大比例尺缓存切片的工作已经全部完成,但由于不可抗拒因素,生产缓存切片的原始矢量数据被线性偏移了,有什么办法能够在不重新创建缓存的基础上,能够使得现有切片和偏移后的矢量数据准确叠加,并且地理坐标与偏移后的矢量数据保持一致?
  问题分析:站在客户端的角度来分析此问题。客户端绘制切片的过程是,地图缩放或平移后,获得当前屏幕对应的地理坐标范围,通过计算,获得与当前地理范围相交的所有切片的行列号,然后下载并拼接显示。计算的过程可参考《ArcGIS Server的切图原理深入》《ArcGIS Server 10中的切图/缓存机制深入》。计算的过程中,有三个关键变量:缓存策略(Tiling Scheme)的切图原点(TileOrigin),当前比例尺的分辨率(Resolution)以及当前屏幕的地理范围。可以看出,客户端在加载切片时,后两个变量即当前比例尺的分辨率与客户端当前屏幕的地理范围都是无法改变的,所以我们能做出干预的就是切图原点这个变量了。
  解决办法:通过计算比较可以得知,只需修改conf.xml文件,对切图原点(TileOrigin中的X和Y)进行偏移,偏移量和矢量数据的偏移保持一致,即可达到将缓存切片与偏移后的矢量数据准确叠加的目的。由于没有对conf.xml中的SpatialReference信息进行修改,所以地理坐标依然准确(与偏移后保持一致)。注:修改conf.xml中的参数后,需要重启缓存地图服务方可使改动生效。

  下图中,绿色的点是原始数据发布的动态地图服务,红色的点是偏移后的数据发布的动态地图服务,多边形底图是经过缓存切片的缓存地图服务。此时未对TileOrigin参数修改。
image  下图为修改了TileOrigin参数并重启缓存地图服务后的效果。
image

Portable Basemap Server发布3.0版本

更新内容:

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

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

在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  背景:这是在使用动态缓存图层时遇到的问题。

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-wzfarcgisserverconfig-store’.”

  排查和解决办法:

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

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

Portable Basemap Server发布2.0.7版本

更新内容:

~为影像数据源增加本地缓存(.cache文件)功能。详见这里
~在线地图转换/下载到MBTiles格式时,增加按Shapefile文件范围下载功能。详见这里
~为转换后的MBTiles文件增加了”压缩”选项,某些情况下可大幅减小MBTiles文件体积。详见这里
下载地址:https://geopbs.codeplex.com/
详见:https://blog.newnaw.com/?p=890

Portable Basemap Server发布2.0.6版本

更新内容:
~Portable Basemap Server已在CodePlex上开源,LGPL协议;
~添加ArcGIS Cache/在线地图数据源到MBTiles格式(.mbtiles)的转换/下载工具。详见这里
~为在线地图数据源添加本地缓存功能。详见这里
~改进ArcGIS Tile Package(.tpk)格式文件的读取速度;
~修复已知bug;
详见:https://blog.newnaw.com/?p=890

ArcGIS 10.1 for Server机器判断本机是否已经加入site的依据

  在一台机器上安装ArcGIS 10.1 for Server后,它还无法立即工作,必须将其加入site(的cluster)之中才行。首次登录manager时,也会询问创建新的site还是加入已有的site;如果已经加入site,登录manager则会显示该site的管理目录。那么机器自身是如何判断出自己是否已经加入site了呢?
  依据就在于Program FilesArcGISServerframeworketc目录下的两个xml文件,config-store-connection.xml和machine-config.xml。加入site时会在本机创建这两个文件,退出site时会删除之。前者记录site的公用信息,后者记录本机在site中的信息,具体内容大家可以自己查看。
  登录manager时会读取这两个文件,如果找不到,则认为自己没有加入site,会询问创建新site还是加入已有site;如果有这两个文件,会首先访问site的config-store目录验证其内容,合法的情况下就打开site管理目录。 如果在一台机器关机时,从site中将其删除,开机后会根据config-store-connection.xml内容去site的config-store目录中验证,发现自己已经被从site中移除后,会自己删除本机的这两个xml文件。
  此外,如果你的机器已经加入了site A,但现在需要临时加入site B去做一些工作,就不用在admin api去删除site A了,只需将上述两个xml文件先转移到别的地方,然后登录manager,选择加入site B即可;之前site A的config-store内容可以保留,以便将先前挪走的两个xml文件复原后(需要重启ArcGIS Server服务),登录manager即可直接返回site A。

ArcGIS 10.1 for Server中Web Adaptor的工作原理

  ArcGIS 10.1 for Server的安装目录中,都会内置一个tomcat(Program FilesArcGISServerframeworkruntimetomcat),无需单独的Web Server即可发布各种GIS服务(对于熟悉.NET的朋友来说,更省去单独安装和配置IIS的步骤);AGS应用程序的端口号也由之前版本的80(ArcGIS Server for .NET)和8099/8399(ArcGIS Server for Java)统一到了6080上,比如http://localhost:6080/arcgis/rest/serviceshttp://localhost:6080/arcgis/manager等。但对于内置的这个tomcat,我们并不能进行过多的操作,如果需要部署Web应用或通过别的端口来访问ArcGIS for Server的服务,这时就需要用到新的组件:Web Adaptor了。
  Web Adaptor实际上是安装在Web Server机器上的一个Web应用程序,负责将Web Server接收到的GIS请求转发到ArcGIS Server site内的GIS Server机器上去。通过Adaptor这个桥梁,我们就能使ArcGIS for Server利用到企业级Web Server的诸多优势。根据安装帮助中的解释,安装Web Adaptor后主要有以下好处:

  • 将单独的企业级Web Server集成到ArcGIS for Server的部署架构中来。可以将利用ArcGIS for Server服务的Web应用部署到Web Server上去;可以为site内所有的GIS Server提供不含有6080端口及arcgis等字样的统一访问入口点;
  • 可阻止最终用户通过Web Adaptor的访问地址连接到ArcGIS for Server的相关管理程序。比如用户如果得知了类似6080端口的GIS服务访问地址,就可通过固定的url地址访问到Manger,Admin api等涉及到整个站点操作的内置应用。而Web Adaptor给我们提供了选项,可禁止用户通过Web Adaptor暴露出的GIS服务地址访问到这些管理应用。

  此外,相对于site内的多台GIS Server机器,Web Adaptor还可以再次(除了Web Server集群外)起到负载均衡的作用,这在大并发量的情况下会比较有效。假设一个site内有n台GIS Server,它们所能处理的最大并发请求是1w个;根据ArcGIS for Server中p2p的实时通信架构,当我们将1w个并发请求发送到任一GIS Server的tomcat上时,GIS Server之间会自动以轮询(默认设置)的方式处理这些请求,GIS Server们完全可以及时响应;但1w个Web请求会首先使接收请求的这个tomcat过载,产生瓶颈。如果有了Web Adaptor,当这1w个请求到达Web Server(集群)时,Adaptor会将这些请求轮询发送到每个可用的GIS Server去,这样每个tomcat就只需支持1w/n个并发即可,可最大限度利用硬件资源。
  以IIS中的Web Adaptor为例(经过Java高手验证WebLogic和WebSphere的Adaptor工作过程与此是完全一致的),看看反编译后的代码。通过查看inetpubwwwrootarcgisWeb.config文件得知,IIS中的Web Adaptor主要的工作过程都集中在ESRI.ArcGIS.WebAdaptor.dll(在GAC目录中)里。这个dll里首先找到两个类:
image  一个Node就对应一个GIS Server机器,_healthy标记该机器的可用状态;NodeManager是所有Node的管理类。Web Adaptor启动时,会调用WebAdaptorConfig.GetMachines()方法,此方法会向http://siteip:port/arcgis/admin/machines发送get请求,获取site内所有GIS Server机器的列表,然后利用UpdateNodeList方法保存在NodeManager类中,并写入WebAdaptor.config文件。
  此外,最重要的是一个叫AGSHandler的类,它实现了IHttpHandler接口:
image  发送到Web Server的GIS请求都会由其中的ProcessRequest方法进行处理。前面说过Web Adaptor是以轮询方式转发请求的,而_currentNodeIndex便记录了请求转发目标GIS Server的在Nodes列表中的索引:
image  Web Adaptor接收到发到Web Server的GIS请求后,首先会读取初始化时保存的WebAdaptor.config配置文件并查看里面存储的GIS Server机器列表,如果读取失败或者机器个数为0,都会响应500的错误。如1所示;接下来会利用try里的TransferRequest方法将请求转发到具体的GIS Server(的tomcat)上去,如果转发的这个机器没有响应,则会在catch中将此机器利用MarkUnHealthy方法标记为不可用;而不论当前节点是否成功接收请求,TransferRequest方法中都会将_currentNodeIndex节点加一,保证下一个请求发送到下一台GIS Server上去,以实现轮询请求的事实:
image image  最后来看看Web Adaptor是如何根据配置文件的间隔时间去追询标记为下线机器的状态,在机器上线后又将它们加回可用机器列表的:
imageimageimage  可以看出,Web Adaptor检测到没有响应的机器后,除了标记其为不可用,也会同时启动一个定时器,此定时器逝去配置文件中的检测下线机器状态时间间隔(分钟)后,会立即将这台机器重新标记为可用,而不会去检测它事实上是否可用。判断机器是否真正可用的过程还是通过前面TransferRequest方法来完成的,即直接向其转发请求,如正常响应,证明其已经在线;如不能正常响应,则再次标记其不可用,重新启动定时器进入下一个轮回…
  大家可以想一想,整个过程是否有不合理的地方呢?

ArcSDE 10.1 for PostgreSQL on Windows安装

  ArcGIS换了10.1后,需要安装SDE,按照以前的习惯依然选用PostgreSQL。但10.1的SDE安装步骤变化不小,记录下来供有需要的朋友参考。
  首先,安装介质上不再自带PostgreSQL数据库的安装文件了,需要自己下载。系统要求上指明支持的版本是9.0.5 64bit(所有Enterprise SDE只支持64位的数据库),我在官网上下载了最接近的9.0.8版本,安装。
其次,10.1版本在弱化ArcSDE服务连接的事实,所有文档默认使用直连的方式。最明显的体现是,将以前的Post Installation的步骤(创建数据库用户,系统表,Schema等工作)从ArcSDE的软件安装步骤中剥离了出来,而能够(也仅能够)采用名为Create Enterprise Geodatabase的新GP工具来完成。因此,如果不需要ArcSDE服务连接方式的话,就无需安装ArcSDE软件了。
  下面说明建立直连方式的完整安装步骤(参考此安装文档):

  1. 安装PostgreSQL数据库;
  2. (可选)修改%PostgreSQL%9.0datapg_hba.conf文件,添加“host     all          all      0.0.0.0/0       md5”记录,让任意客户端均可连接你的数据库集群(修改后需重启postgresql-x64-9.0服务以生效);
  3. 从%Program Files%ArcGISDesktop10.1DatabaseSupportPostgreSQLWindows64目录下,拷贝st_geometry.dll文件到%PostgreSQL%9.0lib目录。在PostgreSQL中创建Geodatabase时必须用到此类库;
  4. 配置PostgreSQL的客户端。因为直连方式要求ArcSDE的客户端必须安装数据库的客户端类库,所以首先需要获取PostgreSQL的客户端。ArcGIS Desktop是32位软件,需要的是32位的PostgreSQL类库。我在官网上的zip archive链接中下载了32位的PostgreSQL binary文件,解压后将bin目录中的libeay32.dll, libiconv-2.dll, libintl-8.dll, libpq.dll, and ssleay32.dll文件拷贝到%Program Files%ArcGISDesktop10.1bin目录下;如果ArcGIS Server也需要直连到PostgreSQL中,则需要拷贝libeay32.dll, libintl.dll, libpq.dll, and ssleay32.dll上述同名的5个64位的库(帮助中的64位库列表有误)到%Program Files%ArcGISServerbin目录下,因为ArcGIS Server现在是64位的软件了,这几个库可在PostgreSQL 64位的安装目录下找到;
  5. 在ArcMap中使用Create Enterprise Geodatabase工具完成“Post Installation”过程。
    image
    对于PostgreSQL库来说Instance是数据库所在的服务器名称;Database是所要新建的GDB名称;对于PostgreSQL,GDB Administrator只能是sde;如果Tablespace Name留空,会将GDB创建到默认的pg_default表空间里;
  6. 建立直连连接。通过Add Database Connections建立直连连接:
    imageDatabase是刚才创建的GDB名称。

  如果只需要使用直连方式连接的话,就到此结束了。如果仍需要使用ArcSDE服务方式连接,则需要其他步骤。下面说明建立ArcSDE服务连接的额外步骤:

  1. 安装ArcSDE for PostgreSQL 10.1;
  2. 修改%Program Files%ArcGISArcSDEpgexeetcservices.sde文件和WindowsSystem32driversetchosts文件,分别增加“esri_sde 5151/tcp”记录;
  3. 创建ArcSDE服务。你会发现1中安装完ArcSDE后没有弹出后配置的对话框,也无法从开始菜单中找到它,sdesetup命令也没有了install的操作,这也是前面为什么说这个工作仅能够通过新的GP工具来完成的原因。所以以前后配置向导中创建ArcSDE服务的工作就只能通过命令行方式来完成了,分别键入以下两个命令以完成在注册表中创建服务的工作:
    sdeservice -o create -d POSTGRESQL,postgresql-x64-9.0
    sdeservice -o register -d POSTGRESQL,postgresql-x64-9.0 -r ADMIN_DATABASE -v sde
  4. 启动服务。可以用“sdemon –o start”命令或从Windows服务面板中启动ArcSDE服务;
  5. 创建连接。Add Database Connection只能创建直连连接,因此需要使用新的Create ArcSDE Connection File GP工具来创建ArcSDE服务连接文件。为了保持以前版本的使用习惯,可将新创建的.sde文件位置保存在c:UsersAdministratorAppDataRoamingESRIDesktop10.1ArcCatalog目录中,这样就可以从Database Connections节点中方便的找到它了。
    image

  参考:http://blog.csdn.net/linghe301/article/details/6675044