java调用.py文件代替arcmap或catalog自动发布地图服务

  • 一.准备python环境
  • 二.用于地图发布服务的.py文件的编写
  • 三.调用.py文件的java编写
  • 三.遇到的问题及原因


使用的环境:python2.7(下载arcgis时自带的python解释器)、pycharm、IDEA、jdk1.8、win10
实现的功能:将mxd文档发布服务到arcgis server上

一.准备python环境

因为之前不了解python,所以是从python的环境安装开始的。

1.首先安装python,即python解释器,如果已经下载了arcgis就不用再安装了,arcgis自带python2.7(最好下载安装arcgis,arcgis官方对服务自动发布提倡用python,所以有完整的支持地图自动发布为服务的环境);安装后在命令窗口输入python,出现python的版本信息后即安装成功
2.安装pycharm,类似于用于开发java的IDEA(python解释器与pycharm可以自行百度,网上很多教程)
3.python的环境变量配置,这里的环境变量要配置两个;
(1)python.exe的配置(在下载的python包下,用于运行.py文件);此电脑—>属性—>高级系统设置—>环境变量(N)—>双击系统变量下的path—>新建,路径写python.exe所在包的路径,我的为C:\Python27\ArcGIS10.6
(2)pip的配置(在下载的python包的Scripts包下,用于下载python的依赖);此电脑—>属性—>高级系统设置—>环境变量(N)—>双击系统变量下的path—>新建,路径写pip.exe所在包的路径,我的为C:\Python27\ArcGIS10.6\Scripts

二.用于地图发布服务的.py文件的编写

1.写代码前先给pycharm选择一下python解释器,在pycharm中File—>Settings—>Project:_项目名—>Project Interpreter

java根据地理空间转换地形_java


2.python代码;

# -*- coding: utf-8 -*-
#  arcpy为此段代码的灵魂依赖库,arcgis自带的python解释器里面有,所以为什么最好用arcgis自带的python
import arcpy
import os
import os.path
import time

# java调此段代码传递的参数,参数为发布的服务的名字(parameterService_Name);也可以在此段代码里把发布的服务名字写死,不接收参数
import sys
for i in range(1, len(sys.argv)):
  parameterService_Name = sys.argv[i]

# parameterService_Name = 'test01'

reload(sys)
sys.setdefaultencoding('utf8')

# mxd文档所在的路径(不包括mxd文档)
wrkspc="E:/mxd/mxd/"
# 1、创建server连接#
connection_type='ADMINISTER_GIS_SERVICES'
connectionfilename='serverags.ags'
# 自己的arcgis server服务站点的网址
server_url='http://xxxxxxxxxxxxxxx.com:6080/arcgis/admin'     
connectionfilepath=wrkspc+connectionfilename
# 'arcgis','Hwhy@0755':分别为arcgis server服务的账号和密码
arcpy.mapping.CreateGISServerConnectionFile(connection_type,wrkspc,connectionfilename,server_url,
                                            'ARCGIS_SERVER',False,wrkspc,'arcgis','Hwhy@0755',
                                            "SAVE_USERNAME")
# 注册文件夹

# "注册文件夹..."
wrkspcs="E:\mxd\mxd"
if wrkspcs not in [i[2] for i in arcpy.ListDataStoreItems(connectionfilepath, 'FOLDER')]:
    dsStatus = arcpy.AddDataStoreItem(connectionfilepath, "FOLDER", "folderzce", wrkspcs, wrkspcs)

# 2、CreateMapSDDraft将地图文档(.mxd)转换为服务定义草稿(.sddraft)
# 根据mxd文档路径(包括mxd文档)获取mxd文档
mapdocument = arcpy.mapping.MapDocument(wrkspc+'test0000.mxd')
# 上传的服务的名字
service_name = parameterService_Name
sddraft=wrkspc+service_name+'.sddraft'
sd=wrkspc+service_name+'.sd'
summary='test'
tags='map'

# 倒数第三个参数'test'为上传服务上传的具体站点的名字,没有则会创建
analysis=arcpy.mapping.CreateMapSDDraft(mapdocument,sddraft,service_name,'ARCGIS_SERVER',
                                        connectionfilepath,False,'duogui',summary,tags)

# Analyze the service definition draft
analysis = arcpy.mapping.AnalyzeForSD(sddraft)

for key in ('messages', 'warnings', 'errors'):
  vars = analysis[key]

# Stage and upload the service if the sddraft analysis did not contain errors
if analysis['errors'] == {}:
# 3、 将.sddraft文件转换为.sd文件
  arcpy.StageService_server(sddraft, sd)
# 4、 调用UploadServiceDefinition_server函数,对.sd文件进行上传
  arcpy.UploadServiceDefinition_server(sd, connectionfilepath)

三.调用.py文件的java编写

/**
     * java调用.py文件
     */
    @Test
    public void test02(){

        //这里构建要在cmd中输入的参数,第一个参数为arcgis自带的python解释器包下的python.exe的前缀python,第二个参数表示.py文件的路径,第二个之后的参数都表示要传给.py文件的参数,可以根据.py文件的需求写
        //(第一个参数不作为传递给.py文件的参数,所以第一个参数没有索引,第二个参数索引为0,第三个参数索引为1....)
        String[] arguments = new String[] {"python","E:\\python\\pythonWork\\__MACOSX\\yuqi05.py","456789"};

        try {

            //这个方法相当于在cmd中输入 python D:\\ccc\\1.py D:/ccc/
            Process process = Runtime.getRuntime().exec(arguments);

            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) {

                //在java编译器中打印.py文件的执行结果
                System.out.println(".py文件的执行成果"+line);
            }
            in.close();

            //因为是process这个进程调用.py文件, 所以要将当前进程阻塞等待.py文件执行完毕, 若果.py文件成功运行完毕,此方法将返回0,代表执行成功
            int re = process.waitFor();

            //执行成功的话这里会打印一个0,否则会打印1,2或者其他数字
            System.out.println("执行结果为:"+re);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

三.遇到的问题及原因

1.如果计算机里有arcgis自带的python与自己下的python,可能解释器之间会有冲突,可以将两个python文件下的python.exe改下名字,如python2.exe,python3.exe,改完后在命令窗口需要输入python的时候就要输入python2或python3而不是python了。
2.如果环境变量的path没有配置arcgis自带的python解释器,在运行java调.py文件的时候就会报错;如果只配置了自己单独下载的python解释器没有配置arcgis自带的,就会导致引入了arcpy或者其他arc开头的依赖库的.py文件无法被java调用运行成功。