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

embedded/2024/10/17 22:23:37/

前言

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

相关文章

基于httpd和lvs的dr模式简单测试

lvs主机&#xff1a;192.168.50.154 httpd主机&#xff1a;192.168.50.157 192.168.50.156 &#xff08;ip需要在同一网段&#xff09; 虚拟ip&#xff1a;192.168.50.183 前提准备&#xff1a; lvs安装&#xff1a; yum install ipvsadm -y lsmod|grep ip_vs modprobe ip_vs …

exceljs库实现excel表样式定制化

概览 xlsx 是前端最热门的 Excel 导出方案&#xff0c;又叫做 SheetJs&#xff0c;默认不支持修改 Excel 的样式。而exceljs库就可以做到自定义excel表样式&#xff0c;下面来介绍一下其使用方法 一. 完整示例 代码示例 const exportTemplate2 () > { // 创建工作簿 …

webpack源码分析——enhanced-resolve库之cdUp函数

一、 cdUp函数 函数功能 该函数寻找上层目录&#xff0c;每次调用函数时对输入的路径进行一次寻找上级目录。如果没有找到返回null 二、函数分析 传入的directory判读是否为‘/’如果是直接返回nullif (directory "/") return null;获取‘/’和‘\’在directory 中…

Python基于循环神经网络的情感分类系统设计与实现,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

stm32中的中断优先级

在工作中使用到多个定时器中断,由于中断的中断优先级不熟悉导致出错,下面来写一下中断的一些注意事项。 一、中断的分类 1、EXTI外部中断:由外部设备或外部信号引发,例如按键按下、外部传感器信号变化等。外部中断用于响应外部事件,并及时处理相关任务。 2、内部中断:…

9月BTE第8届广州国际生物技术大会暨展览会,全媒体聚焦下的高精尖行业盛会

政策春风助力&#xff0c;共迎大湾区生物医药行业50亿红利 今年3月“创新药”首次写入国务院政府工作报告之后&#xff0c;广州、珠海、北京多地政府纷纷同步出台了多项细化政策&#xff0c;广州最高支持额度高达50亿元&#xff0c;全链条为生物医药产业提供资金支持&#xff…

Spring之CGLIB和JDK动态代理底层实现

目录 CGLIB 使用示例-支持创建代理对象&#xff0c;执行代理逻辑 使用示例-多个方法&#xff0c;走不同的代理逻辑 JDK动态代理 使用示例-支持创建代理对象&#xff0c;执行代理逻辑 ProxyFactory 如何自动在CGLIB和JDK动态代理转换 使用示例-使用CGLIB代理方式 使用示…

MongoDB的使用

一、Spring Boot集成MongoDB 1 引用依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency> 2 配置文件配置mongodb资料 # MongoDB连接信息 spring.…