112 arcpy 发布 mxd地图文件 到 arcgis服务器 为 地图服务

前言

此文档主要是记录一下 最近的一次机遇 arcpy 来发布 地图文件到 arcgis服务器 上面

arcpy 主要是来自于 ArcGIS_Desktop_105_154030.zip 安装之后会在 python 的安装目录 安装另外的一份带 arcgis 的 python 环境, 然后 本文相关类库 也是基于 这个

 

 

arcpy python 环境 

04ddeea03bbc412b84891ecc042b61fb.png

 

然后执行 “import arcpy” 测试 arcpy 的使用, 如下 没有任何 报错, 表示可以正常使用 

8fad0e260782468cbce4592b014ed675.png

 

 

arcgis 服务器的信息 

基于 docker 直接搭建, 然后 不要挂载 任何信息, 相关的问题 会少一些

root@ubuntu:~/docker/arcgis# cat docker-compose.ymlversion: '3'
services:arcgisserver:image: huas/arcgisserver:10.3.1container_name: arcgisserver
#    volumes:
#      - ./gisdata:/arcgisports:- 6080:6080

 

 

测试的 mk.mxd 的文件

看一下 我们这里的 mxd 文件, 在 arcmap 中打开效果如下 

e9cec13f0d8a4404b40d9a3f158899c0.png

 

 

PublishService.py 

然后我们这里发布的代码 也是直接来源于网络 

Github 上面 suwenjiang 的 TinyTools 下面的 Publishservice.py

项目链接如下 TinyTools

核心业务 没有任何修改, 仅仅是 调整了一下 注释, 因为原文 注释似乎是乱了

 

发布代码如下

import sys
import timeimport arcpy__author__ = 'jiangmb'from arcpy import mapping
import xml.dom.minidom as DOM
import os
import tempfile# create connection to arcgis server
class CreateContectionFile(object):def __init__(self):self.__filePath = Noneself.__loginDict = Nonedef CreateContectionFile(self):try:server_url = "http://{}:{}/arcgis/admin".format(self.__loginDict['server'], self.__loginDict['port'])connection_file_path = str(self.__filePath)  #use_arcgis_desktop_staging_folder = Falseif os.path.exists(connection_file_path):os.remove(connection_file_path)out_name = os.path.basename(connection_file_path)path = os.path.split(self.filePath)[0]print ("++++++++ INFO: before connect to arcgis server succeed ++++++++")result = mapping.CreateGISServerConnectionFile("ADMINISTER_GIS_SERVICES", path, out_name, server_url, "ARCGIS_SERVER", use_arcgis_desktop_staging_folder, path,self.__loginDict['userName'], self.__loginDict['passWord'], "SAVE_USERNAME")print ("++++++++ INFO: connect to arcgis server succeed ++++++++")return connection_file_pathexcept Exception as msg:print (msg)@propertydef filePath(self):return self.__filePath@filePath.setterdef filePath(self, value):self.__filePath = value@propertydef loginInfo(self):return self.__loginDict@loginInfo.setterdef loginInfo(self, value):self.__loginDict = value# create service definition draft
class CreateSddraft:def CreateSddraft(self, mapDocPath, con, serviceName, copy_data_to_server=True, folder=None):mapDoc = mapping.MapDocument(mapDocPath)sddraft = mapDocPath.replace(".mxd", ".sddraft")print ("++++++++ INFO: before " + serviceName + " create draft file ++++++++")result = mapping.CreateMapSDDraft(mapDoc, sddraft, serviceName, 'ARCGIS_SERVER', con, copy_data_to_server, folder)print ("++++++++ INFO: after " + serviceName + " create draft file ++++++++")return sddraftdef setTheClusterName(self, xml, clusterName):doc = DOM.parse(xml)doc.getElementsByTagName('Cluster')[0].childNodes[0].nodeValue = clusterNameoutXml = xmlf = open(outXml, 'w')doc.writexml(f)f.close()return outXml# publish arcgis service
class PublishServices:def checkfileValidation(self, mxdLists):print ("++++++++ INFO: before before check mxd file list ++++++++")file_to_be_published = []for file in mxdLists:mxd = mapping.MapDocument(file)brknlist = mapping.ListBrokenDataSources(mxd)if not len(brknlist) == 0:print ("++++++++ ERROR: process mxd file " + os.path.split(file)[1] + " ++++++++")else:file_to_be_published.append(file)print ("++++++++ INFO: after before check mxd file list ++++++")return file_to_be_publisheddef publishServices(self, mxdLists, con, clusterName='default', copy_data_to_server=True, folder=None):for file in self.checkfileValidation(mxdLists):serviceName = os.path.splitext(os.path.split(file)[1])[0]clsCreateSddraft = CreateSddraft()sddraft = clsCreateSddraft.CreateSddraft(file, con, serviceName, copy_data_to_server, folder)analysis = arcpy.mapping.AnalyzeForSD(sddraft)dirName = os.path.split(file)[0]if analysis['errors'] == {}:print ("++++++++ WARNING: there are warning as follow +++++++")print (analysis['warnings'])sd = dirName + "\\" + serviceName + ".sd"if (os.path.exists(sd)):print ("++++++++ INFO: remove old service definition :" + serviceName + " +++++++")os.remove(sd)try:print ("++++++++ INFO: before generate service definition from service definition draft : " + serviceName + " +++++++")arcpy.StageService_server(sddraft, sd)print ("++++++++ INFO: after generate service definition from service definition draft : " + serviceName + " +++++++")print ("++++++++ INFO: before upload service definition to arcgis server : " + str(serviceName) + " ++++++")arcpy.UploadServiceDefinition_server(sd, con, in_cluster=clusterName)print ("++++++++ INFO: after upload service definition to arcgis server : " + str(serviceName) + " ++++++")except Exception as msg:print (msg)else:print ('++++++++ ERROR: process error:' + analysis['errors'] + '++++++++')time.sleep(5)sys.exit(1)def checkWarnings(self, warnings):for warning in warnings:if warning[1] == 24011:print ("++++++++ check warning, received error code 24011 +++++++")return Truereturn Falsedef GetMxFileList(self, filePath):if not os.path.exists(filePath):print ("++++++++ ERROR: target mxd folder does not exists +++++++")sys.exit(1)list = []for root, dirname, files in os.walk(filePath):for file in files:if os.path.splitext(file)[1] == '.mxd':mxdfile = os.path.join(root, file)list.append(mxdfile)if list == []:print ("++++++++ INFO: collected empty mxd file list ++++++++")time.sleep(5)sys.exit(1)return listdef publishMxdFolder():server = "192.168.220.133"userName = "admin"passWord = "admin@2021"port = "6080"mxdDir = "D:\\Jobs\\99_arcgis\\mxd\\test01Mk"servic_dir = "jerry_20230620"clusterName = "default"logDict = {'server': server,'userName': userName,'passWord': passWord,'port': port}contionfile = os.path.join(tempfile.mkdtemp(), 'server.ags')instace = CreateContectionFile()instace.filePath = contionfileinstace.loginInfo = logDictinstace.CreateContectionFile()if (os.path.isfile(contionfile) == False):print ("++++++++ ERROR: connect to arcgis server failed ++++++++")time.sleep(5)sys.exit(1)clsPublishservice = PublishServices()fileList = clsPublishservice.GetMxFileList(mxdDir)if len(servic_dir) == 0:servic_dir == Noneif len(clusterName) == 0:clusterName = 'default'clsPublishservice = PublishServices()clsPublishservice.publishServices(fileList, contionfile, clusterName, copy_data_to_server=False, folder=servic_dir)if __name__ == '__main__':publishMxdFolder()

 

 

然后执行给定的脚本, 日志信息如下 

++++++++ INFO: before connect to arcgis server succeed ++++++++
++++++++ INFO: connect to arcgis server succeed ++++++++
++++++++ INFO: before before check mxd file list ++++++++
++++++++ INFO: after before check mxd file list ++++++
++++++++ INFO: before mk create draft file ++++++++
++++++++ INFO: after mk create draft file ++++++++
++++++++WARNING: there are warning as follow +++++++
{(u'Map is being published with data copied to the server using data frame full extent', 10045): [], (u"Layer's data source is not registered with the server and data will be copied to the server", 24011): [<map layer u'mk'>, <map layer u'lyjq'>], (u'Missing Tags in Item Description', 24059): [], (u"Layer's data source doesn't have a spatial index", 10002): [<map layer u'mk'>], (u'Missing Summary in Item Description', 24058): []}
++++++++ INFO: remove old service definition :mk +++++++
++++++++ INFO: before generate service definition from service definition draft : mk +++++++
++++++++ INFO: after generate service definition from service definition draft : mk +++++++
++++++++ INFO: before upload service definition to arcgis server : mk ++++++
++++++++ INFO: after upload service definition to arcgis server : mk ++++++

 

然后 刷新 arcgis服务器 上面的服务信息, 就可以看到对应的服务信息 

a355921d86634ca99b1ae8e8f3a83d05.png

 

mk 服务的 rest url 信息如下 

5ca5c46f4dba4044b00f1691cd6b37cf.png

 

客户端的使用

然后前端这边 使用给定的图层服务信息, 这里使用的是 ol 包 

let tileSources = new TileArcGISRest({url:'http://192.168.220.133:6080/arcgis/rest/services/jerry_20230620/mk/MapServer'
});
let tileLayers = new Tile({className:'testLayer',source: tileSources,zIndex: 1,
});
this.map.addLayer(tileLayers);

 

页面上查看效果, 和 arcmap 中看到的效果 一致

089b68af084c4c38828f638a31454a70.png

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins(docker)安装及应用

jenkins Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行&#xff08;这个比较抽象&#xff0c;暂且写上&#xff0c;不做解…

【算法刷题 | 回溯思想 04】4.15(分割回文串)

文章目录 7.分割回文串7.1题目7.2解法&#xff1a;回溯7.2.1回溯思路&#xff08;1&#xff09;函数返回值以及参数&#xff08;2&#xff09;终止条件&#xff08;3&#xff09;遍历过程 7.2.2代码 7.分割回文串 7.1题目 给你一个字符串 s&#xff0c;请你将 s 分割成一些子…

【蓝桥·算法双周赛 第 9 场 小白入门赛】盖印章【算法赛】题解(数学+解方程)

思路 考虑到题目中的规则&#xff0c;每个印章图案的边必须和网格图边重合&#xff0c;网格图上的每一个格子最多只能被一个印章图案覆盖&#xff0c;印章的图案在网格图上必须是完整的。这意味着每个印章图案都会覆盖一个独立的、完整的区域&#xff0c;且这些区域不会相互重…

OpenHarmony实战开发-页面深色模式适配。

介绍 本示例介绍在开发应用以适应深色模式时&#xff0c;对于深色和浅色模式的适配方案&#xff0c;采取了多种策略如下&#xff1a; 1. 固定属性适配&#xff1a;对于部分组件的颜色属性&#xff0c;如背景色或字体颜色&#xff0c;若保持不变&#xff0c;可直接设定固定色值…

Linux网络基础(一)

网络发展 对于我们国家来讲&#xff0c;网络的发展&#xff0c;不仅仅是互联网公司在发展&#xff0c;提供重要推动力的还有三大运商 随之而来的是新设备的诞生。比如集线器&#xff0c;网线&#xff0c;光纤&#xff0c;调制解调器&#xff0c;路由器&#xff0c;防火墙&am…

Nginx转发请求错误

说明&#xff1a;记录一次使用Nginx转发请求的错误&#xff1b; 场景 公司内部有两台服务器都跑了后端项目&#xff0c;在使用Nginx做请求分发时&#xff0c;我发现其中有台服务器一直没有处理请求&#xff08;没打印相关的日志信息&#xff09;&#xff0c;于是我修改了下Ng…

NVIDIA全系列GPU技术路线演进分析

NVIDIA GPU 架构梳理 近期深入研究并行计算&#xff0c;需探究底层硬件精髓。高性能计算界&#xff0c;英伟达显卡稳居霸主地位。本文旨在梳理NVIDIA GPU架构之演进历程&#xff0c;助您洞悉其技术脉络&#xff0c;把握未来计算趋势。 目录&#xff1a; NVIDIA GPU架构历经数次…

代码随想录Day41:动态规划Part3

Leetcode 343. 整数拆分 讲解前&#xff1a; 毫无头绪 讲解后&#xff1a; 这道题的动态思路一开始很不容易想出来&#xff0c;虽然dp数组的定义如果知道是动态规划的话估摸着可以想出来那就是很straight forward dp定义&#xff1a;一维数组dp[i], i 代表整数的值&#xf…

WEB前端-笔记

目录 一、字体 二、背景图片 三、显示方式 四、类型转换 五、相对定位 六、绝对定位 七、固定定位 八、Index 九、粘性定位 十、内边距 十一、外边距 十二、边框 十三、盒子尺寸计算问题 十四、清楚默认样式 十五、内容溢出 十六、外边距的尺寸与坍塌 十七、行…

构建高效可靠的Zabbix监控系统

前言 监控系统对于确保系统稳定性、性能优化以及故障排除至关重要。zabbix 作为一款功能强大且灵活的监控解决方案&#xff0c;可以通过一个友好的界面进行浏览整个网站所有服务器状态、在 web 前端方便查看数据以及可以回溯事故时的问题和告警。 目录 一、zabbix 监控介绍 …

electron打包编译国产统信uos系统 arm架构 x86架构 linux mac等环境

electron v21版本以上统信UOS会提示gbm_bo_map错误&#xff0c;可使用v8~v21版本的electron 打包linux包需要再linux系统下运行编译&#xff0c;arch可以指定架构 如果要在统信uos上运行&#xff0c;需要打包成deb格式&#xff0c;在target中修改成deb 或者用第三方软件把app…

建立时间/保持时间为负是什么情况

目录 建立时间为负保持时间为负参考 在说明建立时间和保持时间为何为负的情况下&#xff0c;首先可以看看建立时间Tsu和保持时间Th的由来&#xff0c;可参考如下两篇文章&#xff1a; 建立时间和保持时间理解_为什么要满足建立时间和保持时间-CSDN博客 ic基础|时序篇&#xff…

基于Springboot的旅游管理系统

基于SpringbootVue的旅游管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页展示 旅游方案展示 旅游资讯 后台管理员登录 后台管理页面首页 用户管理 …

全流程HEC-RAS 1D/2D水动力与水环境模拟技术应用

水动力与水环境模型的数值模拟是实现水资源规划、环境影响分析、防洪规划以及未来气候变化下预测和分析的主要手段。然而&#xff0c;一方面水动力和水环境模型的使用非常复杂&#xff0c;理论繁复&#xff1b;另一方面&#xff0c;免费的水动力和水环境软件往往缺少重要功能&a…

MyBatis 中的动态 SQL 的相关使用方法

为什么会有动态SQL&#xff0c;把SQL写死不是比较方便吗&#xff1f;其实有很多的举例&#xff0c;这里我那一个常见的来说&#xff0c;像我们用户注册&#xff0c;会有必填字段和非必填字段&#xff0c;有些传来的参数不一样&#xff0c;那对应的SQL也不一样&#xff0c;因此&…

c++ 多文件编程

1.结构目录 声明类:用于声明方法,方便方法管理和调用&#xff1b; 实现类:用于实现声明的方法; 应用层:调用方法使用 写过java代码的兄弟们可以这么理解&#xff1a; 声明类 为service层 实现类 为serviceimpl层 应用层 为conlloter层 2.Dome 把函数声明放在头文件xxx.h中&…

前端三剑客 —— JavaScript (第七节)

目录 内容回顾 DOM编程 事件对象* 事件驱动机制 标签绑定 DOM0事件模型 DOM2事件 捕获/冒泡 事件解除 窗口事件属性&#xff08;Window Event Attributes&#xff09; 表单事件&#xff08;Form Events&#xff09; 键盘事件&#xff08;Keyboard Events&#xff09…

springboot整合vosk实现简单的语音识别功能

vosk开源语音识别 Vosk是开源的语音识别工具包。Vosk支持的事情包括&#xff1a; 支持十九种语言 - 中文&#xff0c;英语&#xff0c;印度英语&#xff0c;德语&#xff0c;法语&#xff0c;西班牙语&#xff0c;葡萄牙语&#xff0c;俄语&#xff0c;土耳其语&#xff0c;越…

TCP/IP协议—TCP

TCP/IP协议—TCP TCP协议TCP通信特点TCP技术概念TCP定时器 TCP头部报文TCP连接三次握手&#xff08;建立连接&#xff09;四次挥手&#xff08;释放连接&#xff09;连接状态 TCP协议 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种…

ubuntu16.04安装Eclipse C/C++

1.安装 JDK 官网源码安装 首先打开JDK官网&#xff0c;JDK1.8的下载网址为&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/#java8-windows&#xff0c;进入到网址如下图所示&#xff1a; 向下滑动到 JDK1.8的下载界面&#xff0c;如下图所示&#xff1a…