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

news2024/11/23 5:06:57

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 = True

projectDir = 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 = targetProjectPath
    shutil.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"):  # 如果文件后缀是tif
                aprx_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 portal
    arcpy.SignInToPortal(host, name, password)

    # Set output file names
    out_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 properties
    server_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_name
    sd_draft.portalFolder = "gptest"
    sd_draft.serverFolder = "gptest"
    sd_draft.allowExporting = True
    sd_draft.overwriteExistingService = True

    # Create Service Definition Draft file
    sd_draft.exportToSDDraft(sd_draft_output_filename)

    # Stage Service
    print("Start Staging")
    arcpy.StageService_server(sd_draft_output_filename, sd_output_filename)

    # Share to portal
    print("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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/589526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模版的分离编译 解决方案

回顾 对于模版&#xff0c;在之前我们就已经讲过&#xff0c;模版不支持分离编译&#xff08;即声明定义不在同一文件中&#xff09;。 类中&#xff0c;我们知道&#xff0c;对于代码量比较小的函数&#xff0c;会默认识别成内联函数&#xff0c;增加代码运行的效率&#xf…

【LeetCode 142】环形链表II

思路&#xff1a; 本题需要考虑以下两个问题&#xff1a; 判断链表是否环 如果有环&#xff0c;如何找到这个环的入口 一开始想着使用双指针的办法实现&#xff0c;但是发现没有什么思路&#xff0c;后面看了一些解析&#xff0c;用的快慢指针&#xff0c;两个指针重逢了&a…

IMX6ULL裸机篇之I2C协议

一. IIC实验简介 I2C 是最常用的通信接口&#xff0c;众多的传感器都会提供 I2C 接口来和主控相连。 比如摄像头、 加速度计、触摸屏等。 I.MX6U-ALPHA开发板 使用 I2C1 接口连接了一个距离传感器 AP3216C &#xff0c;本章我们就来学习如何使用 I.MX6U 的 I2C 接口…

自学网络安全有什么好方法?

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…

深度学习AI编译器-TVM简介

1.为什么需要深度学习编译器 深度学习编译器主要为解决不同框架下训练的模型 部署到指定的某些设备上时所遇到的一系列复杂的问题&#xff0c;即将各种深度学习训练框架的模型 部署到各种硬件所面临的问题&#xff1b; 首先深度学习领域&#xff0c;从训练框架看&#xff0c;当…

C++ 编译过程(附简单实例)

C 编译的四个阶段&#xff1a;预处理、编译、汇编和链接。 这里以 g 为例&#xff0c;用到的文件分别为 mymath.h、mymath.cpp 和 main.cpp &#xff0c;代码如下&#xff1a; // mymath.h extern int add(int, int);// mymath.cpp #include "mymath.h" // implemen…

攻防世界-web-newscenter

题目描述&#xff1a;打开链接&#xff0c;只有一个搜索框&#xff0c;然后就是一条一条新闻的记录 开启burpsuite&#xff0c;我们在搜索框中随便输入点什么&#xff0c;然后进行搜索&#xff0c;看下抓到的包 这里搜索的时候只有一个search参数&#xff0c;查询到的新闻数也变…

花6个月面过京东软件测试岗,拿个20K不过分吧?

背景介绍 计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做软件测试&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是在…

通过Python的fitz库提取pdf中的图片

文章目录 前言一、fitz库是什么&#xff1f;二、安装fitz库三、查看fitz库版本四、pymupdf库是什么&#xff1f;五、安装pymupdf库六、查看pymupdf库版本七、fitz和pymupdf是什么关系&#xff1f;八、提取pdf中的图片1.引入库2.定义pdf路径3.打开PDF文件4.遍历所有页面5.获取页…

javaWeb ssh小区物业管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh小区物业管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

Pytest测试框架中,setup和teardown函数的作用及使用方法

作为一名Python开发人员&#xff0c;您一定知道Pytest是一个广泛使用的Python测试框架。 它具有易用性和灵活性&#xff0c;可以帮助您快速编写测试用例&#xff0c;并且能够支持包括单元测试、集成测试、功能测试等多种测试类型。而其中&#xff0c;setup和teardown函数是Pyt…

C++三大特性—多态 “抽象类与虚函数表”

抽象类和虚函数表是 C中实现多态性的重要概念&#xff0c;它们对于学习 C非常重要。 掌握抽象类和虚函数表的使用方法对于理解 C的多态性是非常重要的。在 C中&#xff0c;通过使用抽象类和虚函数表&#xff0c;可以实现基于多态性的各种功能&#xff0c;如继承、多态、模板等。…

极简JVM结构图示

参考资料 JVM极简教程 JVM结构 JIT编译器&#xff0c;对于经常需要执行的字节码进行 类加载子系统 类加载器 tomcat的自定义类加载器 为了进行类的隔离&#xff0c;如果Tomcat直接使用AppClassLoader类加载类&#xff0c;那就会出现如下情况&#xff1a; 应用A中有个com.e…

Android中Binder在项目中的具体使用详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 前言&#xff1a;Binder的介绍 在 Android 中&#xff0c;Binder 是一种跨进程通信&…

静默安装oracle

oracle依赖环境包 一、创建用户属组 [rootlocalhost ~]# groupadd oinstall[rootlocalhost ~]# groupadd dba[rootlocalhost ~]# groupadd oper[rootlocalhost ~]# useradd -g oinstall -G dba,oper oracle[rootlocalhost ~]# passwd oracle #修改oracle用户密码 二、创建目录…

二叉搜索树(BST)详解及代码实现

推荐可视化插入、删除节点的二叉树网站&#xff1a;Binary Search Tree Visualization (usfca.edu) 1. 概述 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是一种特殊的二叉树结构&#xff0c;它具有以下特点&#xff1a; 有序性&#xff1a;对于…

Eureka入门 ; 服务注册中心,服务注册服务发现;SpringCloud eureka

一、引入 Spring Cloud封装了netflix公司的Eureka模块来进行实现服务治理。 在传统的RPC远程调用框架中&#xff0c;管理每个服务服务之间依赖关系比较复杂&#xff0c;所以需要服务治理&#xff0c;管理服务之间的依赖。可以实现服务注册、调用、负载均衡、容错等技术。 1. 服…

2023九坤投资暑期实习笔试复盘

5.22号笔试&#xff0c;5.24确认自己笔试挂。想想这也是自己第一次做量化私募基金的笔试&#xff0c;在此复盘一下。情况&#xff1a;北邮本硕。但开始准备暑期准备的比较晚&#xff0c;4月初才开始一边刷题一边投简历&#xff0c;所以手撕算法不太强&#xff0c;但运气和灵感好…

ChatGPT除了模型, 各个大厂、中厂、小厂们还在卷什么?

ChatGPT 问世后&#xff0c;各大公司都在「大模型」上下了苦功&#xff0c;模型能力也成为大家最关注的话题。ChatGPT 虽直接定义了基于大模型的生成式对话机器人这个产品类型&#xff0c;其模型的强大也导致大家都忽略了它在产品使用上的问题。 其实不管是底层模型开发的大厂…

印尼市场入门指南:品牌如何在当地获得市场份额?

2023年&#xff0c;印尼成为了全球最大的新兴市场之一。印尼是东南亚最大的经济体&#xff0c;拥有庞大的人口和潜在的消费市场&#xff0c;吸引着越来越多的国际品牌进入。根据预测&#xff0c;印尼的消费支出将在2023年达到1.3万亿美元&#xff0c;成为亚洲增长最快的消费市场…