1,前言

继上一篇 ArcGis系列-java调用GP分析 ,已经实现了gp工具的发布,调用,轮询,并已经分别保存好发布地图服务所需的矢量数据json,栅格数据tif文件和样式文件

要将gp分析的结果发布为图层供前端展示,基础的python环境还是跟发布空间表一样,
实现思路基本一样,同样是用本地的空项目构添加图层构建草稿文件上传发布

2,java代码

如果调用发布的python执行成功,先在ArcGIS Enterprise控制台的内容去看下发布地址,
再在getPublishLayerUrl方法中拼接正确的发布地址

/*** 调用python发布图层到arcgis* @param dir 图层及样式文件临时目录* @param host* @param name* @param password* @param serviceName 图层服务名称* @return* @throws Exception*/public String publishLayerToArcgis(String dir, String host, String name, String password, String serviceName) throws Exception {//host = host.replace("https","http");dir = dir.replace("\\","/");List<Object> params = new ArrayList<>();params.add("cmd.exe");params.add("/c");params.add("python");//python全路径String pyScriptName = scriptLocation + File.separator + PY_PUBLISH_LAYER;params.add(pyScriptName);params.add(dir);params.add(host);params.add(name);params.add(password);params.add(serviceName);String[] arr = params.toArray(new String[params.size()]);log.info("发布gp结果参数:{}", Arrays.toString(arr));int i = execSync(pyScriptName, arr);if (i == 0) {return getPublishLayerUrl(host, serviceName);} else {throw new Exception("调用" + scriptLocation + PY_PUBLISH_LAYER + "python异常!");}}private int execSync(String fileName, String params[]) throws IOException {log.info("同步读取python文件 init fileName={}", fileName);Process process;if (OS.startsWith("Windows")) {// windows执行脚本需要使用 cmd.exe /c 才能正确执行脚本process = new ProcessBuilder(params).start();} else {// linux执行脚本一般是使用python3 + 文件所在路径
//            process = new ProcessBuilder("python3", LINUX_PATH + fileName, params).start();process = new ProcessBuilder(params).start();}taskPool.submit(() -> {log.info("读取python文件 开始 fileName={}", fileName);BufferedReader errorReader = null;// 脚本执行异常时的输出信息errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));List<String> errorString = read(fileName, errorReader);log.info("读取python文件 fileName={}  errorString={}", fileName, errorString);});taskPool.submit(() -> {// 脚本执行正常时的输出信息BufferedReader inputReader = null;inputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));List<String> returnString = read(fileName, inputReader);log.info("读取python文件 fileName={}  returnString={}", fileName, returnString);});try {boolean res = process.waitFor(1L, TimeUnit.DAYS);if (res) {int i = process.exitValue();log.info("执行python文件 fileName={} == 结束 == {}", fileName, i);return i;}return 1;} catch (InterruptedException e) {log.error("同步读取python文件 fileName=" + fileName + " 等待结果返回异常", e);return 1;}}

3,python代码

在项目中分别遍历json文件,和tif文件,全部添加到新项目中,然后创建草稿;
因为是以gp分析id作为serverName,前端允许重复分析,所以发布时必须设置覆盖

# -*- coding: UTF-8 -*-
import arcpy
import os
import sys
import calendar
import time
import shutil# 将标准输出和标准错误输出都重定向到同一个文件中
log_file = open("D:/ITS/pythonlog.txt", "w")
sys.stdout = log_file
sys.stderr = log_file
# 覆盖
arcpy.env.overwriteOutput = TrueprojectDir = r"D:\ITS\map"
templateProject = "MyProject2"
targetProject = "layer_project_" + str(calendar.timegm(time.gmtime()))
targetProjectPath = os.path.join(projectDir, targetProject)
aprxName = "MyProject2.aprx"
gdbName = "MyProject2.gdb"def publish_layers(temp_dir, host, name, password, service_name):arcpy.env.workspace = targetProjectPathshutil.copytree(os.path.join(projectDir, templateProject), targetProjectPath)mpmath = os.path.join(targetProjectPath, aprxName)aprx = arcpy.mp.ArcGISProject(mpmath)  # aprx存储路径aprx_map = aprx.listMaps("*")[0]  # 要将数据添加到aprx中的哪个地图下json_dir = os.path.join(temp_dir, "json")file_list = os.listdir(json_dir)for file in file_list:# 利用os.path.join()方法取得路径全名,并存入cur_path变量,否则每次只能遍历一层目录json_file_path = os.path.join(json_dir, file)feature_name = file.split(".")[0]arcpy.conversion.JSONToFeatures(json_file_path, os.path.join(gdbName, feature_name))aprx_map.addDataFromPath(os.path.join(targetProjectPath, gdbName, feature_name))#aprx_map.addDataFromPath("D:\\ITS\\map\\layerparam\\dem1.tif")json_dir = os.path.join(temp_dir, "tif")for subdir, dirs, files in os.walk(json_dir):for file in files:tifpath = os.path.abspath(os.path.join(subdir, file))if tifpath.endswith(".tif"):  # 如果文件后缀是tifaprx_map.addDataFromPath(tifpath)else:os.remove(tifpath)  # 删除该文件# 遍历图层添加样式layers = aprx_map.listLayers()for layer in layers:layer_name = arcpy.Describe(layer).file + ".lyrx"layer_name = layer_name.replace(".tif", "")print(layer_name)style_path = os.path.join(temp_dir, "style", layer_name)if os.path.exists(style_path):arcpy.ApplySymbologyFromLayer_management(layer, style_path)aprx.save()# Sign in to portalarcpy.SignInToPortal(host, name, password)# Set output file namesout_dir = os.path.join(targetProjectPath, "out")os.makedirs(out_dir)sd_draft_filename = service_name + ".sddraft"sd_draft_output_filename = os.path.join(out_dir, sd_draft_filename)sd_filename = service_name + ".sd"sd_output_filename = os.path.join(out_dir, sd_filename)# Reference map to publish# aprx = arcpy.mp.ArcGISProject("D:\\ITS\\map\\MyProjectMyProject.aprx")m = aprx.listMaps()[0]# Create FeatureSharingDraft and set metadata, portal folder, and export data propertiesserver_type = "FEDERATED_SERVER"sd_draft = m.getWebLayerSharingDraft(server_type, "MAP_IMAGE", service_name)hosts = host.split("/")b = hosts[len(hosts) - 1]print(b)sd_draft.federatedServerUrl = host.replace(b, "server")sd_draft.credits = "These are credits"sd_draft.description = "This is description"sd_draft.summary = "This is summary"sd_draft.tags = "tag1, tag2"sd_draft.useLimitations = "These are use limitations"sd_draft.overwriteExistingService=service_namesd_draft.portalFolder = "gptest"sd_draft.serverFolder = "gptest"sd_draft.allowExporting = Truesd_draft.overwriteExistingService = True# Create Service Definition Draft filesd_draft.exportToSDDraft(sd_draft_output_filename)# Stage Serviceprint("Start Staging")arcpy.StageService_server(sd_draft_output_filename, sd_output_filename)# Share to portalprint("Start Uploading")# arcpy.UploadServiceDefinition_server(sd_output_filename,sd_draft.federatedServerUrl)arcpy.UploadServiceDefinition_server(sd_output_filename, sd_draft.federatedServerUrl, service_name, None, None, "gptest",None, True, None, True, None, None)print("Finish Publishing")if __name__ == '__main__':a = []for i in range(1, len(sys.argv)):print("arg:" + sys.argv[i])a.append(sys.argv[i])publish_layers(a[0], a[1], a[2], a[3], a[4])#publish_layers("D:/ITS/map/layerparam/44bgexhvc10000", "https://aaa.bbbb.com/arcgis", "name", "password","44bgexhvc10000")# shutil.rmtree(a[0])

4,可能会遇到的问题

如果arcgis pro的版本与arcgis的服务版本不兼容,pro下的python也会报一些奇怪的错,我使用的3.0.1的pro和10.6的arcgis;
如果执行python脚本包url问题,可以切换https与http试下,与arcgis的版本有关;
调试时在arcgis的manage可以查看执行日志 https://aaa.myarcgis.com:6443/arcgis/manager

ArcGis系列-java发布GP分析结果(带样式)相关推荐

  1. ArcGis系列-java调用GP分析

    1,实现流程 创建GPServer,使用ArcgisPro添加GP工具运行,然后使用共享web服务发布运行成功的GP任务 根据发布成功的GPServer发布地址,解析出GP服务的输入参数和输出参数 前 ...

  2. ArcGIS 发布GP服务

    这里对如何使用ArcGIS 发布GP服务做简单介绍. 其他注意事项可参考ArcGIS 发布GP服务(二) 一.工具介绍 发布的ToolBox为以模拟监测站点监测值的插值功能为例: 工具运行效果如下: ...

  3. Java集合Collection源码系列-ArrayList源码分析

    Java集合系列-ArrayList源码分析 文章目录 Java集合系列-ArrayList源码分析 前言 一.为什么想去分析ArrayList源码? 二.源码分析 1.宏观上分析List 2.方法汇 ...

  4. ArcGIS发布GP服务

    近期,工作需要对地理数据进行两个图层对比,获取不重合的空间范围,考虑再三,决定通过gp服务进行处理.下面讲一下gp服务发布流程.集体流程如下: 制作模型: 执行模型: 发布服务: 1. 制作模型 在c ...

  5. ArcGIS Server发布GP

    1.首先将工作文件夹共享(存放mxd..tbx的文件夹,本测试为:E:\TestRouting) 2.在ArcMap中设置工作环境 1)地图文档最好弄成相对路径,且不要中文名:(文件--地图文档属性) ...

  6. JAVA内存泄露分析和解决方案及WINDOWS自带查看工具

    JAVA内存泄露分析和解决方案及WINDOWS自带查看工具 Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最 ...

  7. ArcGIS Server发布GP服务

    1.打开ArcCatalog软件,点击[Geoprocessing]-[ModelBuilder],打开模型建构器. 2.从[ArcToolbox]工具箱中,将需要的工具拖到模型构建器中. 双击模型构 ...

  8. ArcGis系列-坐标系转换

    Arcgis的工程项目可以添加各种类型的空间资源,比如数据库空间表.shp文件,每张空间表的坐标系可能都会有差异,把他们放到一个工程里时可以统一设置坐标系. 本文将介绍ArcGis三个需要坐标转换的场 ...

  9. 白话ArcGIS系列软件技术应用(一)空间地理数据库的创建

    我是"会跳舞的文艺青年",如果大家觉得我这个名字太长,那就叫我"文青"吧,本人毕业于2019年6月,地理信息科学专业的学生,标准的Giser,奋青,刚刚工作3个 ...

最新文章

  1. 量子计算机 漫画,漫画 | 10分钟看懂量子比特、量子计算和量子算法
  2. 对于表列数据类型选择的一点思考
  3. 购华为第1书,写书评赢大奖
  4. Python Django 设置/更改响应头信息
  5. Mybatis SQL拦截器实现
  6. Php输出Xml报错:XML declaration allowed only at the start of the document
  7. 金山安全实验室公布中国互联网六大类钓鱼网站
  8. LeetCode 258. 各位相加
  9. 中国救生浮标市场趋势报告、技术动态创新及市场预测
  10. 爱荷华大选 App 投票酿闹剧的反思:为什么我们在软件工程方面如此糟糕?
  11. verilog系统任务之$random
  12. Redis RDB和AOF
  13. html设置一句话的样式,页面上的div标签,其HTML代码为divid=boxstyle=color:red文字/div,为其设置CSS样式如下:...
  14. CTFd运维-CTFd平台搭好后,遇到网页访问慢,卡顿非常厉害的解决方法
  15. linux下Nginx的卸载、安装
  16. 【Node.js】第一章 初识Node.js
  17. python怎么换背景颜色_用opencv给图片换背景色的示例代码
  18. 跟java有关的搞笑句子,有关搞笑的经典语句
  19. BSQ,BIL,BIP的区别
  20. 量子计算机与低温,逼近绝对零度,和外太空一样的低温_服务器评测与技术-中关村在线...

热门文章

  1. 笔记本二合一计算机,可能是目前最完美的二合一笔记本电脑 Surface Pro 7之我所见...
  2. python编程狮_Python编程狮-零基础学Python
  3. Web自动化测试 (Selenium+Python)测试环境搭建
  4. 易语言获取cookie
  5. Java实现模糊搜索
  6. 用JIRA管理你的项目———JIRA环境搭建
  7. 小游戏2048设计思路超简单
  8. C#项目实战——Windows计算器的制作【实例】
  9. 新增网址/网页 截图api[增加安全防护本接口已停用]源码可下载
  10. LabVIEW同时使用NI 的GPIB和Keysight 的HPIB控制器