आर्कपी का उपयोग करके जियोडैटबेस को फाइल करने के लिए आर्कएसडीई जियोडैटेबेस की नकल करना?


9

मैं एक एसडीई डेटाबेस की सटीक प्रतिलिपि (डोमेन, फीचर डेटासेट, फीचर क्लासेस, इत्यादि) को एक फाइल जियोडेटाबेस बनाना चाहूंगा।

मैंने कई संभावनाओं की कोशिश की है, जिनमें शामिल हैं:

  1. कॉपी (डेटा प्रबंधन) प्रक्रिया का उपयोग करना
  2. एक नया GDB बनाना और SDE से प्रत्येक फीचर डेटासेट को मैन्युअल रूप से कॉपी करना
  3. एसडीई से एक xml कार्यक्षेत्र दस्तावेज़ निर्यात करना और इसे GDB में आयात करना

Copy_managementप्रक्रिया की तरह यह एक GDB के लिए एक उप.मं.अ. कॉपी करने के लिए काम करेंगे के बाद से इनपुट और आउटपुट डेटा प्रकार से मेल खाना चाहिए प्रतीत नहीं होता।

प्रत्येक सुविधा डेटासेट को एक नए GDB में आयात करने की प्रक्रिया संभवतः Copy_management के साथ-साथ प्रत्येक सुविधा डेटासेट के माध्यम से पुन: उपयोग करके स्वचालित की जा सकती है, हालांकि ऐसा लगता है कि यह एक प्रक्रिया के साथ एक त्रुटि होने पर अपूर्ण प्रतिलिपि की समस्या पैदा कर सकता है।

Xml कार्यस्थानों का निर्यात और आयात करना काम करने लगता है, हालाँकि यह प्रक्रिया अविश्वसनीय रूप से बड़ी फ़ाइलों का निर्माण करती है जब प्रक्रिया का उपयोग बड़े जियोडेट डेटाबेस पर किया जाता है।

क्या एक एसडीईई की सामग्री और स्कीमा की नकल करने के लिए एक सीधे तरीके से एक GDB से अधिक का उल्लेख किया जा सकता है, जिस तरह से स्वचालित किया जा सकता है?

यदि नहीं, तो क्या कोई कारण हैं कि इस प्रक्रिया में उपरोक्त संभावनाओं का उपयोग नहीं किया जाना चाहिए?


1
संबंधित: gis.stackexchange.com/q/63368/753
blah238

जवाबों:


5

जिस तरह से आप डेटा (डोमेन, डेटासेट, रिलेशनशिप आदि) की एक सच्ची कॉपी प्राप्त कर सकते हैं, वह है कैटलॉग के माध्यम से मैनुअल कॉपी और पेस्ट विधि का उपयोग करना। ईएसआरआई ने अभी तक हमें एक भी ऑपरेशन के साथ किसी अन्य तरीके से इस डेटा को स्थानांतरित करने की क्षमता नहीं दी है जिसे आसानी से स्क्रिप्ट किया जा सकता है।

मेरे पास एक रात की प्रक्रिया है जो ऑपरेशन की निरंतरता के लिए जियोडेट डेटाबेस दाखिल करने के लिए मेरे दो प्राथमिक एसडीई डेटाबेस की प्रतिलिपि बनाती है। ऐसा इसलिए है कि आपातकाल की स्थिति में मेरे कर्मचारियों के पास काम करने के लिए कुछ डेटा है जब तक कि मेरी आईटी दुकान बैकअप से मेरे एसडीई का पुनर्निर्माण नहीं कर सकती। बहुत परीक्षण और त्रुटि के बाद मैंने फैसला किया है कि हम हर रात अपने डेटा को स्थानांतरित करने के लिए FeatureClassToFeatureClass_conversion और TableToTable_conversion का उपयोग करने की सीमाओं के साथ रह सकते हैं ।

हां, हम जियोडेटाबेस की कुछ कार्यक्षमता खो देते हैं, लेकिन यह अब रात में अप्राप्य चलेगा और जैसे ही मैं इसे प्राप्त करने के लिए तैयार हूं। मेरे मामले में एकमात्र कार्यक्षमता जो हम वास्तव में याद कर रहे हैं (एक आपातकालीन मोड के तहत काम कर रहे हैं) यह है कि मेरे संबंध वर्ग टूट गए हैं क्योंकि रूपांतरण दो टेबल को जोड़ने वाले ऑब्जेक्ट को रीसेट करता है।

जब तक ईएसआरआई हमें और विकल्प नहीं देता, तब तक आपको यह देखना होगा कि आप इस समय क्या बलिदान करना चाहते हैं; समय और प्रयास या कार्यक्षमता?


एक xml worskspace डॉक्टर काम नहीं करेगा?
20

8

मुझे पता है कि यह पोस्ट थोड़ी पुरानी है, लेकिन मैं अपना जवाब साझा करूंगा क्योंकि मुझे उसी मुद्दे का सामना करना पड़ा था। निम्नलिखित स्क्रिप्ट SHOULD सभी तालिकाओं, फ़ीचर कक्षाओं और रिश्तों को एक डेटासेट में नहीं कॉपी करता है और यह भी डेटासेट, टोपोलॉजी आदि सहित सभी डेटासेट को कॉपी करेगा। यह किसी भी त्रुटी को छोड़ देगा, जो प्रतिलिपि adn को जारी रखेगा। यह एक लॉग फ़ाइल का उत्पादन करेगा जिसमें स्रोत DB आइटम गणना और गंतव्य आइटम गणना जैसे डेटा शामिल हैं ताकि आप प्रतिलिपि की तुलना कर सकें और यह त्रुटियों का सामना करेगा साथ ही साथ यह लॉग करेगा।

import arcpy, os, shutil, time
import logging as log
from datetime import datetime

def formatTime(x):
    minutes, seconds_rem = divmod(x, 60)
    if minutes >= 60:
        hours, minutes_rem = divmod(minutes, 60)
        return "%02d:%02d:%02d" % (hours, minutes_rem, seconds_rem)
    else:
        minutes, seconds_rem = divmod(x, 60)
        return "00:%02d:%02d" % (minutes, seconds_rem)

def getDatabaseItemCount(workspace):
    arcpy.env.workspace = workspace
    feature_classes = []
    for dirpath, dirnames, filenames in arcpy.da.Walk(workspace,datatype="Any",type="Any"):
        for filename in filenames:
            feature_classes.append(os.path.join(dirpath, filename))
    return feature_classes, len(feature_classes)

def replicateDatabase(dbConnection, targetGDB):
    startTime = time.time()

    featSDE,cntSDE = getDatabaseItemCount(dbConnection)
    featGDB,cntGDB = getDatabaseItemCount(targetGDB)

    now = datetime.now()
    logName = now.strftime("SDE_REPLICATE_SCRIPT_%Y-%m-%d_%H-%M-%S.log")
    log.basicConfig(datefmt='%m/%d/%Y %I:%M:%S %p', format='%(asctime)s %(message)s',\
    filename=logName,level=log.INFO)

    print "Old Target Geodatabase: %s -- Feature Count: %s" %(targetGDB, cntGDB)
    log.info("Old Target Geodatabase: %s -- Feature Count: %s" %(targetGDB, cntGDB))
    print "Geodatabase being copied: %s -- Feature Count: %s" %(dbConnection, cntSDE)
    log.info("Geodatabase being copied: %s -- Feature Count: %s" %(dbConnection, cntSDE))

    arcpy.env.workspace = dbConnection

    #deletes old targetGDB
    try:
        shutil.rmtree(targetGDB)
        print "Deleted Old %s" %(os.path.split(targetGDB)[-1])
        log.info("Deleted Old %s" %(os.path.split(targetGDB)[-1]))
    except Exception as e:
        print e
        log.info(e)

    #creates a new targetGDB
    GDB_Path, GDB_Name = os.path.split(targetGDB)
    print "Now Creating New %s" %(GDB_Name)
    log.info("Now Creating New %s" %(GDB_Name))
    arcpy.CreateFileGDB_management(GDB_Path, GDB_Name)

    datasetList = [arcpy.Describe(a).name for a in arcpy.ListDatasets()]
    featureClasses = [arcpy.Describe(a).name for a in arcpy.ListFeatureClasses()]
    tables = [arcpy.Describe(a).name for a in arcpy.ListTables()]

    #Compiles a list of the previous three lists to iterate over
    allDbData = datasetList + featureClasses + tables

    for sourcePath in allDbData:
        targetName = sourcePath.split('.')[-1]
        targetPath = os.path.join(targetGDB, targetName)
        if arcpy.Exists(targetPath)==False:
            try:
                print "Atempting to Copy %s to %s" %(targetName, targetPath)
                log.info("Atempting to Copy %s to %s" %(targetName, targetPath))
                arcpy.Copy_management(sourcePath, targetPath)
                print "Finished copying %s to %s" %(targetName, targetPath)
                log.info("Finished copying %s to %s" %(targetName, targetPath))
            except Exception as e:
                print "Unable to copy %s to %s" %(targetName, targetPath)
                print e
                log.info("Unable to copy %s to %s" %(targetName, targetPath))
                log.info(e)
        else:
            print "%s already exists....skipping....." %(targetName)
            log.info("%s already exists....skipping....." %(targetName))
    featGDB,cntGDB = getDatabaseItemCount(targetGDB)
    print "Completed replication of %s -- Feature Count: %s" %(dbConnection, cntGDB)
    log.info("Completed replication of %s -- Feature Count: %s" %(dbConnection, cntGDB))
    totalTime = (time.time() - startTime)
    totalTime = formatTime(totalTime)
    log.info("Script Run Time: %s" %(totalTime))

if __name__== "__main__":
    databaseConnection = r"YOUR_SDE_CONNECTION"
    targetGDB = "DESTINATION_PATH\\SDE_Replicated.gdb"
    replicateDatabase(databaseConnection, targetGDB)   

मुझे वास्तव में इसके साथ शुभकामनाएं मिलीं। मैं एक फाइल जियोडेटाबेस के लिए एक एसडीई डेटाबेस की नकल कर रहा था। मैंने इस पटकथा पर बहुत अधिक परीक्षण नहीं किया है, हालांकि इसने मेरी सभी जरूरतों को पूरा किया है। मैंने आर्कजीआईएस 10.3 का उपयोग करके इसका परीक्षण किया। इसके अलावा, एक बात ध्यान दें, मैं किसी ऐसे व्यक्ति के साथ बातचीत कर रहा था जिसने इस स्क्रिप्ट का उपयोग किया है और वे अनुचित अनुमतियों और खाली तालिकाओं के कारण कुछ डेटासेटों की नकल करने में त्रुटि के साथ भाग गए।

Lemur - ऑब्जेक्ट आईडी के बजाय एक वैश्विक आईडी के आधार पर अपने रिश्ते क्यों नहीं बनाएं? कि आप अपने रिश्तों को बचाए रखेंगे। यदि आपने वैश्विक आईडी नहीं बनाई है तो मैं इसकी अत्यधिक अनुशंसा करूंगा।

-अपडेट करें

मैंने खराब डेटाबेस कनेक्शन पथ और बेहतर लॉगिंग और त्रुटि से निपटने के लिए कोड में थोड़ा और तर्क जोड़ा:

import time, os, datetime, sys, logging, logging.handlers, shutil
import arcpy

########################## user defined functions ##############################

def getDatabaseItemCount(workspace):
    log = logging.getLogger("script_log")
    """returns the item count in provided database"""
    arcpy.env.workspace = workspace
    feature_classes = []
    log.info("Compiling a list of items in {0} and getting count.".format(workspace))
    for dirpath, dirnames, filenames in arcpy.da.Walk(workspace,datatype="Any",type="Any"):
        for filename in filenames:
            feature_classes.append(os.path.join(dirpath, filename))
    log.info("There are a total of {0} items in the database".format(len(feature_classes)))
    return feature_classes, len(feature_classes)

def replicateDatabase(dbConnection, targetGDB):
    log = logging.getLogger("script_log")
    startTime = time.time()

    if arcpy.Exists(dbConnection):
        featSDE,cntSDE = getDatabaseItemCount(dbConnection)
        log.info("Geodatabase being copied: %s -- Feature Count: %s" %(dbConnection, cntSDE))
        if arcpy.Exists(targetGDB):
            featGDB,cntGDB = getDatabaseItemCount(targetGDB)
            log.info("Old Target Geodatabase: %s -- Feature Count: %s" %(targetGDB, cntGDB))
            try:
                shutil.rmtree(targetGDB)
                log.info("Deleted Old %s" %(os.path.split(targetGDB)[-1]))
            except Exception as e:
                log.info(e)

        GDB_Path, GDB_Name = os.path.split(targetGDB)
        log.info("Now Creating New %s" %(GDB_Name))
        arcpy.CreateFileGDB_management(GDB_Path, GDB_Name)

        arcpy.env.workspace = dbConnection

        try:
            datasetList = [arcpy.Describe(a).name for a in arcpy.ListDatasets()]
        except Exception, e:
            datasetList = []
            log.info(e)
        try:
            featureClasses = [arcpy.Describe(a).name for a in arcpy.ListFeatureClasses()]
        except Exception, e:
            featureClasses = []
            log.info(e)
        try:
            tables = [arcpy.Describe(a).name for a in arcpy.ListTables()]
        except Exception, e:
            tables = []
            log.info(e)

        #Compiles a list of the previous three lists to iterate over
        allDbData = datasetList + featureClasses + tables

        for sourcePath in allDbData:
            targetName = sourcePath.split('.')[-1]
            targetPath = os.path.join(targetGDB, targetName)
            if not arcpy.Exists(targetPath):
                try:
                    log.info("Atempting to Copy %s to %s" %(targetName, targetPath))
                    arcpy.Copy_management(sourcePath, targetPath)
                    log.info("Finished copying %s to %s" %(targetName, targetPath))
                except Exception as e:
                    log.info("Unable to copy %s to %s" %(targetName, targetPath))
                    log.info(e)
            else:
                log.info("%s already exists....skipping....." %(targetName))

        featGDB,cntGDB = getDatabaseItemCount(targetGDB)
        log.info("Completed replication of %s -- Feature Count: %s" %(dbConnection, cntGDB))

    else:
        log.info("{0} does not exist or is not supported! \
        Please check the database path and try again.".format(dbConnection))

#####################################################################################

def formatTime(x):
    minutes, seconds_rem = divmod(x, 60)
    if minutes >= 60:
        hours, minutes_rem = divmod(minutes, 60)
        return "%02d:%02d:%02d" % (hours, minutes_rem, seconds_rem)
    else:
        minutes, seconds_rem = divmod(x, 60)
        return "00:%02d:%02d" % (minutes, seconds_rem)

if __name__ == "__main__":
    startTime = time.time()
    now = datetime.datetime.now()

    ############################### user variables #################################
    '''change these variables to the location of the database being copied, the target 
    database location and where you want the log to be stored'''

    logPath = ""
    databaseConnection = "path_to_sde_or_gdb_database"
    targetGDB = "apth_to_replicated_gdb\\Replicated.gdb"

    ############################### logging items ###################################
    # Make a global logging object.
    logName = os.path.join(logPath,(now.strftime("%Y-%m-%d_%H-%M.log")))

    log = logging.getLogger("script_log")
    log.setLevel(logging.INFO)

    h1 = logging.FileHandler(logName)
    h2 = logging.StreamHandler()

    f = logging.Formatter("[%(levelname)s] [%(asctime)s] [%(lineno)d] - %(message)s",'%m/%d/%Y %I:%M:%S %p')

    h1.setFormatter(f)
    h2.setFormatter(f)

    h1.setLevel(logging.INFO)
    h2.setLevel(logging.INFO)

    log.addHandler(h1)
    log.addHandler(h2)

    log.info('Script: {0}'.format(os.path.basename(sys.argv[0])))

    try:
        ########################## function calls ######################################

        replicateDatabase(databaseConnection, targetGDB)

        ################################################################################
    except Exception, e:
        log.exception(e)

    totalTime = formatTime((time.time() - startTime))
    log.info('--------------------------------------------------')
    log.info("Script Completed After: {0}".format(totalTime))
    log.info('--------------------------------------------------')

पीटर, मैंने आपके द्वारा प्रदान की गई स्क्रिप्ट का उपयोग किया और मैंने नीचे 2 वेरिएबल को अपडेट किया। मुझे एक त्रुटि मिल रही है Traceback (सबसे हालिया कॉल अंतिम): फ़ाइल "ServerPath \\ CopySDEtoGDB.py", लाइन 90, में <मॉड्यूल> replicateDatabase (databaseConnection, targetGDB) फ़ाइल "Serverath \\ CopySDEtoGDB.py", पंक्ति 55, में। replicateDatabaseStreetList = [arcpy.Describe (a) .name for a arcpy.ListDatasets ()] TypeError: 'noneType' ऑब्जेक्ट iterable नहीं है, इसका कोई मतलब नहीं है?
कोर्टनी

कोर्टनी - ऐसा लगता है कि आपके डेटाबेस कनेक्शन चर के मार्ग में कोई टाइपो या थोड़ी सी भी त्रुटि है। यह एक त्रुटि फेंक रहा है क्योंकि यह उस सूची पर पुनरावृति करने की कोशिश कर रहा है जो लाइन 55 पर खाली है। मैं "डेटाबेसकनेक्ट" चर में गलत पथ का उपयोग करके आपके द्वारा प्राप्त की गई त्रुटि को फिर से बनाने में सक्षम था। चर में आपके द्वारा उपयोग किया गया वास्तविक पथ क्या है?
PMK

अगर मैं यह रात को करना चाहता था, यह मौजूदा सुविधाओं को अधिलेखित नहीं करेगा? मैं न केवल एक नया FGD बनाना चाहता हूं, बल्कि मैं मौजूदा लक्ष्य को अधिलेखित करना चाहता हूं।
NULL.Dude

पीटर यदि लक्ष्य GDB स्क्रिप्ट मौजूद है तो विफल रहता है
NULL.Dude

2

मैंने पीटर के ऊपर की तरह एक स्क्रिप्ट का उपयोग किया है और अच्छी किस्मत थी, हालांकि उनकी स्थिति बेहतर है। एक बात जो किसी को परेशान कर सकती है, वह यह है कि यदि आप 64 बिट पायथन जियोप्रोसेसिंग का उपयोग कर रहे हैं और आपके पास ArcFM है, जो ESRI के शीर्ष पर लोड है, तो यह उन सभी विशेषताओं पर विफल हो जाएगा, जो ERROR 000260 के साथ ArcFM या डिजाइनर का उपयोग करने के लिए निर्धारित की गई हैं। यह ऐसा इसलिए है क्योंकि आपको 32 बिट पायथन का उपयोग करना होगा या आर्कएफएम सामान ठीक से लाइसेंस नहीं देगा।

32 बिट आर्कपी का उपयोग करने के अधिक विस्तृत विवरण के लिए, एक्सचेंज में इस थ्रेड पर पहले दो टिप्पणियां देखें

https://infrastructurecommunity.schneider-electric.com/docs/DOC-2563


उन दो टिप्पणी इस सवाल का जवाब देते हैं तो उनकी सामग्री या तो उद्धृत किया जाना चाहिए या यहां संक्षेपित और न सिर्फ से जुड़ा हुआ - देख meta.stackexchange.com/questions/225370/... आप पहले से ही एक सारांश शायद सिर्फ बदलने को प्रदान किए हैं "चेक एक्सचेंज में "इस धागे पर पहले दो टिप्पणियाँ" के लिए "अधिक विस्तृत विवरण के लिए एक्सचेंज में इस धागे पर पहले दो टिप्पणियां देखें"।
PolyGeo

0

यदि आपके पास व्यवस्थापक विशेषाधिकार हैं, तो आप जियो-डेटाबेस वाइस वर्सा को फाइल करने और निर्यात करने के लिए साधारण कॉपी और पेस्ट कमांड का उपयोग कर सकते हैं और अधिक विवरण के लिए यहां देख सकते हैं ।


धन्यवाद गणेशनरिम - मैं पायथन का उपयोग करके प्रक्रिया को स्वचालित करना चाहूंगा, इसलिए आर्ककॉस्टिक्स में कोई भी मैनुअल कॉपी / पेस्ट प्रक्रिया मेरी आवश्यकताओं के अनुरूप नहीं होगी। मुझे इस विधि के साथ सीमित सफलता भी मिली है, जैसा कि ऐसा लगता है (ArcMap 10.1 में) एक एसडीई की प्रतिलिपि बनाने से बस एक ही डेटाबेस के लिए एक और लिंक बन जाता है (जबकि यदि यह तकनीक एक फ़ाइल या व्यक्तिगत जियोडेटाबेस पर उपयोग की जाती है, तो एक प्रतिलिपि बनाई जाएगी)
Krausers
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.