ArcGIS数据互操作在线处理Word文档下载推荐.docx
《ArcGIS数据互操作在线处理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ArcGIS数据互操作在线处理Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
2014-04-18
刘宇
A
*修订类型分为A-ADDEDM-MODIFIEDD–DELETED
注:
对该文件内容增加、删除或修改均需填写此记录,详细记载变更信息,以保证其可追溯性。
目录
ArcGIS产品支持多种数据格式的转换,这得益于ArcGIS产品的数据互操作模块DataInteroperability。
ArcGIS的数据互操作模块可以在Desktop,ArcGISEngine和ArcGISforServer中运行,在10.2版本的互操作模块可以直接读取150多种数据格式,可以对110多种数据格式进行写操作。
在9.x版本的时候,只要安装了ArcGIS系列的相应产品,数据互操作模块也被同时安装,在10.x系列中数据互操作模块并没有随主程序安装,而是需要单独安装,不过,安装介质和主程序在同一张盘中,如下图所示:
在桌面软件中进行数据的转换,相信很多人已经用过而且熟悉,这次讨论的主要是如何在服务器端进行数据的转换。
1软件环境
ArcGISforServer10.2+数据互操作模块
ArcGISforDesktop10.2+数据互操作模块
2目的
实现shp数据到mif数据的转换
3操作过程
3.1建立GP服务
在服务器端进行数据转换,依靠的是ArcGIS的GP服务,所以先要将这个GP模型建立OK。
说明,在数据互操作的模块中,很多GP的工具的输出都是目录,而目录是不能作为GP服务的输出参数(后面分析一下,这个我也纳闷了半天),即便是在建立模型的时候给这个参数设置了”P”标记,如下图:
发布服务后也看不到输出参数,如下:
在GP模型中,如果没有输出参数,是不允许的,不然怎么得到这个结果的?
3.2过程分析
要在服务器端进行数据转换,需要以下步骤
1,上传文件,
2,服务器进行文件格式转换操作,
3,处理完了之后返回给目标文件。
前面提到过,在数据互操作的时候,输出的很多都是目录,而这个目录是不能作为服务器端输出参数的,所以需要另辟蹊径,你可能已经知道答案了,没错,可以用Python去写,上传的文件如何处理呢,这个根据情况,如果数据文件是单个的文件,那么直接上传就可以了,如果是shp这样的格式(由好几个文件组成),那么需要上传shp格式的打包文件,传到服务器端,进行解压,Python自带了解压模块,根据这个思路,那么整个流程的步骤应该是:
1.上传文件(打包的)
2.服务器解压文件
3.服务器处理解压后的文件
4.服务器打包处理好的文件
5.服务器将打包后的文件返给客户端
3.3操作演示
整个模型如下:
用的代码如下:
#-*-coding:
utf-8-*-
'
Createdon2014-4-17
@author:
刘宇
importos,os.path
importzipfile
importarcpy
defzip_dir(dirname,zipfilename):
filelist=[]
if
filelist.append(dirname)
else:
forroot,dirs,filesinos.walk(dirname):
fornameinfiles:
filelist.append(,name))
zf=zipfile.ZipFile(zipfilename,"
w"
fortarinfilelist:
arcname=tar[len(dirname):
]
#printarcname
zf.write(tar,arcname)
zf.close()
defunzip_file(zipfilename,unziptodir):
ifnot
os.mkdir(unziptodir)
zfobj=zipfile.ZipFile(zipfilename)
fornameinzfobj.namelist():
name=name.replace('
\\'
'
/'
)
ifname.endswith('
):
os.mkdir(,name))
else:
ext_filename=,name)
ext_dir=
ifnot:
os.mkdir(ext_dir,0777)
outfile=open(ext_filename,'
wb'
outfile.write(zfobj.read(name))
outfile.close()
defgetFeatureClass(wsdir,desws):
featureclasses=arcpy.ListFeatureClasses()
forfcinfeatureclasses:
#arcpy.ImportToolbox("
D:
/2014/GP/CADToShape/CADToShape/Interoperability.tbx"
#//="
;
Destination_MapInfo_Directory_="
C:
\\test\\test9"
#,Destination_MapInfo_Directory_)
SX="
MIF,"
+desws+"
\"
RUNTIME_MACROS,\"
\"
QUOTE_OUTPUT_VALUES,No,SEPARATOR,\"
ENCODING,\"
META_MACROS,\"
DestQUOTE_OUTPUT_VALUES,No,DestSEPARATOR,\"
DestENCODING,\"
METAFILE,MIF,COORDSYS,,__FME_DATASET_IS_SOURCE__,false\"
"
Output_Dataset="
MIF,C:
\\test\\test5,\"
#Process:
QuickExport
arcpy.QuickExport_interop(fc,SX)
#Scriptarguments
#v2000_hrcn_shp=arcpy.GetParameterAsText(0)
#ifv2000_hrcn_shp=='
#'
ornotv2000_hrcn_shp:
#v2000_hrcn_shp="
\\test\\test2\\2000_hrcn.shp"
#provideadefaultvalueifunspecified
#
#Destination_MapInfo_Directory_=arcpy.GetParameterAsText
(1)
#ifDestination_MapInfo_Directory_=='
ornotDestination_MapInfo_Directory_:
#Destination_MapInfo_Directory_="
\\test\\test2"
##Localvariables:
##Process:
shp2mif
#="
##Warning:
thetoolboxD:
/2014/GP/CADToShape/CADToShape/Interoperability.tbxDOESNOThaveanalias.
##Pleaseassignthistoolboxanaliastoavoidtoolnamecollisions
##Andreplacewitharcpy.SpatialETLTool2_ALIAS(...)
#"
Destination_MapInfo_Directory_)
if__name__=='
__main__'
:
dirx="
\\test\\test6"
zipfilename=arcpy.GetParameterAsText(0)
#zipfilename="
\\test\\test1.zip"
unzipWs=arcpy.GetParameterAsText
(1)
desws=arcpy.GetParameterAsText
(2)
desws3=arcpy.GetParameterAsText(3)
#unzipWs="
\\test\\test8"
#desws="
unzip_file(str(zipfilename),str(unzipWs))
getFeatureClass(str(unzipWs),str(desws))
zip_dir(str(desws),desws3)
ArcGISforServer从10.1版本开始支持文件上传的这个接口,只需要在服务这个GP服务的时候选中uploads就行,如下图:
在rest的服务目录中,进入这个服务,上传文件成功后,将会返回一个ID,如下图:
上传成功后的文件可以在这里找到,可以看到这个ID表示的是一个文件目录:
在执行GP的时候,按照下面这个格式,这里的itemID,就是刚才返回的ID,服务器通过这个ID,就可以找到上传到的文件,下来就进入到了,数据解压,处理和打包下载这个环节。
返回后的结果
3.4关于文件目录
在建立GP模型的时候,有4个标记了P的参数,但是服务发布成功后,只有2个,凡是类型为folder的都不会出现,这个我分析了半天算是找到,在参数中,有一个是解压目录,就是将上传到的zip文件放到这个目录中,最后可以看到这个解压目录被放到了这里,如下图:
其实Server在这里做了一个偷天换日的工作,只要发现目录,在发布服务的时候自己就会给替换掉,而将目录的最