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

2023-11-10

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)
    # 指定项目坐标系为2000
    out_coordinate_system = arcpy.SpatialReference(4490)
    aprx_map.spatialReference = out_coordinate_system
    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
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ArcGis系列-java发布空间表为地图服务(map) 的相关文章

  • Pandas 滚动窗口 Spearman 相关性

    我想使用滚动窗口计算 DataFrame 两列之间的 Spearman 和 或 Pearson 相关性 我努力了df corr df col1 rolling P corr df col2 P为窗口尺寸 但我似乎无法定义该方法 添加meth
  • 从 CLI 部署 Maven 项目?

    在 IDE 中构建并运行良好 cd home thufir NetBeansProjects HelloMaven JAVA HOME usr lib jvm java 8 openjdk amd64 home thufir local s
  • 避免 @Secured 注释的重复值

    我正在尝试使用以下方法来保护我的服务方法 Secured如下 public interface IUserService Secured ROLE ROLE1 ROLE ROLE2 ResponseEntity saveUser Creat
  • 与 while 循环一样,如何跳过 for 循环中的步骤?

    我尝试像 while 循环一样跳过 for 循环中的几个步骤 在 while 循环中 步骤根据特定条件进行调整 如下面的代码所示 i 0 while i lt 10 if i 3 i 5 else print i i i 1 result
  • Python多处理错误“ForkAwareLocal”对象没有属性“连接”

    下面是我的代码 我面临着多处理问题 我看到这个问题之前已经被问过 我已经尝试过这些解决方案 但它似乎不起作用 有人可以帮我吗 from multiprocessing import Pool Manager Class X def init
  • 在Java中如何将字节数组转换为十六进制?

    我有一个字节数组 我希望该数组的每个字节字符串转换为其相应的十六进制值 Java中有没有将字节数组转换为十六进制的函数 byte bytes 1 0 1 2 3 StringBuilder sb new StringBuilder for
  • 乘以行并按单元格值附加到数据框

    考虑以下数据框 df pd DataFrame X a b c d Y a b d e Z a b c d 1 2 1 3 df 我想在 列中附加数字大于 1 的行 并在该行中的数字减 1 df 最好应该 然后看起来像这样 或者它可能看起来
  • 如何使用 paramiko 查看(日志)文件传输进度?

    我正在使用 Paramiko 的 SFTPClient 在主机之间传输文件 我希望我的脚本打印文件传输进度 类似于使用 scp 看到的输出 scp my file user host user host password my file 1
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • 如何使用 Java 在 selenium webdriver 中打开新选项卡或如何使用使用 selenium webdriver 的操作类在 selenium 中按 ctrl +T [重复]

    这个问题在这里已经有答案了 如何使用 Java 在 Selenium Webdriver 中按 CTRL T 或者 如何使用 Java 在 selenium webdriver 中打开新选项卡 简单步骤 1 打开google com 不必触
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 为什么 smtplib.SMTP().sendmail 不发送 DKIM 签名邮件

    我已经在服务器上设置了 postfix 以及 openDKIM 当我跑步时 echo Testing setup mail s Postfix test my email address 我收到电子邮件 邮件标题中有一个DKIM Signa
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但

随机推荐

  • 数据结构和算法(4)-----栈

    一 栈的一个实际需求 例如 请输入一个表达式计算式 7 2 2 5 1 5 3 3 点击计算 如下图 请问 计算机底层是如何运算得到结果的 注意不是简单的把算式列出运算 因为我们看这个算式 7 2 2 5 但是计算机怎么理解这个算式的 对计
  • 2023“钉耙编程”中国大学生算法设计超级联赛(3)

    Chaos Begin 贪心 凸包 Out of Control DP 递推 Operation Hope 贪心 2 sat与二分 8 bit Zoom 二维前缀 Noblesse Code 轨迹哈希 字典序 差分 Problem 7303
  • 训练集、验证集以及测试集的区别

    1 数据集的划分 训练集 含有参考答案的数据 用来训练模型的已标注数据 用来建立模型 发现规律 验证集 模型训练过程中单独留出的样本集 用于调整模型的超参数和用于对模型的能力进行初步评估 测试集 用来评估模最终模型的泛化能力 但不能作为调参
  • 【cdk的使用】 C语言 零拷贝 链表 队列 栈的使用

    Github地址 https github com wujin1989 cdk cdk的 list 是基于双向循环链表实现 queue 和 stack 基于 list实现 所以cdk用一个双向循环链表实现了三种数据结构 如何使用cdk的链表
  • Python ·保险理赔分析:数据分析

    介绍 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 在本笔记本中 我们将仔细研究保险索赔 并弄清一些有关血压 BMI 糖尿病 吸烟 年龄和性别等条件如何影响索赔价值的事实 我们将使用散点图 饼图 直方图等通过探索性数据分
  • dnn回归预测_Keras之DNN:基于Keras(sigmoid+linear+mse+predict)利用DNN实现回归预测——DIY多分类数据集&预测新数据点...

    Keras之DNN 基于Keras sigmoid linear mse predict 利用DNN实现回归预测 DIY多分类数据集 预测新数据点 目录 输出结果 实现代码 输出结果 实现代码 coding utf 8 Xa Xb for
  • postman 下载图片_postman测试上传图片接口步骤教程

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 前端也要学会使用 只有这样 当接口调试不通的时候 用测试工具 才能够更有底气的甩一张截图给你家的后端 瞧 这是你写的bug 现在来说一下 怎么测试一个上传图片的
  • 工作日志【 SQL内部规范-ETL银行项目 】

    工作日志 SQL内部规范 ETL银行项目 一 表结构设计 建表时 首先要确定表的业务唯一键 即该表的唯一索引由哪些字段构成 不建议创建没有唯一索引的表 如果要修改表的唯一索引 一定要严格评审 前台 表结构变更 F层的表需要通知JAVA开发
  • SpringCloud项目下使用分布式事务seata TCC模式与AT模式例子

    SpringCloud项目下使用分布式事务seata TCC模式与AT模式例子
  • 3-2 特征二值化

    特征二值化 请参考 数据准备和特征工程 中的相关章节 调试如下代码 基础知识 import pandas as pd pm25 pd read csv home aistudio data data20505 pm2 csv pm25 he
  • 使用Flex&Bison创建新的编程语言

    编译器基本流程 对源文件进行扫描 将源文件的字符流拆分分一个个的词 记号 此为词法分析 根据语法规则将这些记号构造出语法树 此为语法分析 对语法树的各个节点之间的关系进行检查 检查语义规则是否被违背 同时对语法树进行必要的优化 此为语义分析
  • 苹果个人公司类型开发者账号申请(99美元)详解

    最近有用 记录一下 谈到苹果开发者账号 我们需要区分一下个人账号 公司账号和企业账号这三种 还有一种是教育账号 这个就不多说了 个人账号 个人申请用于开发苹果app所使用的账号 仅限于个人使用 申请比较容易 99 公司账号 以公司的名义申请
  • jqgrid 自定义搜索的实现 , 后台实现

    好久没写过博客了 新入职公司比较忙 咳咳 其实是比较懒 最近公司要求做一个后台 于是直接巴拉了bootstrap 的ace折叠菜单改造了下 由于大部分都是数据交互 频繁使用了 ace中包含的 jqgrid 要做后台的朋友可以去搜索一下ace
  • C#中@的用法总结(转)

    本文实例汇总了C 中 的用法 对C 程序设计来说有不错的借鉴价值 具体如下 一 字符串中的用法 1 学过C 的人都知道C 中字符串常量可以以 开头声名 这样的优点是转义序列 不 被处理 按 原样 输出 即我们不需要对转义字符加上 反斜扛 就
  • libxlsxwriter初体验

    C 如何写Excel 大家时间都这么宝贵 没有起因的问题是不值得被优先研究的 这篇博客的起因就是希望找到一个比较合适于C 的开源库 用以在C 中生成Excel文档 其实C 可用的开源Excel库 很多博主都已经撰文提及 例如 c 操作exc
  • 第六篇 TCP协议

    1 专业名词缩写 应用层头 ah Application Header 表示层头 ph Presentation Header 会话层头 sh Session Header 传输层头 th Transport Header 网络层头 nh
  • cJson数组的生成与解析

    cJson数组的生成与解析 cJosn官方源码地址 https sourceforge net projects cjson 使用json偶尔会遇到数组 每次都要去查相关函数 去解析或者生成 在此做一次记录 方便以后使用 按照我自己的使用习
  • 基于opencv视觉图像处理的巡线小车设计(stm32+树莓派+usb摄像头)

    功能说明 1 视觉巡线 usb摄像头 opencv 2 遇到红灯停车 红灯出现在小车右前方时 3 固定动作避障 光电对管 4 按键启动 急停 4 按键调整运行速度 资料说明 本小车图像处理部分在树莓派中实现 小车控制部分在stm32中实现
  • android ListView 滚动加载item

    悉Android的朋友们都知道 不管是微博客户端还是新闻客户端 都离不开列表组件 可以说列表组件是Android数据展现方面最重要的组件 我们今天就要讲一讲列表组件ListView加载数据的相关内容 通常来说 一个应用在展现大量数据时 不会
  • ArcGis系列-java发布空间表为地图服务(map)

    1 实现思路 使用java调用cmd命令执行python脚本 python环境使用arcgis pro安装目录下的 ArcGIS Pro bin Python envs arcgispro py3 作为地图服务应该可以支持添加样式文件 发布