1、ArcGIS 数据互操作在线处理文档编号:_版 本 号:_范 围 :内部 公开ArcGIS for Server 数据互操作模块在线数据转换2014年4月易智瑞(中国)信息技术有限公司制定及修订记录版本修订时间修订人修订类型修订章节修订内容V0.12014-04-18刘宇A* 修订类型分为A - ADDED M - MODIFIED D DELETED 注:对该文件内容增加、删除或修改均需填写此记录,详细记载变更信息,以保证其可追溯性。目 录ArcGIS 产品支持多种数据格式的转换,这得益于ArcGIS 产品的数据互操作模块 Data Interoperability。ArcGIS 的数据互操
2、作模块可以在Desktop,ArcGIS Engine和ArcGIS for Server中运行,在10.2版本的互操作模块可以直接读取150多种数据格式,可以对110多种数据格式进行写操作。在9.x版本的时候,只要安装了ArcGIS 系列的相应产品,数据互操作模块也被同时安装,在10.x系列中数据互操作模块并没有随主程序安装,而是需要单独安装,不过,安装介质和主程序在同一张盘中,如下图所示:在桌面软件中进行数据的转换,相信很多人已经用过而且熟悉,这次讨论的主要是如何在服务器端进行数据的转换。1 软件环境ArcGIS for Server 10.2+数据互操作模块ArcGIS for Desk
3、top 10.2+数据互操作模块2 目的实现shp数据到mif数据的转换3 操作过程3.1 建立GP服务在服务器端进行数据转换,依靠的是ArcGIS的GP服务,所以先要将这个GP模型建立OK。说明,在数据互操作的模块中,很多GP的工具的输出都是目录,而目录是不能作为GP服务的输出参数(后面分析一下,这个我也纳闷了半天),即便是在建立模型的时候给这个参数设置了”P”标记,如下图:发布服务后也看不到输出参数,如下:在GP模型中,如果没有输出参数,是不允许的,不然怎么得到这个结果的?3.2 过程分析要在服务器端进行数据转换,需要以下步骤1,上传文件,2,服务器进行文件格式转换操作,3,处理完了之后返
4、回给目标文件。前面提到过,在数据互操作的时候,输出的很多都是目录,而这个目录是不能作为服务器端输出参数的,所以需要另辟蹊径,你可能已经知道答案了,没错,可以用Python去写,上传的文件如何处理呢,这个根据情况,如果数据文件是单个的文件,那么直接上传就可以了,如果是shp这样的格式(由好几个文件组成),那么需要上传shp格式的打包文件,传到服务器端,进行解压,Python自带了解压模块,根据这个思路,那么整个流程的步骤应该是:1. 上传文件(打包的)2. 服务器解压文件3. 服务器处理解压后的文件4. 服务器打包处理好的文件5. 服务器将打包后的文件返给客户端3.3 操作演示整个模型如下:用的
5、代码如下:# -*- coding:utf-8 -*-Created on 2014-4-17author: 刘宇import os,os.pathimport zipfileimport arcpydef zip_dir(dirname,zipfilename): filelist = if os.path.isfile(dirname): filelist.append(dirname) else : for root, dirs, files in os.walk(dirname): for name in files: filelist.append(os.path.join(root
6、, name) zf = zipfile.ZipFile(zipfilename, w, zipfile.zlib.DEFLATED) for tar in filelist: arcname = tarlen(dirname): #print arcname zf.write(tar,arcname) zf.close()def unzip_file(zipfilename, unziptodir): if not os.path.exists(unziptodir): os.mkdir(unziptodir) zfobj = zipfile.ZipFile(zipfilename) for
7、 name in zfobj.namelist(): name = name.replace(,/) if name.endswith(/): os.mkdir(os.path.join(unziptodir, name) else: ext_filename = os.path.join(unziptodir, name) ext_dir= os.path.dirname(ext_filename) if not os.path.exists(ext_dir) : os.mkdir(ext_dir,0777) outfile = open(ext_filename, wb) outfile.
8、write(zfobj.read(name) outfile.close()def getFeatureClass(wsdir,desws): if os.path.exists(wsdir): arcpy.env.workspace=wsdir featureclasses =arcpy.ListFeatureClasses() for fc in featureclasses:# arcpy.ImportToolbox(D:/2014/GP/CADToShape/CADToShape/Interoperability.tbx)# /arcpy.gp.toolbox = D:/2014/GP
9、/CADToShape/CADToShape/Interoperability.tbx; Destination_MapInfo_Directory_=C:testtest9# arcpy.gp.SpatialETLTool2(fc, Destination_MapInfo_Directory_) SX=MIF,+desws+,RUNTIME_MACROS,QUOTE_OUTPUT_VALUES,No,SEPARATOR,ENCODING,META_MACROS,DestQUOTE_OUTPUT_VALUES,No,DestSEPARATOR,DestENCODING,METAFILE,MIF
10、,COORDSYS,_FME_DATASET_IS_SOURCE_,false Output_Dataset = MIF,C:testtest5,RUNTIME_MACROS,QUOTE_OUTPUT_VALUES,No,SEPARATOR,ENCODING,META_MACROS,DestQUOTE_OUTPUT_VALUES,No,DestSEPARATOR,DestENCODING,METAFILE,MIF,COORDSYS,_FME_DATASET_IS_SOURCE_,false# Process: Quick Export arcpy.QuickExport_interop(fc,
11、 SX)# Script arguments#v2000_hrcn_shp = arcpy.GetParameterAsText(0)#if v2000_hrcn_shp = # or not v2000_hrcn_shp:# v2000_hrcn_shp = C:testtest22000_hrcn.shp # provide a default value if unspecified#Destination_MapInfo_Directory_ = arcpy.GetParameterAsText(1)#if Destination_MapInfo_Directory_ = # or n
12、ot Destination_MapInfo_Directory_:# Destination_MapInfo_Directory_ = C:testtest2 # provide a default value if unspecified# Local variables:# Process: shp2mif#arcpy.gp.toolbox = D:/2014/GP/CADToShape/CADToShape/Interoperability.tbx;# Warning: the toolbox D:/2014/GP/CADToShape/CADToShape/Interoperabil
13、ity.tbx DOES NOT have an alias. # Please assign this toolbox an alias to avoid tool name collisions# And replace arcpy.gp.SpatialETLTool2(.) with arcpy.SpatialETLTool2_ALIAS(.)#arcpy.gp.SpatialETLTool2(C:testtest22000_hrcn.shp, Destination_MapInfo_Directory_)if _name_ = _main_: dirx=C:testtest6 zipf
14、ilename = arcpy.GetParameterAsText(0)# zipfilename=C:testtest1.zip unzipWs= arcpy.GetParameterAsText(1) desws= arcpy.GetParameterAsText(2) desws3= arcpy.GetParameterAsText(3)# unzipWs=C:testtest8# desws = C:testtest8 unzip_file(str(zipfilename),str(unzipWs) getFeatureClass(str(unzipWs),str(desws) zi
15、p_dir(str(desws),desws3) ArcGIS for Server 从10.1 版本开始支持文件上传的这个接口,只需要在服务这个GP服务的时候选中uploads就行,如下图:在rest的服务目录中,进入这个服务,上传文件成功后,将会返回一个ID,如下图:上传成功后的文件可以在这里找到,可以看到这个ID表示的是一个文件目录:在执行GP的时候,按照下面这个格式,这里的itemID,就是刚才返回的ID,服务器通过这个ID,就可以找到上传到的文件,下来就进入到了,数据解压,处理和打包下载这个环节。返回后的结果3.4 关于文件目录在建立GP模型的时候,有4个标记了P的参数,但是服务发布
16、成功后,只有2个,凡是类型为folder的都不会出现,这个我分析了半天算是找到,在参数中,有一个是解压目录,就是将上传到的zip文件放到这个目录中,最后可以看到这个解压目录被放到了这里,如下图:其实Server在这里做了一个偷天换日的工作,只要发现目录,在发布服务的时候自己就会给替换掉,而将目录的最后一段,比如我原先的的目录是C:testtest9,server会将test9作为常量,将前面的一段给替换掉。关于输出目录,在模型中设置Scratch Workspace 为如下地址:这个输出目录会在arcgisjobs目录下出现,完整的目录如下:从上分析可以看到,Server其实帮我们做了不少的工作,路径的替换,让我们避免了路径的不存在,而数据目录是在不同的jobid下面,有可以避免重复,这里Server做的的确是不错。4 小结从上面的分析,演示,可以看出ArcGIS for Server的数据互操作模块能很好的实现在线数据的转换工作,对于那些手头有数据,但是没有数据转换工具的的用户来说,这算是一种很好的方案。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1