コード例 #1
0
ファイル: InsertGDB_all.py プロジェクト: gery1990/CMB-Py
def ConvertGDB(sourceFilePath, outputGDBPath, serverName, templatePath, x, y,
               sourceFileFields, fileEncode, convertSr):
    try:
        logger.info('insertGDB ** all convert GDB sourceFile:%s' %
                    sourceFilePath)
        gdbPath = os.path.join(outputGDBPath, serverName + '.gdb')
        if os.path.exists(gdbPath):
            shutil.rmtree(gdbPath)
        ac.createFileGDB(outputGDBPath, serverName)
        if os.path.exists(gdbPath) is not True:
            logger.warning('insertGDB ** not exists GDB:%s,create first!' %
                           gdbPath)
            return False
        # 临时GDB图层目录
        layerPath = os.path.join(gdbPath, serverName)
        ac.copyLayers(templatePath, layerPath)  # 复制模板图层

        # 插入记录到gdb
        ac.insertRow_Point(layerPath, sourceFilePath, x, y, sourceFileFields,
                           fileEncode, convertSr, logger)
        return True
    except Exception as e:
        logger.warning(e.message)
        logger.warning(traceback.format_exc())
        return False
コード例 #2
0
def ConvertGDB(sourceFilePath, outputGDBPath, serverGDBPath, serverName,
               templatePath, x, y, uniqueId, updateModel, sourceFileFields,
               fileEncode, convertSr):
    try:
        logger.info('insertUpdate ** update GDB soucefile:%s' % sourceFilePath)
        # 临时gdb目录
        gdbPath = os.path.join(outputGDBPath, serverName + ".gdb")
        gdbServerPath = os.path.join(serverGDBPath, serverName + ".gdb")
        # 图层目录
        layerPath = os.path.join(gdbPath, serverName)
        if os.path.exists(gdbPath):
            shutil.rmtree(gdbPath)
        # 将旧的GDB拷贝到临时gdb路径
        shutil.copytree(gdbServerPath, gdbPath)

        # 删除旧的要素,重新插入新的纪录
        if updateModel == "update":
            ac.deleteRow(layerPath, sourceFilePath, uniqueId,
                         sourceFileFields[uniqueId])
            # 插入记录到gdb
        ac.insertRow_Point(layerPath, sourceFilePath, x, y, sourceFileFields,
                           fileEncode, convertSr, logger)
        return True
    except Exception as e:
        logger.warning(e.message)
        logger.warning(traceback.format_exc())
        return False
コード例 #3
0
def mapProcess(targetFile, serverName, x, y, sourceFileFields, gdbWorkspace, fileEncode, convertSr):
    try:
        fileIndex = os.path.basename(targetFile).split('.')[0].split('_')[-1]
        fileName = "%s%s" % (serverName, fileIndex)
        logger.info('insertLarge_GDB ** convert file:%s' % (fileName))

        layerPath = os.path.join(gdbWorkspace, fileName)
        # 插入记录到gdb
        extent = ac.insertRow_Point(layerPath, targetFile, x, y, sourceFileFields,
                                    fileEncode, convertSr, logger)

        return [fileName, os.path.split(outputGDBPath)[1] + os.path.sep + fileName, extent, fileIndex]

    except:
        logger.warning(traceback.format_exc())
        raise
コード例 #4
0
def ConvertGDB(sourceFilePath, outputGDBPath, serverGDBPath, serverName, x, y,
               uniqueId, updateModel, sourceFileFields, fileEncode, convertSr):
    try:
        logger.info('Step 1: insertUpdate ** update GDB soucefile:%s' %
                    sourceFilePath)

        gdbPath = os.path.join(outputGDBPath, serverName + ".gdb")
        gdbServerPath = os.path.join(serverGDBPath, serverName + ".gdb")
        gdbPath_temp = os.path.join(outputGDBPath, "tempdata.gdb")

        tempSpatialJoinPath = os.path.join(gdbPath_temp, "spatialjoin")
        tempLayerPath = os.path.join(gdbPath_temp, "tempdata")
        tableViewPath = os.path.join(gdbPath, "tableview")

        # 拷贝服务使用的gdb数据
        if os.path.exists(gdbPath):
            shutil.rmtree(gdbPath)
        if os.path.exists(gdbPath_temp):
            shutil.rmtree(gdbPath_temp)
        # 将旧的GDB拷贝到临时gdb路径
        shutil.copytree(gdbServerPath, gdbPath)

        #更新模式,先删除gdb、tableview里旧的记录
        if updateModel == "update":
            logger.info('Step 2: update gdb...')
            tableTemp = serverName + "tabletemp"
            # 获取需要更新的记录具体图层位置并删除
            ac.makeTableView(tableViewPath, tableTemp)
            sqlStrs = buildSQLStr(sourceFilePath, tableViewPath, uniqueId)
            rowGroup = {}
            for sqlStr in sqlStrs:
                ac.selectLayerByAttribute(tableTemp, "NEW_SELECTION", sqlStr)
                searchCursor = ac.searchData(tableTemp, ("CID", "NAME"))
                for row in searchCursor:
                    if rowGroup.has_key(row[1]) is not True:
                        rowGroup[row[1]] = []
                    rowGroup[row[1]].append(row[0])
                del searchCursor
                ac.deleteRows(tableTemp)
            logger.info('Step 3: update gdb layer include : %s' %
                        '|'.join(rowGroup.keys()))
            for key in rowGroup.keys():
                deleteFeaturesBySelected(gdbPath, key, rowGroup[key])
            logger.info('Step 4: update gdb complate')

        # 构建临时存储gdb
        logger.info('Step 5: build temp gdb and insert row...')
        ac.createFileGDB(outputGDBPath, "tempdata.gdb")
        layerFields = ac.getLayerFields(os.path.join(gdbPath, "clientdata130"))
        fieldsMap = {}
        for layerField in layerFields:
            if layerField["name"] == "SHAPE@": continue
            fieldsMap[layerField["name"]] = layerField["type"]
        proNum = 3857
        if convertSr.upper() != "NONE" and convertSr != "":
            proNum = int(convertSr.split(",")[1])
        ac.createLayer(gdbPath_temp, "tempdata", proNum, "POINT", fieldsMap)
        ac.insertRow_Point(tempLayerPath, sourceFilePath, x, y,
                           sourceFileFields, fileEncode, convertSr, logger)

        logger.info('Step 6: temp gdb spatial join extent...')
        ac.spatialJoin(tempLayerPath, os.path.join(gdbPath, "extent"),
                       tempSpatialJoinPath, "JOIN_ONE_TO_ONE", "KEEP_COMMON",
                       None, "INTERSECT", "", "")

        # 插入记录到对应的图层
        logger.info('Step 7: temp gdb append to gdb...')
        fields = []
        for layerField in layerFields:
            if layerField["name"] == "SHAPE@": continue
            fields.append(layerField["name"])

        fields.append("SHAPE@X")
        x = (len(fields) - 1)
        fields.append("SHAPE@Y")
        y = (len(fields) - 1)
        fields.append("CID")
        fields.append("name")
        tempCursor = ac.searchData(tempSpatialJoinPath, fields)
        insertTableCursor = ac.getInsertCursor(tableViewPath, ["CID", "NAME"])
        rowGroup = {}
        for row in tempCursor:
            id = row[-2]
            layerName = row[-1]
            strValue = ""
            for fieldValue in row:
                if type(fieldValue) == int or type(fieldValue) == float:
                    fieldValue = str(fieldValue)
                strValue += (fieldValue.encode('utf-8') + FIELD_DEL)
            strValue += FIELD_DEL + "\n"
            if rowGroup.has_key(layerName) is not True:
                rowGroup[layerName] = []
            rowGroup[layerName].append(strValue)
            insertTableCursor.insertRow([id, layerName])
        del tempCursor
        del insertTableCursor

        for layerName in rowGroup.keys():
            tempFilePath = os.path.join(outputGDBPath, layerName)
            tempFileObj = file(tempFilePath, 'wb')
            for lineStr in rowGroup[layerName]:
                tempFileObj.write(lineStr)
            tempFileObj.close()
            ac.insertRow_Point(os.path.join(gdbPath, layerName), tempFilePath,
                               x, y, fields, 'utf-8', "None", logger)
            os.remove(tempFilePath)

        shutil.rmtree(gdbPath_temp)

        logger.info(
            'Step 8: insertUpdate ** update GDB soucefile:%s  complate!' %
            sourceFilePath)
        return True
    except Exception as e:
        logger.warning(e.message)
        logger.warning(traceback.format_exc())
        return False
コード例 #5
0
def ConvertGDB(sourceFilePath, outputGDBPath, serverGDBPath, serverName, x, y, uniqueId,
               updateModel, sourceFileFields, fileEncode, convertSr):
    try:
        logger.info('insertUpdate ** update GDB soucefile:%s' % sourceFilePath)
        # 临时gdb目录
        gdbPath = os.path.join(outputGDBPath, serverName + ".gdb")
        gdbServerPath = os.path.join(serverGDBPath, serverName + ".gdb")
        # 拷贝服务使用的gdb数据
        if os.path.exists(gdbPath):
            shutil.rmtree(gdbPath)
        # 将旧的GDB拷贝到临时gdb路径
        shutil.copytree(gdbServerPath, gdbPath)

        if updateModel == "update":
            ac.setWorkSpace(gdbPath)
            for sn in ac.getFeaturesList():
                if sn == "extent":
                    continue
                layerPath = os.path.join(gdbPath, sn)
                # 删除旧的要素,重新插入新的纪录
                ac.deleteRow(layerPath, sourceFilePath, uniqueId, sourceFileFields[uniqueId])

        # 字典图层路径,循环图层要素,将新增的数据按范围插入到对应的图层
        extentLayerPath = os.path.join(gdbPath, "extent")
        extentCursor = ac.searchData(extentLayerPath, ["name", "SHAPE@"])
        try:
            inSr, outSr = None, None
            if convertSr.upper() != "NONE":
                v = convertSr.split(',')
                inSr = ac.getSpatialReference(int(v[0]))
                outSr = ac.getSpatialReference(int(v[1]))

            for extentRow in extentCursor:
                polyGeo = extentRow[1]
                name = extentRow[0]
                sourceObj = file(sourceFilePath, 'rb')
                fileObj = file(os.path.join(outputGDBPath, name), 'wb')
                rowCount = 0
                logger.info('analysis %s!' % (name))
                try:
                    while True:
                        lineStr = sourceObj.next()
                        values = lineStr.split(FIELD_DEL)
                        if str(values[x]) != '' and str(values[y]) != "" and str(values[x]) != "0" and str(
                                values[y]) != "0" and is_num_by_except(values[x]) and is_num_by_except(values[y]):
                            geo = ac.createPoint(float(values[x]), float(values[y]))

                            if convertSr.upper() != 'NONE':
                                p = ac.createPointGeometry(geo, inSr)
                                geo = p.projectAs(outSr)
                            # 输出到文件
                            if polyGeo.contains(geo):
                                rowCount += 1
                                fileObj.write(lineStr)
                except StopIteration:
                    fileObj.close()
                    sourceObj.close()
                    pass
                if rowCount>0:
                    logger.info('start insert %s' % (name))
                    ac.insertRow_Point(os.path.join(gdbPath, name), os.path.join(outputGDBPath, name), x, y,
                                       sourceFileFields, fileEncode, convertSr, logger)
                    logger.info('insert %d row to "%s" layer!' % (rowCount, name))
                os.remove(os.path.join(outputGDBPath, name))
        except:
            pass
        return True
    except Exception as e:
        logger.warning(e.message)
        logger.warning(traceback.format_exc())
        return False
コード例 #6
0
def ConvertGDB(sourceFilePath, outputGDBPath, serverGDBPath, serverName, x, y, uniqueId,
               updateModel, sourceFileFields, fileEncode, convertSr):
    try:
        logger.info('insertUpdate ** update GDB soucefile:%s' % sourceFilePath)

        gdbPath = os.path.join(outputGDBPath, serverName + ".gdb")
        gdbPath_temp = os.path.join(outputGDBPath, "tempdata.gdb")
        gdbServerPath = os.path.join(serverGDBPath, serverName + ".gdb")

        tempLayerPath = os.path.join(gdbPath_temp, "tempdata")
        tableViewPath = os.path.join(gdbPath, "tableview")

        # 拷贝服务使用的gdb数据
        if os.path.exists(gdbPath):
            shutil.rmtree(gdbPath)
        if os.path.exists(gdbPath_temp):
            shutil.rmtree(gdbPath_temp)
        # 将旧的GDB拷贝到临时gdb路径
        shutil.copytree(gdbServerPath, gdbPath)

        # 构建临时存储gdb
        logger.info('build tempGDB...')
        ac.createFileGDB(outputGDBPath, "tempdata.gdb")
        layerFields = ac.getLayerFields(os.path.join(gdbPath, "clientdata130"))
        fieldsMap = {}
        for layerField in layerFields:
            if layerField["name"] == "SHAPE@": continue
            fieldsMap[layerField["name"]] = layerField["type"]
        proNum = 3857
        if convertSr.upper() != "NONE" and convertSr != "":
            proNum = int(convertSr.split(",")[1])
        ac.createLayer(gdbPath_temp, "tempdata", proNum, "POINT", fieldsMap)
        ac.insertRow_Point(tempLayerPath, sourceFilePath, x, y, sourceFileFields, fileEncode, convertSr, logger)
        ac.splitLayer(tempLayerPath, os.path.join(gdbPath, "extent"), "name", gdbPath_temp)
        ac.deleteLayer(tempLayerPath)

        if updateModel == "update":
            logger.info('update layer...')
            tableTemp = serverName + "tabletemp"
            # 获取需要更新的记录具体图层位置并删除
            ac.makeTableView(tableViewPath, tableTemp)
            sqlStrs = buildSQLStr(sourceFilePath, tableViewPath, uniqueId)
            rowGroup = {}
            for sqlStr in sqlStrs:
                ac.selectLayerByAttribute(tableTemp, "NEW_SELECTION", sqlStr)
                searchCursor = ac.searchData(tableTemp, ("CID", "NAME"))
                for row in searchCursor:
                    if rowGroup.has_key(row[1]) is not True:
                        rowGroup[row[1]] = []
                    rowGroup[row[1]].append(row[0])
                del searchCursor
                ac.deleteRows(tableTemp)

            logger.info('update layer include : %s' % '|'.join(rowGroup.keys()))
            for key in rowGroup.keys():
                deleteFeaturesBySelected(gdbPath, key, rowGroup[key])

        # 插入记录到对应的图层
        logger.info('insert tempGDB to gdb...')
        insertTableCursor = ac.getInsertCursor(tableViewPath, ["CID", "NAME"])
        ac.setWorkSpace(gdbPath_temp)
        for sn in ac.getFeaturesList():
            ac.appendLayers(os.path.join(gdbPath_temp, sn), os.path.join(gdbPath, sn))  # 与正式图层合并,完成新增插入

            searchCursor = ac.searchData(os.path.join(gdbPath_temp, sn), ["CID"])
            for row in searchCursor:
                insertTableCursor.insertRow([row[0], sn])
            del searchCursor
        del insertTableCursor

        shutil.rmtree(gdbPath_temp)

        logger.info('insertUpdate ** update GDB soucefile:%s  complate!' % sourceFilePath)

        return True
    except Exception as e:
        logger.warning(e.message)
        logger.warning(traceback.format_exc())
        return False