def __init__(self, agsOutFolder, agsOutName, tmpOutFolder, \ serverName, serverPort, username, password): ''' 构造器 ''' if not AIUtils.isEmpty(agsOutFolder) and not AIUtils.isEmpty(agsOutName) and not AIUtils.isEmpty(tmpOutFolder): self.__agsOutFolder = agsOutFolder self.__agsOutName = agsOutName self.__tmpOutFolder = tmpOutFolder if not self.__agsOutName.endswith('.ags'): self.__agsOutName += '.ags' server_url_part = self.__serverUrlPre = 'http://' + serverName + ':' + serverPort + '/arcgis' server_url = server_url_part + '/admin' use_arcgis_desktop_staging_folder = False staging_folder_path = self.__agsOutFolder self.__agsOutFolder = self.__agsOutFolder.replace('\\', '/') self.__agsOutFullName = os.path.join(self.__agsOutFolder, self.__agsOutName).replace('\\', '/') if not os.path.exists(self.__agsOutFullName): arcpy.mapping.CreateGISServerConnectionFile("PUBLISH_GIS_SERVICES", self.__agsOutFolder, self.__agsOutName, server_url, "ARCGIS_SERVER", use_arcgis_desktop_staging_folder, staging_folder_path, username, password, "SAVE_USERNAME")
def __init__(self, name=None, minScale=0, maxScale=0, transparency=0, visible=True): """ 构造器 """ self.__name = name self.__minScale = 0 if AIUtils.isEmpty(minScale) else minScale self.__maxScale = 0 if AIUtils.isEmpty(maxScale) else maxScale self.__transparency = 0 if AIUtils.isEmpty(transparency) else transparency self.__visible = True if AIUtils.isEmpty(visible) else visible
def __init__(self, name = None, alias = None, ftype = None, wkid = 4326, fds = None, fields = []): ''' 构造器 ''' self.__name = name self.__alias = alias self.__ftype = ftype self.__wkid = 4326 if AIUtils.isEmpty(wkid) else wkid self.__fds = None if AIUtils.isEmpty(fds) else fds self.__fields = [] if AIUtils.isEmpty(fields) else fields
def __init__(self, name = None, alias = None, ftype = None, scale = 0, length = 0, isNullable = True): ''' 构造器 ''' self.__name = name self.__alias = alias self.__ftype = ftype self.__scale = 0 if AIUtils.isEmpty(scale) else scale self.__length = 0 if AIUtils.isEmpty(length) else length self.__isNullable = True if AIUtils.isEmpty(isNullable) else isNullable
def __init__(self, wksName, userName = None): ''' 构造器 ''' if not AIUtils.isEmpty(wksName): arcpy.env.workspace = self.__wksName = wksName.replace('\\', '/') self.__userName = userName
def queryFdsList(self, fds): ''' 查询要素集列表 ''' qrs = [] if isinstance(fds, AIFds): name = fds.getName() datasets = arcpy.ListDatasets(None if AIUtils.isEmpty(name) else ('*'+ name + '*'), \ 'Feature') for dataset in datasets: desc = arcpy.Describe(dataset) sr = desc.spatialReference qrs.append(AIFds(AIUtils.unicode2utf8(desc.name), None if AIUtils.isEmpty(sr) else sr.factoryCode)) else: raise Exception('input parameter type not correct!') return qrs
def execute(self, sql): ''' 执行sql语句 ''' sde_conn = None sde_return = None try: sde_conn = None if AIUtils.isEmpty(self.__sdeOutFullName) else arcpy.ArcSDESQLExecute(self.__sdeOutFullName) if not AIUtils.isEmpty(sde_conn): try: sde_return = sde_conn.execute(sql) except: raise except: raise finally: del sde_conn return sde_return
def publish(self, svc): ''' 发布服务 ''' if not AIUtils.isEmpty(self.__agsOutFullName) and isinstance(svc, AISvc): mxdFullName = svc.getMxdFullName() serviceName = svc.getServiceName() serviceFolder = svc.getServiceFolder() description = svc.getDescription() serviceItems = svc.getServiceItems() try: # 生成服务草稿文件 sddraftFullName = os.path.join(self.__tmpOutFolder, serviceName + '.sddraft') sdFullName = os.path.join(self.__tmpOutFolder, serviceName + '.sd') mapDoc = arcpy.mapping.MapDocument(mxdFullName) arcpy.mapping.CreateMapSDDraft(mapDoc, sddraftFullName, serviceName, 'ARCGIS_SERVER', self.__agsFullName, False, serviceFolder) sDDraftEditor = AISEdit(sddraftFullName) # 添加服务描述 sDDraftEditor.setItemInfo({'description' : description}) # 添加额外服务能力 for item in serviceItems: if item.getEnabled(): sDDraftEditor.setSvcExtension(item.getTypeName(), 'true') analysis = arcpy.mapping.AnalyzeForSD(sddraftFullName) if analysis['errors'] == {}: # 过度服务草稿文件到SD文件 arcpy.StageService_server(sddraftFullName, sdFullName) # 上传SD文件到GIS服务器 arcpy.UploadServiceDefinition_server(sdFullName, self.__agsServer) # 发布成功存入服务地址 for item in serviceItems: if item.getEnabled(): typeName = item.getTypeName() if AIStrUtils.isEqual(typeName, 'MapServer'): svc.setUrl(self.__serverUrlPre + sDDraftEditor.getMapServerPartRestUrl()) elif AIStrUtils.isEqual(typeName, 'KmlServer'): svc.setUrl(self.__serverUrlPre + sDDraftEditor.getKmlRestUrl()) elif AIStrUtils.isEqual(typeName, 'FeatureServer'): svc.setUrl(self.__serverUrlPre + sDDraftEditor.getFeatureRestUrl()) elif AIStrUtils.isEqual(typeName, 'WFSServer'): svc.setUrl(self.__serverUrlPre + sDDraftEditor.getWMSRestUrl()) else: svc.setUrl(self.__serverUrlPre + sDDraftEditor.getWFSRestUrl()) else: raise except: raise return svc
def __init__(self, sdeOutFolder, sdeOutName, instance, username, password, \ databasePlatform = 'ORACLE', accountAuthentication='DATABASE_AUTH'): ''' 构造器 ''' if not AIUtils.isEmpty(sdeOutFolder) and not AIUtils.isEmpty(sdeOutName): self.__sdeOutFolder = sdeOutFolder self.__sdeOutName = sdeOutName if not self.__sdeOutName.endswith('.sde'): self.__sdeOutName += '.sde' self.__sdeOutFolder = self.__sdeOutFolder.replace('\\', '/') self.__sdeOutFullName = os.path.join(self.__sdeOutFolder, self.__sdeOutName).replace('\\', '/') self.__sdeUserName = username if not os.path.exists(self.__sdeOutFullName): arcpy.CreateDatabaseConnection_management(self.__sdeOutFolder, self.__sdeOutName, databasePlatform, instance, accountAuthentication, username, password)
def queryFds(self, fds): ''' 查询要素集 ''' qr = None if isinstance(fds, AIFds): name = fds.getName() if not AIUtils.isEmpty(name): name = name if ('.' in name) else name if AIUtils.isEmpty(self.__userName) else (self.__userName + '.') + name datasets = arcpy.ListDatasets(name, 'Feature') if len(datasets) > 0 and not AIUtils.isEmpty(datasets[0]): dataset = datasets[0] desc = arcpy.Describe(dataset) sr = desc.spatialReference qr = AIFds(AIUtils.unicode2utf8(desc.name), None if AIUtils.isEmpty(sr) else sr.factoryCode) else: raise Exception('dataset name cannot be empty!') else: raise Exception('input parameter type not correct!') return qr
def setFields(self, fields): nflds = [] if not AIUtils.isEmpty(fields) and AIUtils.isList(fields): for fld in fields: nfld = AIFld() for key in fld: func = getattr(nfld, 'set' + AIStrUtils.toUpperF(key)) if AIUtils.isFunc(func): apply(func, [fld[key]]) nflds.append(nfld) self.__fields = nflds
def queryFcList(self, fc): ''' 查询要素类列表 ''' qrs = [] if isinstance(fc, AIFc): name = fc.getName() ftype = fc.getFtype() ftype = 'All' if AIUtils.isEmpty(ftype) else ftype fds = fc.getFds() # 要素集名称 fdsName = None if not AIUtils.isEmpty(fds) and isinstance(fds, AIFds) and not AIUtils.isEmpty(fds.getName()): fdsName = fds.getName() fdsName = fdsName if ('.' in fdsName) else fdsName if AIUtils.isEmpty(self.__userName) else (self.__userName + '.') + fdsName fds = self.queryFds(fds) featureclasses = arcpy.ListFeatureClasses(None if AIUtils.isEmpty(name) else ('*'+ name + '*'), ftype, fdsName) for featureclass in featureclasses: desc = arcpy.Describe(featureclass) flds = [] for field in desc.fields: fld = AIFld(AIUtils.unicode2utf8(field.name), AIUtils.unicode2utf8(field.aliasName), \ AIUtils.unicode2utf8(field.type), field.scale, \ field.length, field.isNullable) flds.append(fld) qrs.append(AIFc(AIUtils.unicode2utf8(desc.name), AIUtils.unicode2utf8(desc.aliasName), \ AIUtils.unicode2utf8(desc.shapeType), None if AIUtils.isEmpty(desc.spatialReference) else desc.spatialReference.factoryCode, \ fds, flds)) else: raise Exception('input parameter type not correct!') return qrs
def connect(self): ''' 尝试连接数据库, 成功返回sde全路径 ''' connResult = None if not AIUtils.isEmpty(self.__sdeOutFullName): try: # sde_return = self.execute('select 1 from dual') # if not AIUtils.isEmpty(sde_return): # connResult = self.__sdeOutFullName connResult = self.__sdeOutFullName except: raise # except Exception as e: # print 'failure, connect error' # print unicode(e.message).encode("utf-8") return connResult
def toStr(self, obj): result = None if not AIUtils.isEmpty(obj): attrs = dir(obj) result = [] for attr in attrs: if attr.startswith('get'): prop = AIStrUtils.toLowerF(attr[3:]) func = getattr(obj, attr) value = apply(func, []) # 判断类型,不同的字符串转换方式 propValue = AIUtils.list2str(value) if AIUtils.isList(value) \ else AIUtils.dict2str(value) if AIUtils.isDict(value) \ else ('\'' + AIUtils.toStr(value) + '\'') if AIUtils.isStr(value) \ else AIUtils.toStr(value) result.append('\'' + prop + '\':' + propValue + '') result = '{' + ','.join(result) + '}' else: raise Exception('input parameter type not correct!') return result
def removeFds(self, fds): ''' 删除要素集 ''' flag = False if isinstance(fds, AIFds): name = fds.getName() if not AIUtils.isEmpty(name): if arcpy.Exists(name): try: arcpy.Delete_management(name) flag = True except: raise else: raise Exception('dataset not exist!') else: raise Exception('dataset name cannot be empty!') else: raise Exception('input parameter type not correct!') return flag
def removeFc(self, fc): ''' 删除要素类 ''' flag = False if isinstance(fc, AIFc): name = fc.getName() if not AIUtils.isEmpty(name): if arcpy.Exists(name): try: arcpy.Delete_management(name) flag = True except: raise else: raise Exception('featureclass not exist!') else: raise Exception('featureclass name cannot be empty!') else: raise Exception('input parameter type not correct!') return flag
def addFds(self, fds): ''' 保存要素集 ''' flag = False if isinstance(fds, AIFds): name = fds.getName() if not AIUtils.isEmpty(name): if not arcpy.Exists(name): wkid = fds.getWkid() sr = 4326 if not AIUtils.isInt(wkid) else arcpy.SpatialReference(wkid) try: arcpy.CreateFeatureDataset_management(self.__wksName, name, sr) flag = True except: raise else: raise Exception('dataset name cannot be duplicated!') else: raise Exception('dataset name cannot be empty!') else: raise Exception('input parameter type not correct!') return flag
# 查询要素类 param2 = sys.argv[2] param2 = param2.replace('null', '\'\'') param2 = param2.replace('true', 'True') param2 = param2.replace('false', 'False') fcDict = AIUtils.str2dict(param2) keys = fcDict.keys() fcName = None if 'name' not in keys else fcDict['name'] fcAlias = None if 'alias' not in keys else fcDict['alias'] fcFtype = None if 'ftype' not in keys else fcDict['ftype'] fcWkid = None if 'wkid' not in keys else fcDict['wkid'] fcFds = None if 'fds' not in keys else fcDict['fds'] fcFields = None if 'fields' not in keys else fcDict['fields'] try: if not AIUtils.isEmpty(fcName): fcName = fcName if ('.' in fcName) else fcName if AIUtils.isEmpty(sdeUsername) else (sdeUsername + '.') + fcName fcFtype = 'All' if AIUtils.isEmpty(fcFtype) else fcFtype # 要素集名称 fdsName = None if AIUtils.isDict(fcFds) and not AIUtils.isEmpty(fcFds['name']): fdsName = fcFds['name'] fdsName = fdsName if ('.' in fdsName) else fdsName if AIUtils.isEmpty(sdeUsername) else (sdeUsername + '.') + fdsName try: if not AIUtils.isEmpty(fdsName): fdsName = fdsName if ('.' in fdsName) else fdsName if AIUtils.isEmpty(sdeUsername) else (sdeUsername + '.') + fdsName datasets = arcpy.ListDatasets(fdsName, 'Feature') if len(datasets) > 0 and not AIUtils.isEmpty(datasets[0]): dataset = datasets[0] desc = arcpy.Describe(dataset) sr = desc.spatialReference
def isEqual(v1, v2): return not AIUtils.isEmpty(v1) and not AIUtils.isEmpty(v2) and v1 == v2
def getKmlRestUrl(self): ''' 获取局部Kml服务Rest地址 ''' return '/rest/services/' + '' if AIUtils.isEmpty(self.getServiceFolder()) else (self.getServiceFolder() + '/') + (self.getServiceName() + '/MapServer/KmlServer')
sdePassword = sdeInfos[3] try: sde = AISde( os.path.join(rootPath, "resources", "sde"), wksId, sdeServer + "/" + sdeInstance, sdeUsername, sdePassword, ) sde.connect() except Exception as e: logger.info(unicode(e.message).encode("utf-8")) logger.info("数据库服务器" + sdeServer + "上空间数据库" + sdeInstance + "实例连接失败") logger.info("数据库服务器" + sdeServer + "上空间数据库" + sdeInstance + "实例连接成功") wks = AIWks(sde.getSdeOutFullName(), sde.getSdeUserName()) logger.info("工作空间" + sde.getSdeOutFullName() + "初始化成功") # 查询要素集 param2 = sys.argv[2] param2 = param2.replace("null", "''") fds = AIFds() fds = fds.fromStr(param2) try: fdss = wks.queryFdsList(fds) if not AIUtils.isEmpty(fdss) and len(fdss) > 0: qr = AIUtils.list2json([AIUtils.str2dict(str(fds)) for fds in fdss]) except Exception as e: logger.info(unicode(e.message).encode("utf-8")) logger.info("要素集" + fds.getName() + "查询失败") print qr
sdeInfos = sdeInfo.split("/") sdeServer = sdeInfos[0] sdeInstance = sdeInfos[1] sdeUsername = sdeInfos[2] sdePassword = sdeInfos[3] # 默认文件已经存在 sdeOutFullName = os.path.join(rootPath, "resources", "sde", wksId + ".sde").replace("\\", "/") # 设置当前工作空间 arcpy.env.workspace = sdeOutFullName logger.info("工作空间" + sdeOutFullName + "初始化成功") # 新增要素集 param2 = sys.argv[2] param2 = param2.replace("null", "''") param2 = param2.replace("true", "True") param2 = param2.replace("false", "False") fdsDict = AIUtils.str2dict(param2) keys = fdsDict.keys() fdsName = None if "name" not in keys else fdsDict["name"] fdsWkid = 4326 if "wkid" not in keys else fdsDict["wkid"] try: if not AIUtils.isEmpty(fdsName): fdsWkid = 4326 if not AIUtils.isInt(fdsWkid) else fdsWkid arcpy.CreateFeatureDataset_management(sdeOutFullName, fdsName, arcpy.SpatialReference(fdsWkid)) flag = "true" except Exception as e: logger.info(unicode(e.message).encode("utf-8")) logger.info("要素集" + fdsName + "新增失败") print flag
def getFeatureRestUrl(self): ''' 获取局部要素服务Rest地址 ''' if self.getSvcExtension('FeatureServer'): return '/rest/services/' + '' if AIUtils.isEmpty(self.getServiceFolder()) else (self.getServiceFolder() + '/') + (self.getServiceName() + '/FeatureServer')
def setVisible(self, visible): self.__visible = True if AIUtils.isEmpty(visible) else visible
def setTransparency(self, transparency): self.__transparency = 0 if AIUtils.isEmpty(transparency) else transparency
def setMaxScale(self, maxScale): self.__maxScale = 0 if AIUtils.isEmpty(maxScale) else maxScale
def setMinScale(self, minScale): self.__minScale = 0 if AIUtils.isEmpty(minScale) else minScale
def setWkid(self, wkid): self.__wkid = 4326 if AIUtils.isEmpty(wkid) else wkid
def getWFSRestUrl(self): ''' 获取局部WFS服务Rest地址 ''' if self.getSvcExtension('WFSServer'): return '/rest/services/' + '' if AIUtils.isEmpty(self.getServiceFolder()) else (self.getServiceFolder() + '/') + (self.getServiceName() + '/MapServer/WFSServer')
def __init__(self, name = None, wkid = 4326): ''' 构造器 ''' self.__name = name self.__wkid = 4326 if AIUtils.isEmpty(wkid) else wkid