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.mzph.cn/news/819193.shtml

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

相关文章

web实战项目环境部署(LNMP)

环境搭建准备 1、在本机安装VMware虚拟机&#xff0c;实际工作中&#xff0c;使用的是云服务器 2、在虚拟机上安装并运行Linux系统 3、在本机上安装好远程连接工具&#xff08;xshell/FinalShell&#xff09;&#xff0c;通过远程连接工具连接到虚拟机 4、关闭linux上的防火…

深度学习之PyTorch实现卷积神经网络(CNN)

在深度学习领域&#xff0c;卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;是一种非常强大的模型&#xff0c;专门用于处理图像数据。CNN通过卷积操作和池化操作来提取图像中的特征&#xff0c;具有较好的特征学习能力&#xff0c;特别适用…

优先队列处理文件的锁定和自动解锁

【背景】最近要做一个防篡改的功能&#xff0c;一开始是采用事件型的方式实现的&#xff0c;结果发现会有一种情况"如果某个文件短时间一直被外部进行多次恶意操作"时&#xff0c;一直防也不是个事&#xff0c;应该在加一层防护—文件锁定&#xff0c;这样就舒服多了…

云原生:企业数字化转型的引擎与未来

一&#xff0c;引言 随着信息技术的飞速发展&#xff0c;企业数字化转型已成为时代的必然趋势。在这场深刻的变革中&#xff0c;云原生技术以其独特的优势&#xff0c;逐渐成为推动企业数字化转型的核心动力。本文将详细探讨云原生技术的内涵、发展历程&#xff0c;以及在企业数…

【Java开发指南 | 第八篇】Java变量、构造方法、创建对象

专栏&#xff1a;Java开发指南 CSDN秋说 文章目录 Java变量构造方法创建对象 Java变量 局部变量&#xff1a;在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中&#xff0c;方法结束后&#xff0c;变量就会自动销毁。成员变量&#xff08;…

研究生,该学单片机还是plc。?

PLC门槛相对较低&#xff0c;但是在深入学习和应用时&#xff0c;仍然有很高的技术要求。我这里有一套单片机入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习单片机&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&am…

OpenHarmony实战开发-图片选择和下载保存案例。

介绍 本示例介绍图片相关场景的使用&#xff1a;包含访问手机相册图片、选择预览图片并显示选择的图片到当前页面&#xff0c;下载并保存网络图片到手机相册或到指定用户目录两个场景。 效果图预览 使用说明 从主页通用场景集里选择图片选择和下载保存进入首页。分两个场景点…

Linux UDP通信系统

目录 一、socket编程接口 1、socket 常见API socket()&#xff1a;创建套接字 bind()&#xff1a;将用户设置的ip和port在内核中和我们的当前进程关联 listen() accept() 2、sockaddr结构 3、inet系列函数 二、UDP网络程序—发送消息 1、服务器udp_server.hpp initS…

Hadoop HDFS:海量数据的存储解决方案

引言 在大数据时代&#xff0c;数据的存储与处理成为了业界面临的一大挑战。Hadoop的分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;简称HDFS&#xff09;作为一个高可靠性、高扩展性的文件系统&#xff0c;提供了处理海量数据的有效解决方案。本文将…

stm32开发之threadx整合letter-shell 组件记录

前言 使用过rt-thread的shell 命令交互的方式&#xff0c;觉得比较方便,所以在threadx中也移植个shell的组件。这里使用的是letter-shellletter-shell 核心的逻辑在于组件通过链接文件自动初始化或自动添加的两种方式&#xff0c;方便开发源码仓库 实验(核心代码) shell 线程…

rhce day1

一 . 在系统中设定延迟任务要求如下 在系统中建立 easylee 用户&#xff0c;设定其密码为 easylee 延迟任务由 root 用户建立 要求在 5 小时后备份系统中的用户信息文件到 /backup 中 确保延迟任务是使用非交互模式建立 确保系统中只有 root 用户和 easylee 用户可以执行延…

✌粤嵌—2024/3/11—跳跃游戏

代码实现&#xff1a; 方法一&#xff1a;递归记忆化 int path; int used[10000];bool dfs(int *nums, int numsSize) {if (path numsSize - 1) {return true;}for (int i 1; i < nums[path]; i) {if (used[path i]) {continue;}path i;used[path] 1;if (dfs(nums, num…

“华为杯“华南理工大学程序设计竞赛 L-再一道好题

题目 #include<bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second const int maxn 1e6 5; const int inf 1e9 5;using namespace std;int n, m;void solve(){int res 0;int q;string s;int k;cin …

北京市为例的空气质量分析报告分析【免费送】

原始数据&#xff1a; 日期名称类型所属区拥挤指数速度客流指数20240405世界之花假日广场购物;购物中心大兴区2.46621.369.4920240405华润五彩城购物;购物中心海淀区2.01329.7111.1720240405北京市百货大楼购物;购物中心东城区1.85615.938.2320240405apm购物;购物中心东城区1.…

C#开源项目推荐

winform界面开发 SunnyUI SharpSCADALite工业控制数据采集 https://github.com/qwe7922142/SharpSCADALite net中国集合优秀Net项目 https://gitee.com/dotnetchina 数据库管理系统 https://gitee.com/dotnetchina/SmartSQL 工作流项目 RoadFlow-UnMean 网口通讯 weaving-…

Grok-1.5 Vision:X AI发布突破性的多模态AI模型,超越GPT 4V

在人工智能领域&#xff0c;多模态模型的发展一直是科技巨头们竞争的焦点。 近日&#xff0c;马斯克旗下的X AI公司发布了其最新的多模态模型——Grok-1.5 Vision&#xff08;简称Grok-1.5V&#xff09;&#xff0c;这一模型在处理文本和视觉信息方面展现出了卓越的能力&#x…

Python统计模型线性推理事件前因后果

&#x1f3af;要点 经典统计方法&#xff1a;&#x1f58a; A/B测试&#xff0c;计算两个均值样本的置信区间&#xff0c;&#x1f58a;最小二乘法计算变量估值&#xff0c;&#x1f58a;使用非线性关系式表示线性回归。&#x1f58a;实例&#xff1a;高等教育和数学高分的事件…

批量导入照片

clear clc close all % 创建或获取演示文稿对象 ppt Presentation(new_presentation.pptx, 演示文稿1.pptx); open(ppt); % 添加新的幻灯片 slide1 add(ppt, Title Slide); % 指定第一张图片路径 imagePath1 C:\Users\Administrator\Desktop\001\阵风因子-横风向图20…

Linux usermod命令教程:如何修改用户属性(附案例详解和注意事项)

Linux usermod命令介绍 usermod命令是Linux系统中用来修改用户属性的命令。它可以修改用户的登录名、家目录、登录shell、用户组等信息。 Linux usermod命令适用的Linux版本 usermod命令在大多数Linux发行版中都是可用的&#xff0c;包括Debian、Ubuntu、Alpine、Arch Linux…