ArcGis系列-java发布空间表为地图服务(map)

news2024/10/7 10:18:03

1,实现思路

  1. 使用java调用cmd命令执行python脚本
  2. python环境使用arcgis pro安装目录下的 \ArcGIS\Pro\bin\Python\envs\arcgispro-py3
  3. 作为地图服务应该可以支持添加样式文件
  4. 发布表需要用到sde文件,使用java创建sde的代码可以看这里
  5. 发布表时,先在本地的空项目模板中添加数据库表作为图层,然后上传发布这个项目

2,java实现

execSync异步调用参考上一篇文章

     /**
     * 调用python发布sqlserver数据库表到arcgis
     *
     * @param sde       sde文件路径 D:\\ITS\\itsPython\\192.168.10.153.sde
     * @param host      arcgis地址 https://aaa.myarcgis.com/arcgis
     * @param name      arcgis用户名 username
     * @param password  arcgis密码 xxxx
     * @param table     表名 STB
     * @param stylePath 样式文件路径 D:/ITS/temp/dbid/xxx.lyrx
     * @return
     * @throws Exception
     */
    public String publishTableToArcgisV2(String sde, String host, String name, String password, String table, String stylePath) throws Exception {
        host = host.replace(":6443", "");
        sde = sde.replace("\\", "/");
        List<Object> params = new ArrayList<>();
        params.add("cmd.exe");
        params.add("/c");
        params.add("python");
        String pyScriptName = scriptLocation + File.separator + PY_CREATE_TABLE2;
        params.add(pyScriptName);
        params.add(sde);
        params.add(host);
        params.add(name);
        params.add(password);
        params.add(table);
        params.add(stylePath);
        String[] arr = params.toArray(new String[params.size()]);
        log.info("发布空间表及样式参数:{}", Arrays.toString(arr));
        //publish_single_table("D:\\ITS\\itsPython\\192.168.10.153.sde", "https://aaa.myarcgis.com/arcgis", "lzwpro", "lzwpro123", "SD","D:/ITS/temp/dbid/xxx.lyrx")
        int i = execSync(pyScriptName, arr);
        if (i == 0) {
            //https://lzw.gis107.com/server/rest/services/SD/MapServer
            return getPublishTableMapUrl(host, table);
        } else {
            throw new Exception("执行python异常");
        }
    }

3,python脚本

  • 发布表是在本地一个空的项目作为模板(D:\ITS\map\MyProject2),添加数据库表,生成草稿文件来发布;
  • 空项目文件可以使用arcgis pro创建项目删除所有地图得到;
  • 添加表图层是要根据空间表实际类型来,区分矢量表和栅格表;
  • 指定发布目录是要确保目录在arcgis已创建,发布图层这里设置的覆盖且直接公开.
# -*- coding: UTF-8 -*-
import arcpy
import os
import calendar
import time
import shutil

# 覆盖
arcpy.env.overwriteOutput = True
log_file = open("D:/ITS/pythonlog.txt", "w")
sys.stdout = log_file
sys.stderr = log_file

projectDir = r"D:\ITS\map"
templateProject = "MyProject2"
targetProject = "project_" + str(calendar.timegm(time.gmtime()))
targetProjectPath = os.path.join(projectDir, targetProject)
aprxName = "MyProject2.aprx"


def publish_single_table(sde, host, name, password, table, sstylefile):
    arcpy.env.workspace = sde
    service_name = "map_" + table.split(".")[-1]
    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中的哪个地图下
    sde_list = arcpy.ListFeatureClasses()
    # 遍历矢量图层
    print("add layer")
    for item in sde_list:
        if item.split(".")[-1] == table:
            aprx_map.addDataFromPath(sde + "\\" + item)
            break
    else:
        print('ListFeatureClasses is null')
        # 如果矢量图层未找到目标则遍历栅格图层
        sde_list=arcpy.ListRasters()
        for item in sde_list:
            if item.split(".")[-1] == table:
                aprx_map.addDataFromPath(sde + "\\" + item)
                break
        else:
            print('ListRasters is null')
            raise Exception(table + "  table is not find")
    print("add style")
    listLayers = aprx_map.listLayers()
    arcpy.ApplySymbologyFromLayer_management(listLayers[0], sstylefile)
    aprx.save()

    # Sign in to portal
    print("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
    print("Create FeatureSharingDraft")
    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.portalFolder = "tablemap"
    sd_draft.serverFolder = "tablemap"
    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, service_name, None, None, "tablemap",None, True, None, True, None, None)

    print("Finish Publishing")
    # https://aaa.myarcgis.com/server/rest/services/ROAD/MapServer

if __name__ == '__main__':
    a = []
    for i in range(1, len(sys.argv)):
        print("arg:" + sys.argv[i])
        a.append(sys.argv[i])

    publish_single_table(a[0], a[1], a[2], a[3], a[4], a[5])
    #publish_single_table("D:\\ITS\\map\\sde\\64142f6fed18f3049248ae24.sde", "https://aaa.myarcgis.com/arcgis", "lzwpro", "lzwpro123", "STBHHX1", "D:/ITS/temp/646ad60076c43d31a8fe1f9f/dbo.STBHHX.lyrx")

3,可能会遇到的问题

如果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/587913.html

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

相关文章

vue模拟el-table演示插槽用法

vue模拟el-table演示插槽用法 转载自&#xff1a;www.javaman.cn 很多人知道插槽分为三种&#xff0c;但是实际到elementui当中为什么这么用&#xff0c;就一脸懵逼&#xff0c;接下来就跟大家聊一聊插槽在elementui中的应用&#xff0c;并且自己写一个类似el-table的组件 vue…

回归问题里的数学

假设一个简单的案例 投入的广告费越多&#xff0c;广告的点击量就越高&#xff0c;进而带来访问数的增加&#xff0c;不过点击量经常变化&#xff0c;投入同样的广告费未必能带来同样的点击量。根据广告费和实际点击量的对应关系数据&#xff0c;可以将两个变量用下面的图展示…

CASA模型:生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟

查看原文>>>生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟实践技术应用 目录 第一章 CASA模型介绍&#xff08;讲解案例实践&#xff09; 第二章 CASA初步操作 第三章 CASA数据制备&#xff08;一&#xff09; 第四章 CASA数据制备&am…

4_回归算法(算法原理推导+实践)

文章目录 1 线性回归1.1 定义1.2 题目分析1.3 误差项分析1.4 目标函数推导1.5 线性回归求解1.6 最小二乘法的参数最优解 2 目标函数&#xff08;loss/cost function&#xff09;3 模型效果判断4 机器学习调参5 梯度下降算法5.1 梯度方向5.2 批量梯度下降算法&#xff08;BGD&am…

Spring IOC容器及DI相关概念

文章目录 一、组件、框架、容器的相关概念1.组件2.框架3.容器4.总结 二、IOC与DI简介1.IOC入门案例2.DI入门案例 一、组件、框架、容器的相关概念 1.组件 组件是为了代码的重用而对代码进行隔离封装&#xff0c;组件的呈现方式是单个或多个.class文件&#xff0c;或者打包的.…

Flutter的手势识别功能实现GestureDetector

GestureDetector简介 GestureDetector 是 Flutter 中一个非常常用的小部件&#xff0c;它提供了许多手势识别的功能&#xff0c;包括点击、双击、长按、拖动、缩放等等。 使用方法 GestureDetector 可以包裹其他部件&#xff0c;当用户在这些部件上进行手势操作时&#xff0…

基于SSM的网辩平台的设计与实现

摘 要 线上作为当前信息的重要传播形式之一&#xff0c;线上辩论系统具有显著的方便性&#xff0c;是人类快捷了解辩论信息、资讯等相关途径。但在新时期特殊背景下&#xff0c;随着网辩的进一步优化&#xff0c;辩论赛结合网络平台融合创新强度也随之增强。本文就网辩平台进…

尧泰汉海五城联动,“益”起圆梦!用爱守护成长,助力502名孩子实现心愿

公益的力量让孩子们的梦想被看见。 文具套装、书包、篮球 、益智积木、生日蛋糕......一个个看似小小的心愿&#xff0c;对于城市里的孩子来说是平常不过的礼物&#xff0c;但却成了许多正处于困境孩子的期待。 本次活动由重庆市慈善总会指导&#xff0c;Home尧泰汉海慈善专项…

【项目】ROS下使用乐视深度相机LeTMC-520

本文主要记录如何在ros下使用乐视深度相机。乐视三合一体感摄像头LeTMC-520其实就是奥比中光摄像头&#xff08;Orbbec Astra Pro&#xff09; 系统&#xff1a;Ubuntu20.04 这款相机使用uvc输入彩色信息&#xff0c;需要使用libuvc、libuvc_ros才能在ROS上正常使用彩色功能。…

k8s实战2-用minikube发布本地应用

官网的教程中&#xff0c;hello-minikube其镜像都在网上(dockerhub)上&#xff0c;如何把本地打包的docker镜像发布到minikube中 1 终端上运行eval $(minikube docker-env) 此命令的作用是使用Minikube Docker守护进程&#xff0c;跟原来docker desktop的docker进程区别开来 …

FPGA深层解析

概览 高端设计工具为少有甚是没有硬件设计技术的工程师和科学家提供现场可 编程门阵列(FPGA)。无论你使用图形化设计程序,ANSI C语言还是VHDL语言, 如此复杂的合成工艺会不禁让人去想FPGA真实的运作情况。在这个芯片中的程 序在这些可设置硅片间到底是如何工作的。本书会使…

腾讯云2核4G5M服务器性能如何?来说说CPU内存带宽系统盘

腾讯云轻量应用服务器2核4G5M配置一年168元&#xff0c;三年628元&#xff0c;100%CPU性能&#xff0c;5M带宽下载速度640KB/秒&#xff0c;60GB SSD系统盘&#xff0c;月流量500GB&#xff0c;折合每天16.6GB流量&#xff0c;超出月流量包的流量按照0.8元每GB的支付流量费&…

SKY13330-397LF国产替代ATR5330 SUB-1G SPDT开关芯片

1.1 芯片简介 ATR5330是一款采用CMOS SOI工艺制作的单刀双掷开关单芯片&#xff0c;该芯片的推荐工作频率20MHz-4GHz&#xff0c; 开关芯片采用单电源供电控制&#xff0c;有非常低的电流功耗。开关开启工作时有非常低的插入损耗以及非常高的线性度。 1.2主要特征 频率范围: 0.…

项目管理:如何利用工具做好工作汇报?

我们公司曾经经历了一次惨痛的教训。我们为一家重要的大客户提供咨询服务&#xff0c;但在项目结束时&#xff0c;我们的项目负责人在电梯间遇见了客户的总经理&#xff0c;被问及项目结果时&#xff0c;却无法在短时间内清晰地表达出来。这一失误导致我们失去了这位重要客户。…

什么是跳表

什么是跳表 跳表全称为跳跃列表&#xff0c;它允许快速查询&#xff0c;插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表&#xff0c;且每一层链表中的元素是前一层链表元素的子集&#xff08;见右…

【Redis】Redis 内存回收

文章目录 1. 过期key处理1.1 惰性删除1.2 周期删除 2. 内存淘汰策略 Redis 中数据过期策略采用定期删除惰性删除策略结合起来&#xff0c;以及采用淘汰策略来兜底。 定期删除策略&#xff1a;Redis 启用一个定时器定时监视所有的 key&#xff0c;判断key是否过期&#xff0c;过…

大语言模型技术原理

在今天这个时代&#xff0c;人们的工作和生活已经离不开数据访问&#xff0c;而几乎所有平台背后的数据存储和查询都离不开数据库。SQL作为一种数据库的查询和处理语言历史悠久&#xff0c;最早由IBM于上世纪70年代初研究关系数据模型时提出&#xff0c;后续发展为一种广泛使用…

Python实战基础15-匿名函数,高阶函数

1、匿名函数 用lambda关键词能创建小型匿名函数&#xff0c;这种函数得名于省略了用def声明函数的标准步骤。 lambda函数的语法只包含一个语句&#xff0c;如下&#xff1a; lambda 参数列表&#xff1a; 运算表达式 如下实例&#xff1a; sum lambda arg1,arg2:arg1 arg2…

Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial

未完待续。。。。。 5.1 基本操作 参考视频: 5 - 1 - Basic Operations (14 控制输出格式的长短 min).mkv 5.1.1 简单运算 不等于符号的写法是这个波浪线加上等于符号 ( ~ )&#xff0c;而不是等于感叹号加等号( ! ) 1 1 1   % 判断相等 2 1 ~ 2   % 判断不等 3 …

【AUTOSAR】Com通讯栈配置说明(一)---- Can模块

通讯栈 模块 项目通讯栈 主要包含如下几个模块&#xff1a; 各模块详细配置说明 Can模块 这部分最终会导入到EB 中&#xff0c;通过EB 生成CanDriver 代码&#xff0c; 具体参数的介绍已经在EB 配置说明中介绍过。 CanController ​​​​​​​CanHaredWareObject 以其中一…