আরকিপি ব্যবহার করে জিওডাটাবেস ফাইল করতে আরএসএসডি জিওডাটাবেস অনুলিপি করছেন?


9

আমি কোনও ফাইল জিওডাটাবেজে একটি এসডিই ডাটাবেসের একটি সঠিক কপি (ডোমেন, বৈশিষ্ট্য ডেটাসেট, বৈশিষ্ট্য শ্রেণি, ইত্যাদি) তৈরি করতে চাই।

আমি বেশ কয়েকটি সম্ভাবনার চেষ্টা করেছি, যার মধ্যে রয়েছে:

  1. অনুলিপি (ডেটা ম্যানেজমেন্ট) প্রক্রিয়া ব্যবহার করে
  2. একটি নতুন জিডিবি তৈরি করছে এবং এসডিই থেকে প্রতিটি বৈশিষ্ট্য ডেটাসেট ম্যানুয়ালি অনুলিপি করছে
  3. এসডিই থেকে একটি এক্সএমএল ওয়ার্কস্পেস ডকুমেন্ট রফতানি করা এবং এটি জিডিবিতে আমদানি করা

Copy_managementপ্রক্রিয়া মত, একটি, GDB একটি SDE অনুলিপি করার জন্য কাজ করবে যেহেতু ইনপুট এবং আউটপুট ধরনের তথ্য মিলতে হবে মনে হচ্ছে না।

প্রতিটি ফিচার ডেটাসেটকে একটি নতুন জিডিবিতে আমদানির প্রক্রিয়া সম্ভবত কপিরাইট-ম্যানেজমেন্ট ব্যবহার করে প্রতিটি বৈশিষ্ট্য ডেটাসেটের মাধ্যমে পুনরাবৃত্তি করে স্বয়ংক্রিয় করা যেতে পারে, যদিও মনে হয় এটির কোনও প্রক্রিয়াতে ত্রুটি থাকলে এটি একটি অসম্পূর্ণ অনুলিপির সমস্যার কারণ হতে পারে।

এক্সএমএল ওয়ার্কস্পেসগুলি রফতানি ও আমদানি করা কাজ করে বলে মনে হচ্ছে, যদিও প্রক্রিয়াটি বড় জিওডাটাবেসগুলিতে ব্যবহৃত হয় তখন এই প্রক্রিয়াটি অবিশ্বাস্যভাবে বড় ফাইলগুলি তৈরি করে।

একটি জিডিবিতে কোনও এসডিইর বিষয়বস্তু এবং স্কিমা অনুলিপি করার উপায়ের চেয়ে আরও সোজা উপায় কি স্বয়ংক্রিয়ভাবে চালিত হতে পারে?

যদি তা না হয় তবে উপরোক্ত সম্ভাবনাগুলি এই প্রক্রিয়াটিতে ব্যবহার করা উচিত নয় এমন কোনও কারণ আছে কি?


1
সম্পর্কিত: gis.stackexchange.com/q/63368/753
blah238

উত্তর:


5

আপনি কেবলমাত্র ডেটার সত্যিকারের অনুলিপি পেতে পারেন (ডোমেনস, ডেটাসেটস, সম্পর্কগুলি ইত্যাদি) ক্যাটালগের ভিতরে ম্যানুয়াল অনুলিপি এবং পেস্ট পদ্ধতি ব্যবহার করা। সহজেই স্ক্রিপ্ট করা যায় এমন একক ক্রিয়াকলাপের সাথে ESRI এখনও আমাদের অন্য কোনও উপায়ে এই ডেটা স্থানান্তর করার ক্ষমতা দেয়নি।

আমার একটি রাত্রে প্রক্রিয়া রয়েছে যা ক্রিয়াকলাপের ধারাবাহিকতার জন্য জিওডাটাবেস ফাইল করার জন্য আমার দুটি প্রাথমিক এসডিই ডেটাবেসগুলি অনুলিপি করে। এটি এমন যে কোনও জরুরি পরিস্থিতিতে আমার আইটি শপটি ব্যাকআপ থেকে আমার এসডিই পুনর্নির্মাণ না করা পর্যন্ত আমার স্টাফদের সাথে কাজ করার জন্য কিছু ডেটা রয়েছে। অনেক পরীক্ষার এবং ত্রুটির পরেও আমি সিদ্ধান্ত নিয়েছি যে আমরা প্রতি রাতে আমাদের ডেটা স্থানান্তর করতে ফিচারক্লাসটোফিউচার ক্লাস_কভার্শন এবং টেবিলটোটেবল_ কনভার্সন ব্যবহারের সীমাবদ্ধতার সাথে বাঁচতে পারি ।

হ্যাঁ, আমরা জিওডাটাবেসের কিছু কার্যকারিতা হারিয়ে ফেলেছি তবে এটি এখন রাতে অপ্রত্যাশিতভাবে চালানো হবে এবং এটি পাওয়ার সাথে সাথেই যেতে প্রস্তুত। আমার ক্ষেত্রে একমাত্র কার্যকারিতা যা আমরা সত্যিই অনুপস্থিত (জরুরী মোডের অধীনে অপারেটিং ধরে নিলাম) হ'ল আমার সম্পর্কের ক্লাসগুলি ভেঙে গেছে কারণ রূপান্তর দুটি টেবিলের সাথে সংযুক্ত বস্তুগুলিকে পুনরায় সেট করে।

যতক্ষণ না ইএসআরআই আমাদের আরও বিকল্প দেয় আপনি ততক্ষণে আপনাকে কী ত্যাগ করতে ইচ্ছুক তা দেখতে হবে; সময় এবং প্রচেষ্টা বা কার্যকারিতা?


একটি এক্সএমএল ব্যাডস্পেস ডক কাজ করবে না?
জিলার

8

আমি জানি এই পোস্টটি কিছুটা পুরাতন তবে যদিও আমি একই সমস্যার মুখোমুখি হয়েছিলাম তাই আমি আমার উত্তরটি ভাগ করব। নিম্নলিখিত স্ক্রিপ্টটি সমস্ত টেবিল, বৈশিষ্ট্য শ্রেণি এবং সম্পর্কের কোনও ডেটাসেটে অনুলিপি করতে হবে এবং ডেটাসেটের মধ্যে বৈশিষ্ট্য শ্রেণি, টপোলজি ইত্যাদি সহ সমস্ত ডেটাসেটের অনুলিপি করতে হবে। এটি অনুলিপি অনুলিপি চলতে থাকা যে কোনও ত্রুটি এড়ানো হবে। এটি এমন একটি লগ ফাইল তৈরি করবে যাতে উত্স ডিবি আইটেম গণনা এবং গন্তব্য আইটেমের গণনা সম্পর্কিত ডেটা থাকে যাতে আপনি অনুলিপিটি তুলনা করতে পারেন এবং এটির সাথে দেখা হওয়া ত্রুটিগুলিও লগ করবে।

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 ব্যবহার করে পরীক্ষা করেছি। এছাড়াও, একটি বিষয় লক্ষণীয়, আমি এই স্ক্রিপ্টটি ব্যবহার করে এমন কারও সাথে কথা বলছিলাম এবং অনুপযুক্ত অনুমতি এবং খালি সারণীর কারণে তারা নির্দিষ্ট ডেটাসেটগুলি অনুলিপি করে একটি ত্রুটি নিয়ে একটি সমস্যার মধ্যে পড়েছিল।

লেমুর - অবজেক্ট আইডির পরিবর্তে কোনও বৈশ্বিক আইডির ভিত্তিতে আপনার সম্পর্ক তৈরি করবেন না কেন? যে আপনার সম্পর্ক সংরক্ষণ করা হবে। আপনি যদি গ্লোবাল আইডি তৈরি না করে থাকেন তবে আমি এটির সুপারিশ করব।

-হালনাগাদ

খারাপ ডেটাবেস সংযোগের পথগুলি এবং আরও ভাল লগিং এবং ত্রুটি পরিচালনার জন্য কোডটিতে আমি আরও কিছু যুক্তি যুক্ত করেছি:

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 টি ভেরিয়েবল আপডেট করেছি। আমি একটি ত্রুটি পেয়েছি ট্রেসব্যাক (সর্বশেষতম কল): ফাইল "সার্ভারপথ \\ কপিএসডিটোজিডিবি.পি", লাইন 90, <মডুল> প্রতিলিপি ডেটাবেস (ডাটাবেস সংযোগ, টার্গেট জিডিবি) ফাইল "সার্ভারপথ \\ কপিএসডিটোজিডিবি.পি", লাইন 55, এ প্রতিলিপি ডেটাবেস ডেটাসেটলিস্ট = [আরকিপি.ডেস্ক্রিপ্ট (ক)। অর্কপিতে একটির জন্য নাম।
কোর্টনি

কোর্টনি - মনে হচ্ছে আপনার ডাটাবেস সংযোগ ভেরিয়েবলের পথে টাইপো বা সামান্য ত্রুটি রয়েছে। এটি একটি ত্রুটি ছুঁড়েছে কারণ এটি 55 নং লাইনে খালি একটি তালিকার উপরে পুনরাবৃত্তি করার চেষ্টা করছে "" ডাটাবেস সংযোগ "ভেরিয়েবলের ভুল পথটি ব্যবহার করে আপনি যে ত্রুটিটি পেয়েছিলেন তা পুনরায় তৈরি করতে সক্ষম হয়েছি। আপনি চলকটিতে প্রকৃত পথটি কী ব্যবহার করেছেন?
পিএমকে

যদি আমি এই রাতে করতে চাই, এটি বিদ্যমান বৈশিষ্ট্যগুলি ওভাররাইট করবে না? আমি কেবলমাত্র বিদ্যমান টার্গেটটি ওভাররাইট করতে চাইলে প্রতিবার একটি নতুন এফজিডি তৈরি করতে চাই না।
NULL.Dude

পিটার যদি লক্ষ্য জিডিবি বিদ্যমান থাকে তবে স্ক্রিপ্টটি ব্যর্থ হয়
নুল ডুড

2

আমি উপরের পিটার-এর অনুরূপ স্ক্রিপ্ট ব্যবহার করেছি এবং শুভকামনা পেয়েছি, যদিও তার চেয়ে ভাল। কারও কাছে ভ্রমণ করতে পারে এমন একটি বিষয় হ'ল যদি আপনি bit৪ বিট পাইথন জিওপ্রসেসিং ব্যবহার করে থাকেন এবং আপনার যদি ESR এর উপরে আরকিএফএম লোড করা থাকে তবে এটি ERROR 000260 দিয়ে আরকিএফএম বা ডিজাইনার ব্যবহারের জন্য সেট করা সমস্ত বৈশিষ্ট্যে ব্যর্থ হবে This কারণ আপনাকে 32 বিট অজগর ব্যবহার করতে হবে বা আরআরএফএম স্টাফগুলি সঠিকভাবে লাইসেন্স করবে না।

32 বিট আরকিপি ব্যবহারের আরও বিশদ বিবরণের জন্য এক্সচেঞ্জের এই থ্রেডে প্রথম দুটি মন্তব্য দেখুন

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


যদি এই দুটি মন্তব্য এই প্রশ্নের উত্তর সরবরাহ করে তবে তাদের বিষয়বস্তুগুলি এখানে উদ্ধৃত বা সংক্ষিপ্ত করা উচিত এবং কেবল এটির সাথে লিঙ্কযুক্ত করা উচিত নয় - মেটা.স্ট্যাকেক্সচেঞ্জ / সেকশনস / ২২২৩70০/২ দেখুন যদি আপনি ইতিমধ্যে একটি সংক্ষিপ্তসার সরবরাহ করেছেন তবে সম্ভবত "পরিবর্তন" পরীক্ষা করুন এক্সচেঞ্জে এই থ্রেডের প্রথম দুটি মন্তব্য "থেকে" আরও বিশদ বিবরণের জন্য এক্সচেঞ্জে এই থ্রেডের প্রথম দুটি মন্তব্য দেখুন "।
পলিজিও

0

আপনার প্রশাসকের সুবিধাগুলি থাকলে জিও-ডাটাবেস ভাইস বিপরীতে ফাইল রফতানি করতে বা আমদানির জন্য সহজ অনুলিপি এবং পেস্ট কমান্ডগুলি ব্যবহার করতে পারেন এবং আরও তথ্যের জন্য এখানে একবার দেখুন।


ধন্যবাদ গণেশনারিম - আমি পাইথন ব্যবহার করে প্রক্রিয়াটি স্বয়ংক্রিয় করতে চাই, সুতরাং আর্ককিগ্ল্যাজে কোনও ম্যানুয়াল অনুলিপি / পেস্ট প্রক্রিয়া আমার প্রয়োজনের সাথে খাপ খায় না। আমার এই পদ্ধতির সাথেও সীমিত সাফল্য ছিল, যেমন মনে হয় (আরকম্যাপ 10.1 তে) একটি এসডিই অনুলিপি করা একই ডাটাবেসের সাথে অন্য একটি লিঙ্ক তৈরি করে (যেখানে যদি এই একই কৌশলটি কোনও ফাইল বা ব্যক্তিগত জিওডাটাবেজে ব্যবহৃত হত তবে একটি অনুলিপি তৈরি করা হত)
ক্রাউসার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.