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

server/2024/10/17 22:22:48/

前言

此文档主要是记录一下 最近的一次机遇 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.ppmy.cn/server/7535.html

相关文章

C语言扫雷游戏完整版、标记、取消标记、自动拓展

文章目录 前言一、扫雷完整代码总结 前言 用C语言实现扫雷游戏&#xff0c;标记功能&#xff0c;取消标记功能&#xff0c;自动拓展功能&#xff0c;标记只是雷&#xff0c;并且数量等于雷的数量&#xff0c;自动获胜。 一、扫雷完整代码 // test.c 源文件 #define _CRT_SECU…

软考129-上午题-【软件工程】-McCabe度量法+白盒测试真题

一、真题 真题1&#xff1a; 简单路径&#xff1a; 简单路径是指在一个图中&#xff0c;从一个顶点出发&#xff0c;经过一系列不同的顶点&#xff0c;最终到达另一个顶点&#xff0c;且在整个过程中&#xff0c;除了起点和终点外&#xff0c;每个顶点只被访问一次的路径。在简…

概念理解: DDR的寻址容量设计

主要内容&#xff1a;DDR寻址容量设计的概念理解示例。 DDR的数据存储在不同的bank上&#xff0c;你知道具体是如何通过数据总线和地址总线的配合&#xff0c;拿到所需的数据吗&#xff1f;通过下面这样一个简单的问题&#xff0c;我们来逐渐了解这个过程的实现。 DDR…

暴雨智算中心解决方案助跑人工智能新赛道

ChatGPT、Sora等AI大模型应用让人工智能热潮迭起&#xff0c;越来越多的科技企业纷纷入局&#xff0c;竞跑AI和大模型新赛道。2024年中国《政府工作报告》也指出&#xff0c;人工智能成为新质生产力的重要代表&#xff0c;将持续开展“人工智能 ”行动。与此同时&#xff0c;以…

qt camkelist编写实现程序运行时动态加载库并访问其函数

文章目录 **创建库并实现导出函数****编写CMakeLists.txt****调用** 在使用C和Qt进行项目开发时&#xff0c;CMake是一个常用的跨平台构建系统生成工具&#xff0c;它能够管理构建过程&#xff0c;生成Makefile或者项目文件。想要使用CMake来动态链接一个库&#xff0c;并调用其…

PyTorch小技巧:使用Hook可视化网络层激活(各层输出)

这篇文章将演示如何可视化PyTorch激活层。可视化激活&#xff0c;即模型内各层的输出&#xff0c;对于理解深度神经网络如何处理视觉信息至关重要&#xff0c;这有助于诊断模型行为并激发改进。 我们先安装必要的库: pip install torch torchvision matplotlib加载CIFAR-10数据…

浏览器CSS兼容性问题解决方案整理

1、CSS Hack 使用 hacker 可以把浏览器分为3类&#xff1a;IE6&#xff1b;IE7和遨游&#xff1b;其他&#xff08;IE8 Chrome ff Safari opera等&#xff09; &#xff08;1&#xff09;IE6认识的 hacker 是 下划线 _ 和星号 * &#xff08;2&#xff09;IE7和遨游认识的 hac…

npm常用命令详解

前言 npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理器&#xff0c;它允许开发者安装、分享、更新和管理JavaScript库和工具。以下是一些常用的npm命令及其详细解释&#xff1a; 基础命令 1. 初始化一个新项目 npm init这个命令会引导你创建一个新的pack…